🐴

Github Workflow で compositeを使って再利用性を高める - slack編

2021/12/01に公開

やりたいこと

workflowの中で繰り返される内容を再利用したい🐴
今回はslackの通知を使ってみました🐴

やること

  1. リポジトリに.github/actions/<任意のディレクトリ名>/action.ymlを追加
  2. action.ymlの内容追加
  3. 既存の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です🐴

1. リポジトリに.github/actions/<任意のディレクトリ名>/action.ymlを追加

今回はslackで通知するので、ディレクトリ名はslackにしました🐴

2. action.ymlの内容追加

action.ymlに移動した時に注意するのが

  1. secretsは使用できないので、inputsで受け取るようにする
  2. 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で定義できるようにするっぽい意図はドキュメントにあるので、今後に期待です🐴

現場からは以上です🐴

GitHubで編集を提案

Discussion