Dockerコンテナ内でのPowerShell活用法~CI/CDパイプラインの自動化を効率化~

ソフトウェアの開発とデプロイの迅速化は、現代の開発環境において欠かせない要素です。特に、コンテナ技術を使って仮想環境を構築し、複数の環境で同じように動作するようにするDockerは、開発者にとって非常に便利なツールです。その中でもPowerShellを活用することで、CI/CDパイプラインの自動化をより効率的に進めることが可能です。

本記事では、Dockerコンテナ内でPowerShellを使う方法に焦点を当て、特にCI/CD(継続的インテグレーションと継続的デリバリー)パイプラインの自動化について解説します。

PowerShellとDockerの組み合わせのメリット

Dockerコンテナ内でPowerShellを利用することで以下のような利点が得られます。

  1. クロスプラットフォームの自動化:PowerShell Core(7.0以降)はWindowsだけでなくLinux、macOSでも動作するため、Dockerコンテナ上でも同様にスクリプトを活用できます。
  2. 設定の簡素化:PowerShellスクリプトを活用することで、複雑なビルド・デプロイ設定を自動化し、手動作業を最小化できます。
  3. 柔軟なスクリプト実行:Docker上で様々なタスク(環境設定、テスト実行、デプロイ)をPowerShellスクリプトでまとめて実行可能です。

DockerコンテナでPowerShellを使う準備

PowerShellをDockerコンテナ内で使用するには、以下の手順でPowerShellをインストールします。

Dockerfileの作成: Dockerfileを使ってPowerShellをインストールしたコンテナイメージをビルドします。

   # ベースイメージとしてUbuntuを使用
   FROM ubuntu:latest

   # PowerShellのインストールに必要な依存パッケージをインストール
   RUN apt-get update && apt-get install -y wget apt-transport-https software-properties-common

   # Microsoftの公式PowerShellリポジトリを追加
   RUN wget -q "https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb" -O packages-microsoft-prod.deb && \
       dpkg -i packages-microsoft-prod.deb && \
       apt-get update && \
       apt-get install -y powershell

   # PowerShellの起動コマンド
   CMD ["pwsh"]

Dockerイメージのビルド: ターミナルで以下のコマンドを実行し、Dockerイメージをビルドします。

   docker build -t my-powershell-image .

コンテナの起動とPowerShellの実行: 以下のコマンドでコンテナを起動し、PowerShellを実行します。

   docker run -it my-powershell-image pwsh

CI/CDパイプラインの自動化におけるPowerShellの活用

CI/CDパイプラインの自動化には以下のプロセスが含まれます。

  • コードのビルド
  • テストの実行
  • ビルド成果物の生成
  • デプロイ

1. コードのビルド

PowerShellスクリプトでビルド処理を自動化することで、ビルド手順を一貫して実行できます。以下は簡単なビルドスクリプトの例です。

# BuildScript.ps1
Write-Output "ビルドを開始します..."
# ビルドコマンドを実行
dotnet build /path/to/project
Write-Output "ビルドが完了しました。"

2. テストの自動化

テストも同様にPowerShellで自動化可能です。以下のようにテストを実行して、結果をファイルに保存するスクリプトを作成します。

# TestScript.ps1
Write-Output "テストを実行します..."
# テストコマンドの実行
dotnet test /path/to/project --logger "trx;LogFileName=test_results.trx"
Write-Output "テストが完了しました。"

3. ビルド成果物の生成

ビルド成果物(例えば、パッケージ化されたファイルやDockerイメージ)を生成し、アーティファクトとして保存します。以下は、Dockerイメージのビルドとタグ付けの例です。

# ArtifactBuild.ps1
Write-Output "Dockerイメージをビルドします..."
docker build -t my-app-image /path/to/Dockerfile
Write-Output "ビルドが完了しました。"

4. デプロイの自動化

デプロイもPowerShellスクリプトで管理できます。リモートサーバーへのデプロイやクラウドサービスへのプッシュを自動化する例を示します。

# DeployScript.ps1
Write-Output "デプロイを開始します..."
docker login -u $Env:DOCKER_USERNAME -p $Env:DOCKER_PASSWORD
docker push my-app-image:latest
Write-Output "デプロイが完了しました。"

GitHub Actionsとの統合

PowerShellスクリプトをGitHub Actionsと組み合わせると、リポジトリへの変更に応じて自動的にCI/CDパイプラインを実行できます。以下は簡単な設定ファイルの例です。

name: CI-CD Pipeline

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up PowerShell
        uses: PowerShell/powershell-docker@main
      - name: Run Build Script
        run: pwsh ./BuildScript.ps1
      - name: Run Test Script
        run: pwsh ./TestScript.ps1
      - name: Run Artifact Build Script
        run: pwsh ./ArtifactBuild.ps1
      - name: Deploy to Docker Hub
        env:
          DOCKER_USERNAME: ${{ secrets.DOCKER_USERNAME }}
          DOCKER_PASSWORD: ${{ secrets.DOCKER_PASSWORD }}
        run: pwsh ./DeployScript.ps1

演習問題

以下の演習を通じて、実際にPowerShellスクリプトを利用したCI/CDパイプラインの自動化を体験してみましょう。

演習問題1

Dockerコンテナ内でPowerShellを使用して、GitHubリポジトリからコードをクローンし、ビルド・テスト・デプロイの各処理を自動化するスクリプトを作成してください。

演習問題2

PowerShellで、指定されたパラメータに基づいて異なる環境(開発環境、テスト環境、本番環境)にデプロイするスクリプトを書いてください。

演習問題3

GitHub Actionsを使用して、自分のリポジトリにプッシュされた際に自動的にPowerShellスクリプトを実行し、テスト結果をGitHub上で確認できるCIパイプラインを構築してください。

解答例

解答例1

# Clone-Build-Test-Deploy.ps1
git clone https://github.com/username/repository.git
cd repository
Write-Output "ビルド開始..."
dotnet build
Write-Output "テスト開始..."
dotnet test
Write-Output "Dockerイメージをビルドし、デプロイ..."
docker build -t my-app .
docker push my-app

解答例2

# Deploy-Environment.ps1
param(
    [string]$Environment
)
switch ($Environment) {
    "Development" {
        Write-Output "開発環境へデプロイ中..."
        # 開発用のコマンドを実行
    }
    "Testing" {
        Write-Output "テスト環境へデプロイ中..."
        # テスト用のコマンドを実行
    }
    "Production" {
        Write-Output "本番環境へデプロイ中..."
        # 本番用のコマンドを実行
    }
    default {
        Write-Output "不正な環境指定です。

"
    }
}

解答例3

GitHub Actionsの設定ファイル(.github/workflows/ci-cd.yml)に以下を記述。

name: CI Pipeline
on: [push]
jobs:
  build-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Build
        run: pwsh ./Clone-Build-Test-Deploy.ps1

まとめ

Dockerコンテナ内でPowerShellを活用することで、クロスプラットフォームでのCI/CDパイプラインの自動化を実現できます。

演習問題を通して、PowerShellとDockerを使ったビルド・テスト・デプロイの一連の流れを体験してみてください。