Azure Pipelines で CI パイプラインを構築
プル リクエストでトリガーされ、単体テストを実行してビルド成果物を生成する YAML パイプラインを定義し、portal でテスト結果とコード カバレッジを確認します。
「Azure Pipelines で CI パイプラインを構築」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
継続的インテグレーションとは
継続的インテグレーション(CI)とは、コード変更を共有ブランチに頻繁にマージし、マージのたびにビルドとテストを自動的に実行する手法です。目的は、統合時の失敗を早期に検出し、問題が大きくなって修正困難になる前に対処することです。優れた CI パイプラインは、数分以内にコードをビルドし、単体テストを実行し、コード カバレッジを測定し、静的解析を行って、デプロイ可能なアーティファクトを生成します。Azure Pipelines は、この手法を実現する自動化エンジンを提供します。
YAML パイプラインの構造
Azure Pipelines の CI パイプラインは、リポジトリのルートにある azure-pipelines.yml ファイルで定義します。YAML ファイルでは、トリガー(実行するタイミング)、プール(使用するエージェントの種類)、およびステージ、ジョブ、ステップの階層構造を指定します。既定では、ステージは順番に実行されます。ステージ内のジョブは、既定では並列に実行されます。ジョブ内のステップは順番に実行されます。この構造により、パイプラインの実行フローをきめ細かく制御できます。
# azure-pipelines.yml skeleton
trigger:
branches:
include:
- main
- 'feature/*'
paths:
exclude:
- docs/**
- '*.md'
pool:
vmImage: ubuntu-latest
variables:
buildConfiguration: Release
nodeVersion: '18.x'
stages:
- stage: CI
displayName: 'Build and Test'
jobs:
- job: Build
displayName: 'Build Application'
steps: []トリガーの構成
Azure Pipelines は、複数の種類のトリガーをサポートしています。ブランチ トリガーは、指定したブランチにコードがプッシュされたときにパイプラインを実行します。プル要求トリガー(PR トリガー)は、対象ブランチに対して PR が作成または更新されたときに実行されます。これは、マージ前にコードを検証するために不可欠です。スケジュール トリガーは、固定時刻(例: 毎晩のビルド)に実行します。パイプライン トリガーを使用すると、パイプラインを連結できます。trigger: noneを指定すると自動実行を無効にし、手動実行だけを許可できます。
# Branch trigger
trigger:
branches:
include: [main, develop]
# Pull request trigger
pr:
branches:
include: [main]
autoCancel: true # Cancel previous runs when PR is updated
# Scheduled trigger (nightly build at 02:00 UTC)
schedules:
- cron: '0 2 * * *'
displayName: 'Nightly Build'
branches:
include: [main]
always: true # Run even if no new commitsステップ: スクリプトとタスク
パイプラインのステップには、スクリプト(bash または PowerShell のコマンド)とタスク(Azure DevOps Marketplace から提供される、あらかじめ構築されたパラメーター化済みの処理単位)があります。NodeTool@0、DotNetCoreCLI@2、Maven@3などのタスクは、一般的なビルド処理をカプセル化します。読みやすいパイプライン ログにするため、すべてのステップで displayName を使用してください。各ステップは順番に実行され、continueOnError: trueを設定しない限り、いずれかのステップがゼロ以外のコードで終了するとパイプラインは失敗します。
steps:
- task: NodeTool@0
displayName: 'Install Node.js 18'
inputs:
versionSpec: '18.x'
- script: npm ci
displayName: 'Install dependencies (clean install)'
- script: npm run lint
displayName: 'Run ESLint'
- script: npm run build
displayName: 'Build production bundle'
- script: npm test -- --ci --coverage
displayName: 'Run unit tests with coverage'テスト結果の公開
テストの実行後、PublishTestResults タスクを使用して結果を Azure DevOps に公開します。Azure Pipelines は、JUnit、NUnit、XUnit、VSTest の結果ファイルを解析し、パイプライン実行の UI に成功数と失敗数、テスト実行時間、個々のテストの詳細を表示します。テスト履歴は時間の経過とともに追跡されるため、不安定なテストやリグレッションを見つけることができます。これは、チーム全体でコード品質を可視化するために不可欠です。
# Example: Node.js project with Jest tests
steps:
- script: npm test -- --ci --reporters=jest-junit
displayName: 'Run tests with JUnit reporter'
env:
JEST_JUNIT_OUTPUT_DIR: '$(Agent.TempDirectory)/test-results'
- task: PublishTestResults@2
displayName: 'Publish test results'
inputs:
testResultsFormat: JUnit
testResultsFiles: '$(Agent.TempDirectory)/test-results/**/*.xml'
condition: succeededOrFailed() # Publish even if tests failコード カバレッジの公開
コード カバレッジ レポートを公開すると、Azure Pipelines のパイプライン UI にカバレッジ率と推移が表示されます。PublishCodeCoverageResults タスクは、Cobertura または JaCoCo 形式のレポートを受け付けます。これをブランチ カバレッジのゲートと組み合わせ、カバレッジの最低しきい値を設定し、それを下回った場合はビルドを失敗させます。カバレッジの推移から、対応するテストが追加されないまま新しいコードが追加されている時期を特定できます。
# Jest + coverage
- script: npm test -- --ci --coverage --coverageReporters=cobertura
displayName: 'Run tests with coverage'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml'
reportDirectory: '$(System.DefaultWorkingDirectory)/coverage'パイプライン変数と変数グループ
パイプラインの構成は、YAML のパイプライン、ステージ、またはジョブのレベルで定義する変数に保存します。API キーやパスワードなどの機密値にはシークレット変数を使用し、パイプライン ライブラリ(UI)または変数グループで設定して YAML から参照します。変数グループは、複数のパイプラインで共有できる再利用可能な変数のコレクションです。変数グループを Azure Key Vault にリンクすると、Key Vault のシークレットをパイプライン変数に自動的に同期できます。
# Reference a variable group in a pipeline
variables:
- group: 'Production-Secrets' # Linked to Azure Key Vault
- name: buildConfiguration
value: Release
# Use a variable
steps:
- script: echo 'Building $(buildConfiguration) configuration'
- script: az webapp deploy --src-path drop.zip
env:
AZURE_SUBSCRIPTION_ID: $(AZURE_SUBSCRIPTION_ID) # From Key Vault
APP_API_KEY: $(APP_API_KEY) # Secret, not printed in logsアーティファクト: ビルド出力のパッケージ化
ビルドが成功したら、出力をパイプライン アーティファクトにパッケージ化して、後続のステージ(デプロイなど)からアクセスできるようにします。PublishPipelineArtifactを使用して、ビルド エージェントから Azure DevOps のアーティファクト ストレージにファイルをアップロードします。後のステージまたはジョブでは、DownloadPipelineArtifactを使用してアーティファクトを取得します。これにより、ビルド ジョブとデプロイ ジョブを分離でき、異なるエージェントやステージで実行できるようになります。
# Publish build artifact
- task: PublishPipelineArtifact@1
displayName: 'Publish build artifact'
inputs:
targetPath: '$(System.DefaultWorkingDirectory)/dist'
artifactName: webapp-drop
publishLocation: pipeline
# In a later deployment job, download the artifact
- task: DownloadPipelineArtifact@2
inputs:
artifactName: webapp-drop
targetPath: '$(Pipeline.Workspace)/drop'
- script: ls -la $(Pipeline.Workspace)/drop高速なビルドのための並列ジョブ
ステージ内に複数のジョブを定義すると、独立したタスクを並列で実行できます。たとえば、単体テストとセキュリティ スキャンを順番にではなく同時に実行できます。並列ジョブには別々のビルド時間が必要ですが、パイプライン全体の所要時間を大幅に短縮できます。dependsOn プロパティを使用すると、ジョブの開始前に 1 つ以上の他のジョブが完了するまで待機させることができ、ステージ内に依存関係グラフを作成できます。
stages:
- stage: CI
jobs:
- job: UnitTests
displayName: 'Run unit tests'
steps:
- script: npm test
- job: LintAndSecurity
displayName: 'Lint and security scan'
steps:
- script: npm run lint
- script: npm audit --audit-level=high
- job: BuildArtifact
displayName: 'Build and publish artifact'
dependsOn: [UnitTests, LintAndSecurity]
condition: succeeded('UnitTests') and succeeded('LintAndSecurity')
steps:
- script: npm run buildブランチ ポリシーによるビルド検証
CI パイプラインを Azure Repos のブランチ ポリシーにリンクすると、mainを対象とするプル要求でビルド検証チェックとして自動的に実行できます。パイプラインが成功するまでマージはブロックされます。複数のチェックを組み合わせることもできます。CI パイプラインが成功していること、2 人以上のレビュアーが承認していること、すべてのコメントが解決済みであること、リンクされた作業項目が存在することを必須にできます。これにより、壊れたコードを main ブランチにマージできない品質ゲートを作成できます。
# Add build validation via CLI
az repos policy build create \
--blocking true \
--branch main \
--branch-match-type exact \
--build-definition-id <pipeline-id> \
--display-name 'CI Build Validation' \
--enabled true \
--project MyProject \
--repository-id <repo-id> \
--queue-on-source-update-only true \
--manual-queue-only false \
--valid-duration 720 # Pipeline result expires after 12 hoursパイプライン実行結果の確認
パイプラインの実行が完了したら、Azure DevOps ポータルで結果を確認します。Summary タブには全体の成功または失敗と所要時間が表示されます。Tests タブには、結果でフィルターできるすべてのテスト結果が一覧表示されます。Code Coverage タブにはカバレッジ率が表示され、カバレッジされていない行が強調表示されます。任意のジョブをクリックすると、ステップごとのログ出力を確認できます。失敗したパイプラインでは、失敗したステップが赤色で強調表示され、迅速な診断のためにエラー出力全体が表示されます。
# View pipeline run results via CLI
az pipelines runs list \
--pipeline-ids <pipeline-id> \
--project MyProject \
--query '[].{id:id, status:status, result:result, startTime:startTime}' \
-o table
# View logs from a specific run
az pipelines runs logs list \
--run-id <run-id> \
--project MyProject理解度チェック
このレッスンで扱った Microsoft Azure Fundamentals(AZ-900)の概念について、理解度を確認します。
レッスンのまとめ
このレッスンでは、Azure Pipelines YAMLによって、ビルド、テスト、アーティファクト作成のためのステージ、ジョブ、ステップを備えた CI パイプラインを定義できること、PR トリガーとブランチ ポリシーによって、壊れたコードのマージを阻止する品質ゲートを適用できること、そしてPublishTestResults と PublishCodeCoverageResultsタスクによって、チーム全体でテスト品質を可視化できることを学びました。次は、Azure への継続的デプロイについて学びます。
よくある質問
「Azure Pipelines で CI パイプラインを構築」レッスンは無料ですか?
はい。「Azure Pipelines で CI パイプラインを構築」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
「Azure Pipelines で CI パイプラインを構築」で何を学びますか?
プル リクエストでトリガーされ、単体テストを実行してビルド成果物を生成する YAML パイプラインを定義し、portal でテスト結果とコード カバレッジを確認します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cloud & IT Cert Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「Azure Pipelines で CI パイプラインを構築」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?
はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Azure DevOps Services の概要
- Azure Pipelines で CI パイプラインを構築
- Azure への継続的デプロイ
- Azure での GitHub Actions