Azure PipelinesへtagをpushしてBuildとReleaseさせたい


今回はAzure Pipelinesで以下のようにするのがゴールです。

  • v1.0.0 といったvで始まるタグがpushされたとき、ビルドとリリースを行う
  • masterブランチがpushされたとき、ビルドのみ行う
  • 他のブランチはpushされても何もしない

やっていきましょう。

Build

see: https://docs.microsoft.com/ja-jp/azure/devops/pipelines/build/triggers

Pipelinesでは「Build」を行う必要があります。その際に何をトリガーにするかを設定する事が出来ます。

v1.0.0等のvで始まるタグとmasterブランチの変更でトリガさせる場合のyamlファイルの設定例です。

azure-pipelines.yml
trigger:
  branches:
    include:
    - refs/tags/v*
    - master

なお、pull requestについてはこの辺りに書かれていますが、今回は触れません。(よくわからない)

Release

次にビルドで作成した成果物をどのようにリリースするかをReleaseで定義していきます。こっちは画面上で作る必要があります。。。

なお、Stagesは今回は関係ないので触れません。

まずはArtifactsを決めます。

Default VersionをLatestにしておきます。これでビルドが行われるたびに出来上がる成果物をトリガーに動くようになります。
(それ以外はよくわかっていない。PipelinesのBuildに対してもgitのタグではない別のタグがつけれるようなので、それに関するフィルター条件だと思われる。)

しかし、これだけだとmasterブランチのビルドにも反応してしまうので、次の設定でタグが付いたもののみを行うようにします。

Artifactsのトリガー(?)の設定です。雷のマークを押してメニューを出します。

  • 「Continuous deployment trigger」を有効化にする
  • 「Continuous deployment trigger」のBuild branch filtersのBuild Branchのところをrefs/tags/v*としておく

これでvで始まるタグについてBuildがうまくいったときだけReleaseの処理を行うようになります。
masterブランチはBuildは行われるがReleaseは行われず、他のブランチ・タグは何も起きないようになります。

以上です。

おまけ:ビルドに関する情報を埋め込む

もし成果物にビルド番号を埋め込みたい場合、以下の環境変数があるので使えるかもしれない。

see: https://docs.microsoft.com/ja-jp/azure/devops/pipelines/build/variables

環境変数 意味
BUILD_SOURCEBRANCHNAME ブランチ名/タグ名 master, v1.0.0
BUILD_SOURCEBRANCH ブランチ名/タグ名 refs/tags/v1.0.0
BUILD_SOURCEVERSION コミットID b995561c1e...
BUILD_BUILDNUMBER ビルド番号(日付.連番) 20190201.7
BUILD_BUILDID ビルド番号(シーケンス) 30
SYSTEM_PIPELINESTARTTIME ビルド開始日時 2019-02-01 14:26:56+00:00

後はBuild時にこの環境変数を使ってファイルに書き出すような事を行う。

以下は雑だけどHostedなubuntuイメージに入っているenvsubstを使うやり方です。

まず置き換えもとになるファイルを用意します。今回はPythonで定数を並べたファイルを作る事にします。
envsubstで環境変数の値に置き換えたい箇所を$環境変数名(例:$BUILD_BUILDNUMBER)というように書いていきます。

buildinfo.py
# Don't touch me!!
BUILDNUMBER="$BUILD_BUILDNUMBER"
SOURCEVERSION="$BUILD_SOURCEVERSION"
SYSTEM_PIPELINESTARTTIME="$SYSTEM_PIPELINESTARTTIME"

後は以下のようなビルドのタスクを書きます。
一時ファイルで書き出して、envsubstで置き換えたファイルで上書きして、一時ファイルを削除する、という事をやってます。

ファイルパスとかファイル名はいい感じに調整します。

- script: cp buildinfo.py buildinfo.py.temp && envsubst < buildinfo.py.temp > buildinfo.py && rm buildinfo.py.temp
  displayName: 'Write buildinfo.py'

すると、以下のようなファイルで書きだされます。

buildinfo.py
# Don't touch me!!
BUILDNUMBER="20190201.7"
SOURCEVERSION="b995561c1e..."
SYSTEM_PIPELINESTARTTIME="2019-02-01 14:26:56+00:00"

あとはメインのコードでこんな感じで使います。

import buildinfo
buildinfo.BUILDNUMBER # "20190201.7"

ローカルで開発中は 置き換え前の文字 $BUILD_BUILDNUMBER と出てしまうのでちょっと残念。良いやり方があれば是非…