Azure DevOpsのPipelines ymlまとめ

Azure DevOpsのPipelines ymlまとめ


はじめに

Azure DevOps の Pipelines におけるよく使う処理・タスクの書き方をまとめます。(随時追加予定)

MS のドキュメント、探しにくいんよな・・・

こんなんあるし、英語で探したほうがいいと思います。

alt text

前提

ubuntu を想定しています。

Windows や Mac は対象外です。(動くかもしれませんが、私は未検証です。)

セキュアファイルダウンロード

Library 画面の Secure files にアップロードしたファイルをダウンロードできます。

steps:
  - task: DownloadSecureFile@1
    name: secureFileTask
    inputs:
      secureFile: ".env.dev"
  - script: |
      ls -al $(secureFileTask.secureFilePath)

yml を分割し、共通化したい

使いまわしたいときに。

参照元

extends:
  template: template/common-cicd.yml # 参照元から見たパス
  parameters:
    val1: "hoge"

参照先

parameters:
  - name: val1
    type: string

variables:
  VAL1: ${{ parameters.val1 }}

stages:
  - stage: TEST_STAGE
# 以降省力

パラメータを渡せるので、環境によってアクセス先などの設定を変えたい場合に使えます。

ステージに依存関係を追加する

stages:
  - stage: Test
  - stage: DeployUS1
    dependsOn: Test # Testの後に実行
  - stage: Test2
  - stage: DeployUS2
    dependsOn: [DeployUS1, DeployUS2] # 複数指定OK

条件を追加する

ステージ、ジョブ、ステップのそれぞれで条件を追加できます。

- stage: Test
  dependsOn: [PreTest]
  condition: succeeded()
  variables:
    HAS_HOGE: $[ stageDependencies.PreTest.hoge.outputs['hogehoge.HAS_HOGE'] ]
  jobs:
    - job: Fuga
      pool: { vmImage: "ubuntu-latest" }
      condition: eq(variables['HAS_HOGE'], 'true') # ステージ跨ぎの変数をステージ条件には使えないようなので、ジョブ条件で使うパターン
      steps:
        - task:
          condition: succeeded()

条件に使用する式(eq、ne など)はこちらを参照

日本語ページは酷い。

変数を別ステージで使いたい

出力方法

$HOGE1="1"
echo "##vso[task.setVariable variable=HOGE2;isOutput=true]$HOGE1"

参照方法

- stage: TEST
  dependsOn: HOGE # 依存指定がないと取得されない
  variables:
    HOGE2: $[ stageDependencies.STAGE_NAME.JOB_NAME.outputs['task_name.HOGE2'] ]

isOutput=trueが重要になります。

これがないと別ステージで参照できません。

STAGE_NAME、JOB_NAME は変数出力した stage と job の名称を指定します。

ビルド成果物を発行し、ダウンロードする

# 発行
steps:
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: hoge/fuga.json # フォルダーまたはファイル パス。 デフォルト $(Build.ArtifactStagingDirectory)
    ArtifactName: fuga
    publishLocation: 'Container'
# ダウンロード
steps:
  - download: current
    artifact: fuga
    displayName: download fuga
    continueOnError: true # エラーでも続ける

# 別ステージでの成果物をダウンロードする場合は、依存に追加
stages:
- stage: Test
  jobs:
    job: build
    pool: {vmImage: 'ubuntu-latest'}
    steps:
      - publish: hoge/fuga.json
        artifact: fuga
- stage: DeployUS1
  dependsOn: Test
  jobs:
    job: build
    pool: {vmImage: 'ubuntu-latest'}
    steps:
    - download: current
      artifact: fuga
      displayName: download fuga

スクリプトで AWS クレデンシャルを使用する

variables:
  AWS_CREDENTIAL: 'aws-credential' # Azure DevOpsのServiceConnectionに登録した名前
  AWS_REGION: 'ap-northeast-1'

# ~~~省略~~~

- task: AWSShellScript@1
  displayName: AWS Work
  inputs:
    awsCredentials: $(AWS_CREDENTIAL) # 変数OK
    regionName: $(AWS_REGION)
    scriptType: 'inline'
    inlineScript: |
      # 作業ディレクトリは通常のScriptと同じ
      pwd
      # profileの指定なしでOK
      # aws cliコマンド s3やssmなど

AWS コマンドを実行する

単発のコマンド実行であれば、こちらも使えます。

awsCommand、awsSubCommand、awsArgments は CLI での入力と同じです。

- task: AWSCLI@1
  displayName: put param
  inputs:
    awsCredentials: $(AWS_CREDENTIAL)
    regionName: $(AWS_REGION)
    awsCommand: ssm
    awsSubCommand: put-parameter
    awsArgments: --name "app/dev/latest-version" --type String --value "1.0.0" --overwrite

@1 とありますが、こちらはタスクのメジャーバージョンなので、AWS CLI が v1 というわけではないそう。

ubuntu(22.04)では AWS CLI は v2 が入っています。

心配であれば、aws --versionをタスク内で実行してみるといいと思います。