CodePipelineのステージ間で変数を受け渡しする

この記事は弥生 Advent Calendar 2020 の10日目の記事です。

こんにちは。@kosappi です。最近は SRE としてインフラの改善に取り組んでいます。

Misoca 開発チームでは AWS を利用してインフラを構築しています。 AWS CodePipeline で使える変数の受け渡しが便利だったので、今回はこれを紹介します。

CodePipeline の基本機能について知りたい方は AWS による CodePipeline の紹介をご覧ください。

AWS CodePipeline(継続的デリバリーを使用したソフトウェアのリリース)

CodePipeline における変数の受け渡し

CodePipeline では各アクションの成果物をアーティファクトでやりとりできます。 近頃は、これに加えて「変数」という成果物も扱えるようになっています。

参考: AWS CodePipeline で実行中のアクション間での変数受け渡しが可能に

なお、AWS から提供されている変数についての資料は下記の2つです。

まとめ

  • アクションは変数を作成することができる
    • アクションによっては作成できない場合もある(後述)
  • 変数を作成するには名前空間を指定する必要がある
    • アクション毎に名前空間が必要
    • 名前空間が指定されていない場合は参照することができない
  • 作成された変数は #{NAMESPACE.VARIABLE_NAME} で参照できる

変数を作成することができるアクション

下記のアクションではユーザが変数を作ることができます。

  • CodeBuild
  • AWS CloudFormation
  • Lambda

上記以外のアクションではユーザは新たに変数を作ることはできず、定義済み変数のみ利用できます。 どのような変数が利用可能かは公式のドキュメントに一覧で載っています。

パイプラインアクションで使用できる変数

なお、定義済み変数を利用する場合でも名前空間の指定は必要です。

変数を下流ステージに提供する(CodeBuildの場合)

それでは、実際に CodeBuild で変数を下流ステージに提供していきましょう。 全体のイメージはこんな感じです。

f:id:rkosaka:20201207172506p:plain
パイプライン全体図

名前空間を指定する

名前空間を指定します。 コンソールからだと、ここにあります。

f:id:rkosaka:20201207173137p:plain
CodeBuild設定画面

CLI や terraform 等からもできますが、ここでは割愛します。 今回は CodeBuildVariables という名前空間にします。

buildspec 内で変数を作成する

buildspec 内で変数を作成するには env/exported-variables を利用します。 env では他にも変数を指定できますが、下流ステージから参照できるのは exported-variables のみです。

今回は BUILT_IMAGE_TAG という変数を作ります。 ここにビルドする際のタグ名を書いて、下流ステージでタグを使えるようにするイメージです。

version: 0.2

env:
  exported-variables:
    - BUILT_IMAGE_TAG
phases:
  pre_build:
    commands:
      - ...
      - TZ=Asia/Tokyo date +"%Y-%m-%d-%H-%M-%S" > ./TIMESTAMP
      - export BUILT_IMAGE_TAG=FUGAFUGA.`cat TIMESTAMP`
      - ...
  build:
    commands:
      - ...
      - docker build -t $BUILT_IMAGE_TAG -f ./Dockerfile .
      - docker push $BUILT_IMAGE_TAG
      - ...
  post_build:
    commands:
      - ...
artifacts:
  files:
    - ...

提供されている変数を参照する

下流のステージでは変数を参照するには #{NAMESPACE.VARIABLE_NAME} のように書きます。 今回は名前空間が CodeBuildVariables で変数名は BUILT_IMAGE_TAG なので #{CodeBuildVariables.BUILT_IMAGE_TAG} と書けば参照できます。

この書式で各種項目を書いてあげれば、動的に値を指定することができます。

例えば、CodeBuild の編集画面では、環境変数に上流から提供された変数を指定することができます。

f:id:rkosaka:20201208150938p:plain
上流ステージの変数を指定する

最後に

CodePipeline の隠れた(と個人的には思っている)便利機能である、変数を紹介しました。 ステージ間で情報をリレーしたいけど、アーティファクトでは立派すぎる...という場面で重宝するのではないでしょうか?

余談ですが、今回紹介した変数についてのドキュメントの日本語訳が非常に読み辛い状態になっています。 なんとなく、機械翻訳したものがそのまま使われているような気配を感じるのですが...。

変数の操作

宣伝

Misoca 開発チームでは AWS の便利な機能を使ってインフラを改善してくれるエンジニアを募集しています。