🐴
Github Workflow で compositeを使って再利用性を高める - slack編
やりたいこと
workflowの中で繰り返される内容を再利用したい🐴
今回はslackの通知を使ってみました🐴
やること
- リポジトリに
.github/actions/<任意のディレクトリ名>/action.yml
を追加 - action.ymlの内容追加
- 既存のworkflowのstepsを置き換え
サンプルworkflow
今回再利用してみるworkflowの内容です🐴
デプロイを完了すると、slackに通知する流れになります。
成功しても、失敗しても、slackにはメッセージを通知するのですが
メッセージが違うだけです。
これをcompositeを使用して、再利用性を高めてみます🐴
.github/workflows/deploy.yml
# name, on省略
env:
SUCCESS_MESSAGE: デプロイ完了しました
FAILED_MESSAGE: デプロイ失敗しました
SLACK_ICON: https://sample.png
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
#詳細省略
continue-on-error: true
notify-slack:
needs: deploy
if: ${{ always() }}
name: Notify Slack
runs-on: ubuntu-latest
steps:
- name: Success notification
if: ${{ needs.deploy.result == 'success' }}
uses: rtCamp/action-slack-notify@master
env:
SLACK_CHANNEL: sample-channel
SLACK_USERNAME: Github Actions
SLACK_ICON: ${{ env.SLACK_ICON }}
SLACK_COLOR: good
SLACK_TITLE: ${{ github.repository }}
SLACK_MESSAGE: ${{ env.SUCCESS_MESSAGE }}
SLACK_FOOTER: ${{ github.workflow }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
- name: Failed notification
if: ${{ needs.deploy.result == 'failure' }}
uses: rtCamp/action-slack-notify@master
env:
SLACK_CHANNEL: sample-channel
SLACK_USERNAME: Github Actions
SLACK_ICON: ${{ env.SLACK_ICON }}
SLACK_TITLE: ${{ github.repository }}
SLACK_FOOTER: ${{ github.workflow }}
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_COLOR: danger
SLACK_MESSAGE: ${{ env.FAILED_MESSAGE }}
ポイントは、Github Actionsでのyml記法はアンカーがサポートされていないので
同じ内容を複数回記述しないといけません💦
これはissueでも取り上げられていますが、長い間改善されないのですが、それの救世主となったのがcompositeです🐴
.github/actions/<任意のディレクトリ名>/action.yml
を追加
1. リポジトリに今回はslackで通知するので、ディレクトリ名はslackにしました🐴
2. action.ymlの内容追加
action.ymlに移動した時に注意するのが
- secretsは使用できないので、inputsで受け取るようにする
- shellを使用しているときは、shellを指定しないといけない
今回は、shellを使用していないので、2は不要です🐴
-
SLACK_WEBHOOK
を secrets → inputs に変更しました -
github.~
は,CI上で使用できる変数みたいなものです(コンテキスト) -
using: 'composite'
を宣言してるのが特徴的ですね - デフォルト値を設定できるので、変更したい値だけ渡せばよくなりました🐴
.github/actions/slack/action.yml
name: Notify Slack
description: Notify Slack
inputs:
slack_icon_url:
description: Slack icon
default: https://sample.png
required: false
message:
description: Message
default: デプロイ完了しました 💯
required: false
color:
description: Color
default: good # good, danger, warning
required: false
runs:
using: 'composite'
steps:
- name: Success notification
uses: rtCamp/action-slack-notify@master
env:
SLACK_CHANNEL: pcm-system
SLACK_USERNAME: Github Actions
SLACK_ICON: ${{ inputs.slack_icon_url }}
SLACK_COLOR: ${{ inputs.color }}
SLACK_TITLE: ${{ github.repository }}
SLACK_MESSAGE: ${{ inputs.message }}
SLACK_FOOTER: ${{ github.workflow }}
SLACK_WEBHOOK: ${{ inputs.SLACK_WEBHOOK_URL }}
3. 既存のworkflowのstepsを置き換え
.github/workflows/deploy.yml
# name, on省略
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
#詳細省略
continue-on-error: true
notify-slack:
needs: deploy
if: ${{ always() }}
name: Notify Slack
runs-on: ubuntu-latest
steps:
- name: Notify Success
uses: ./.github/actions/slack
if: ${{ needs.deploy.result == 'success' }}
with:
slack_webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}
- name: Notify Failed
if: ${{ needs.deploy.result == 'success' }}
with:
message: デプロイ失敗しました 💣
color: danger
slack_webhook_url: ${{ secrets.SLACK_WEBHOOK_URL }}
だいぶすっきりしました。
デフォルトのメッセージが成功時に合わせているので、withで指定しているのは失敗時のmessageとcolorだけで済みました🐴
action.ymlでもsecretsが渡せれば、もっと便利になりそうですが、今現在はできないそうです。
今後secretsもaction.ymlで定義できるようにするっぽい意図はドキュメントにあるので、今後に期待です🐴
現場からは以上です🐴
Discussion