🤖

BitriseからのSlack通知にBuildにかかった時間を表示させる

2022/04/11に公開

FlutterアプリのCI/CDをBitriseで組んでおり、Build完了後にSlack通知を飛ばすようにしています。
環境変数を利用することで通知情報にBuild番号やアプリ名などの情報を表示させることができます。

https://devcenter.bitrise.io/ja/references/available-environment-variables.html#ot-lst-cnt

ただBitrise内のレポートで確認できるようなDuration Total runtime にあたるBuildにかかった時間を通知する環境変数は無さそうでした。
Flutterアプリ開発では特にiOS/Android両方のBuildを行うため、Buildにかかった時間が気になり毎回Bitrise内で確認していました。


また $BITRISE_BUILD_TRIGGER_TIMESTAMP からBuild開始時のタイムスタンプを取得することはできますが、これをそのまま表示させてもタイムスタンプ文字列のためユーザーフレンドリーでない1970年1月1日からの秒数が表示されてしまいます。そのため日本時間に変換して表示させる必要があります。

開始時間終了時間 がわかれば Buildにかかった時間 が出力できるだろうとすぐわかったものの 終了時間 の出力方法がわからず、またyamlの文法やシェルスクリプトにあまり親しんでいないため大変そうだなとしばらく放置していたのですが、以下の記事を参考に「対応できそう!」と思いやってみました。

https://discuss.bitrise.io/t/output-friendly-date-time-in-build-steps/1922
https://devcenter.bitrise.io/ja/builds/environment-variables.html#envvarの値でのenvvarの使用

1. Generate timestamps

https://www.bitrise.io/integrations/steps/timestamp
完了時間として使いたいので Generate timestamps Step をworkflowの最後の方(Send a Slack message Stepより前)に追加して 環境変数 $UNIX_TIMESTAMPを出力し、後続Stepで使えるようにします。

2. Do anything with Script

https://www.bitrise.io/integrations/steps/script
タイムスタンプを加工して表示させるためにシェルスクリプトを実行したいので Generate timestamps Step の次に Do anything with Script step を追加します。

こちらでも Run if previous Step failed 項目にチェックをいれ、
# write your script here のところに以下のスクリプトを記述します

# write your script here
envman add --key=START_TIME --value="$(TZ=UTC-9 date -r $BITRISE_BUILD_TRIGGER_TIMESTAMP +"%Y-%m-%d %H:%M:%S")"
envman add --key=END_TIME --value="$(TZ=UTC-9 date -r $UNIX_TIMESTAMP +"%Y-%m-%d %H:%M:%S")"
envman add --key=TOTAL --value="$(date -r $(($UNIX_TIMESTAMP - $BITRISE_BUILD_TRIGGER_TIMESTAMP)) +"%T")"

内容としては以下の通りです。

  • 環境変数 $BITRISE_BUILD_TRIGGER_TIMESTAMP (開始時刻)を日本時間に変換して環境変数 $START_TIME に代入
  • 環境変数 $UNIX_TIMESTAMP (完了時刻)を日本時間に変換して環境変数 $END_TIME に代入
  • $UNIX_TIMESTAMP から$BITRISE_BUILD_TRIGGER_TIMESTAMP のを引いた値(秒数)を00:00:00 の形式に変換して 環境変数 $TOTAL に代入

参考記事

https://qiita.com/ko1nksm/items/e61728f863c1b2bc829d
https://qiita.com/amay077/items/901a04254cd71fa1a957
https://stackoverflow.com/questions/13422743/convert-a-time-span-in-seconds-to-formatted-time-in-shell

3. Send a Slack message

https://www.bitrise.io/integrations/steps/slack
Send a Slack message StepからSlackにWebhookで通知を送信します

A list of fields to be displayed in a table inside the attachment

の箇所に2のStepで作成した環境変数 START_TIME END_TIME TOTAL を 追記します。
※最後にBitriseの環境変数 BITRISE_BUILD_NUMBER も入れています

App|${BITRISE_APP_TITLE}
Branch|${BITRISE_GIT_BRANCH}
Workflow|${BITRISE_TRIGGERED_WORKFLOW_ID}
StartTime|${START_TIME}             // 開始時間
EndTime|${END_TIME}                 // 終了時間
Total|${TOTAL}                      // ビルドにかかった時間
BuildNumber|${BITRISE_BUILD_NUMBER} // ビルド番号

4. Slack channelで表示を確認

無事表示が確認できました!🎊
実作業は調べながら1−2時間程度でしたが、記事を書くのにそれ以上に時間かかってしまいました😇

Finally

この記事であげているBitriseのCI/CDはFlutter大学というコミュニティ内のSlackで実際に運用されています。
https://flutteruniv.com/

アプリが気になった方は以下の記事をご覧ください。またダウンロードして使ってみてください!
https://zenn.dev/hndr/articles/4d66774fd7169d
https://play.google.com/store/apps/details?id=com.musicapp.pod&hl=ja&gl=JP
https://apps.apple.com/jp/app/pod/id1559338636?platform=iphone

Discussion