0Pricing
Azure Fundamentals · レッスン

Azure での GitHub Actions

azure/webapps-deploy action を使用した GitHub Actions で CI/CD ワークフローを再現し、Azure Pipelines より GitHub Actions を選ぶべき状況を理解します。

「Azure での GitHub Actions」はCoddyKit上の無料Azure Fundamentalsレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAzure Fundamentals学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Azure Fundamentalsコースには全4レッスンが含まれています。

GitHub Actionsとは

GitHub Actionsは、GitHubに組み込まれたCI/CDおよび自動化プラットフォームです。ワークフローは、リポジトリの.github/workflows/ディレクトリに保存されたYAMLファイルで定義し、プッシュ、プルリクエスト、リリースなどのGitHubイベントによってトリガーします。GitHub ActionsはGitHubエコシステム(Issue、PR、パッケージ、セキュリティスキャンなど)と深く統合されており、Azureへのビルド、テスト、デプロイなどのタスクに利用できるコミュニティアクションを豊富に提供しています。

GitHub Actionsワークフローの構造

GitHub Actionsのワークフローファイルには、最上位のセクションが3つあります。onではトリガーとなるイベントを定義します。envではグローバル環境変数を設定します。jobsでは1つ以上のジョブを定義し、各ジョブはランナー(GitHubホストまたはセルフホスト)上で実行されます。各ジョブにはステップがあり、run(シェルスクリプト)またはuses(事前に構築されたアクション)のいずれかを使用します。ジョブは既定で並列実行されます。順番に実行する依存関係を作成するにはneedsを使用します。

# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

env:
  NODE_VERSION: '18.x'

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v4
    - uses: actions/setup-node@v4
      with:
        node-version: ${{ env.NODE_VERSION }}
    - run: npm ci
    - run: npm test

GitHub ActionsからAzureへの認証

GitHub ActionsからAzureへの認証には、OpenID Connect(OIDC)を使用する方法が推奨されます。これにより、GitHubに長期間有効なシークレットを保存せずに、短期間有効なトークンを発行できます。Azure App RegistrationまたはManaged IdentityにフェデレーションID資格情報を構成し、GitHubリポジトリとブランチからのアクセスを信頼するように設定します。azure/login@v2アクションを使用して、GitHubのOIDCトークンをAzureアクセストークンと交換します。GitHub Secretsにクライアントシークレットを登録する必要はありません。

# Configure OIDC federated credential in Azure
az ad app federated-credential create \
  --id <AppRegistrationObjectId> \
  --parameters '{
    "name": "github-oidc",
    "issuer": "https://token.actions.githubusercontent.com",
    "subject": "repo:myorg/myrepo:ref:refs/heads/main",
    "audiences": ["api://AzureADTokenExchange"]
  }'

# In the workflow: login via OIDC
# permissions:
#   id-token: write
#   contents: read
# - uses: azure/login@v2
#   with:
#     client-id: ${{ vars.AZURE_CLIENT_ID }}
#     tenant-id: ${{ vars.AZURE_TENANT_ID }}
#     subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

Azure App Serviceへのデプロイ

azure/webapps-deploy@v3アクションは、コードまたはコンテナーイメージをAzure App Serviceにデプロイします。スロットへのデプロイ、パッケージベースのデプロイ、Dockerイメージのデプロイに対応しています。認証にはazure/login@v2を組み合わせます。ステージングスロットを対象にしてスモークテストを実行し、その後、スロットのスワップコマンドを実行するazure/CLI@v2アクションでスワップできます。これにより、Azure PipelinesのブルーグリーンデプロイパターンをGitHub Actionsだけで再現できます。

# .github/workflows/deploy.yml
jobs:
  deploy:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
    - uses: actions/checkout@v4

    - uses: azure/login@v2
      with:
        client-id: ${{ vars.AZURE_CLIENT_ID }}
        tenant-id: ${{ vars.AZURE_TENANT_ID }}
        subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

    - name: Build and zip app
      run: npm ci && npm run build && zip -r app.zip dist/

    - uses: azure/webapps-deploy@v3
      with:
        app-name: myUniqueWebApp
        slot-name: staging
        package: app.zip

Azure Kubernetes Serviceへのデプロイ

GitHub ActionsからAKSにデプロイするには、azure/k8s-deploy@v5アクションを使用します。このアクションはkubectl applyを使用してマニフェストをデプロイし、イメージの置換(イメージタグを現在のビルドのタグに置き換える処理)を行い、ロールアウトの健全性を監視します。azure/aks-set-context@v4アクションは、認証済みのAzureセッションを使用してクラスターのkubeconfigを取得し、kubectlの認証情報を構成します。

jobs:
  deploy-aks:
    runs-on: ubuntu-latest
    permissions:
      id-token: write
      contents: read
    steps:
    - uses: actions/checkout@v4
    - uses: azure/login@v2
      with:
        client-id: ${{ vars.AZURE_CLIENT_ID }}
        tenant-id: ${{ vars.AZURE_TENANT_ID }}
        subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}

    - uses: azure/aks-set-context@v4
      with:
        resource-group: MyRG
        cluster-name: myAKSCluster

    - uses: azure/k8s-deploy@v5
      with:
        namespace: production
        manifests: k8s/
        images: 'mycontainerregistry.azurecr.io/myapp:${{ github.sha }}'

GitHub Secretsと変数

機密性の高い値はGitHub Secretsに保存します。ワークフローでは、暗号化された値を${{ secrets.SECRET_NAME }}として利用できます。機密性のない構成はGitHub Variablesに保存します。値は${{ vars.VARIABLE_NAME }}として利用できます。どちらもリポジトリ、環境、または組織を対象範囲として設定できます。GitHub Actionsの環境を使用すると、Azure DevOps Environmentsと同様に、保護ルール(必須レビュアー、デプロイ対象ブランチなど)を追加できます。

# Reference secrets and variables in a workflow
steps:
- name: Configure app settings
  uses: azure/CLI@v2
  with:
    inlineScript: |
      az webapp config appsettings set \
        --name myUniqueWebApp \
        --resource-group MyRG \
        --settings \
          DATABASE_URL='${{ secrets.DATABASE_URL }}' \
          API_VERSION='${{ vars.API_VERSION }}'

環境の保護ルール

GitHub Actionsの環境(リポジトリのSettings → Environmentsで構成)では、Azure DevOpsの環境と同様のデプロイゲートを追加できます。必須レビュアーを設定し、環境を対象とするジョブの実行前に承認を必須にしたり、デプロイ先を特定のブランチに制限したり(Productionにデプロイできるのはmainだけにするなど)、デプロイを遅延させる待機タイマーを追加したりできます。保護された環境を対象とするジョブは、すべての保護ルールが満たされるまで一時停止します。

# Workflow job targeting a protected GitHub environment
jobs:
  deploy-production:
    runs-on: ubuntu-latest
    environment:
      name: Production           # Must have 2 approvers in GitHub settings
      url: https://myapp.contoso.com
    needs: deploy-staging
    steps:
    - uses: azure/login@v2
      with:
        client-id: ${{ vars.AZURE_CLIENT_ID }}
        tenant-id: ${{ vars.AZURE_TENANT_ID }}
        subscription-id: ${{ vars.AZURE_SUBSCRIPTION_ID }}
    - uses: azure/webapps-deploy@v3
      with:
        app-name: myUniqueWebApp
        package: app.zip

再利用可能なワークフローと複合アクション

GitHub Actionsの2つの機能を使用して、リポジトリ間でCI/CDロジックを重複させないようにします。再利用可能なワークフローでは、あるリポジトリでワークフローを定義し、uses: myorg/shared-workflows/.github/workflows/deploy.yml@mainを使用して他のリポジトリのワークフローから呼び出せます。複合アクションでは、複数のステップをリポジトリに保存された単一のアクションにまとめ、uses: myorg/my-actions/deploy@v1で再利用できます。どちらも、組織全体のCI/CDパイプラインでDRYの原則を推進します。

# Call a reusable workflow from another workflow
jobs:
  deploy:
    uses: myorg/shared-workflows/.github/workflows/deploy-appservice.yml@main
    with:
      app-name: myUniqueWebApp
      slot-name: staging
      package-path: dist/
    secrets:
      AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
      AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
      AZURE_SUBSCRIPTION_ID: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

GitHub ActionsとAzure Pipelines:選択する基準

次のような場合はGitHub Actionsを選択します。コードがGitHubでホストされている、チームがGitHub UIを好む、GitHubのPRチェックやコードスキャンとの緊密な統合が必要、またはオープンソースプロジェクトを構築している(無料利用枠が豊富)場合です。次のような場合はAzure Pipelinesを選択します。Azure Boardsとの統合が必要、高度なテストにAzure Test Plansを使用する、Azure Artifactsのフィード管理が必要、コードがAzure Reposにある、または多くの環境にまたがるゲート付きの複雑なマルチステージリリース管理が必要な場合です。どちらもAzureへのデプロイを同等に適切にサポートしています。

GitHub Actions Marketplace

GitHub Actions Marketplaceには、一般的なタスクに使用できる何千ものコミュニティ製および公式のアクションが登録されています。Microsoftは公式のAzureアクションとして、azure/login、azure/webapps-deploy、azure/aks-set-context、azure/k8s-deploy、azure/CLI、azure/arm-deployなどを公開しています。侵害されたアクションが悪意のあるコードで更新されることによるサプライチェーン攻撃を防ぐため、アクションは必ず特定のバージョンタグ(例:@v3)またはコミットSHAに固定してください。

# Pin actions to specific version (recommended)
- uses: actions/checkout@v4         # Pinned to v4 tag
- uses: azure/login@v2               # Pinned to v2
- uses: azure/webapps-deploy@v3      # Pinned to v3

# Extra security: pin to commit SHA
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683

# Avoid unpinned 'latest' or branch references
# - uses: some-action@main           # UNSAFE - could change at any time

プライベートネットワーク向けのセルフホストランナー

GitHubホストランナーにはパブリックインターネットへのアクセスしかなく、リソースをパブリックに公開しない限り、プライベートなAzureリソース(SQLデータベースや内部APIなど)には接続できません。プライベートリソースにデプロイするには、VNet内のAzure VMでセルフホストランナーを使用します。GitHub Actionsのランナーエージェントをダウンロードし、リポジトリURLと登録トークンを設定してサービスとして実行することで、ランナーを登録できます。Azure Container Appsを使用すると、伸縮可能なランナープールとしてセルフホストランナーをスケーリングできます。

# Register a self-hosted runner on an Azure VM
# 1. Download runner (run on the VM)
curl -O -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz
mkdir actions-runner && tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz -C actions-runner
cd actions-runner

# 2. Configure (use token from GitHub Settings > Actions > Runners)
./config.sh --url https://github.com/myorg/myrepo --token <REGISTRATION_TOKEN>

# 3. Run as a service
sudo ./svc.sh install && sudo ./svc.sh start

# Use in workflow
# runs-on: self-hosted

クイックチェック

このレッスンで扱ったMicrosoft Azure Fundamentals(AZ-900)の概念について、理解度を確認します。

レッスンのまとめ

このレッスンでは、GitHub Actionsのワークフローが.github/workflows/内のYAMLファイルとして定義され、GitHubイベントによってトリガーされてランナー上で実行されること、OIDCフェデレーション資格情報によってGitHub Actionsからシークレットを使わずにAzure認証を行えること、そして保護ルール付きのGitHub Environmentsによって本番デプロイに承認ゲートを追加できることを学びました。これでAzure DevOpsコースは完了です。次はAzure MonitorとLog Analyticsについて学びます。

よくある質問

「Azure での GitHub Actions」レッスンは無料ですか?

はい。「Azure での GitHub Actions」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Azure Fundamentalsコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Azure Fundamentalsコースには全4レッスンが含まれています。

「Azure での GitHub Actions」で何を学びますか?

azure/webapps-deploy action を使用した GitHub Actions で CI/CD ワークフローを再現し、Azure Pipelines より GitHub Actions を選ぶべき状況を理解します。 ブラウザで直接実行するハンズオンコードでAzure Fundamentalsを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Azure Fundamentalsを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAzure Fundamentalsは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「Azure での GitHub Actions」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAzure Fundamentalsレッスンでコードを書いて実行できますか?

はい。すべてのAzure Fundamentalsレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Azure DevOps Services の概要
  2. Azure Pipelines で CI パイプラインを構築
  3. Azure への継続的デプロイ
  4. Azure での GitHub Actions
← Azure Fundamentalsに戻る