🔖

GitHub Actionsの処理結果をメールで通知する: Gmailの使用

2024/01/20に公開

概要

GitHub Actionsの処理結果をメールで通知する機会がありましたので、その備忘録です。

今回はGmailを使います。以下が参考になりました。

https://stackoverflow.com/questions/69947109/sending-email-with-github-actions

Gmailの設定

以下に記載があります。2段階認証を有効にして、アプリパスワードを作成します。

https://github.com/dawidd6/action-send-mail?tab=readme-ov-file#gmail

アプリパスワードの設定例は以下です。

ローカルでの動作確認

actを使って、ローカル環境でGitHub Actionsを実行します。

https://github.com/nektos/act

あるリポジトリで以下のようなファイルを作成します。

.github/workflows/notify.yml
name: Notification Workflow

on: [push]

jobs:
  send-mail:
    runs-on: ubuntu-latest
    steps:

        -   name: Send mail
            if: success() # この行はデプロイが成功した場合にのみメールを送信するようにします
            uses: dawidd6/action-send-mail@v3
            with:
                server_address: smtp.gmail.com
                server_port: 465
                username: ${{secrets.MAIL_USERNAME}}
                password: ${{secrets.MAIL_PASSWORD}}
                subject: Deployment Completed - ${{ github.repository }}
                to: ${{secrets.MAIL_TO}}
                from: ${{ secrets.MAIL_FROM }}
                body: |
                    Hello,
        
                    The deployment process for the repository ${{ github.repository }} has been successfully completed.
        
                    Commit: ${{ github.sha }}
                    Commit link: https://github.com/${{ github.repository }}/commit/${{ github.sha }}
                    Branch: ${{ github.ref }}
    
                    Best regards,
                    ${{ secrets.MAIL_FROM }}

以下のようなコマンドでシークレットを使うことができました。

act push --secret-file .secrets

そのため、以下のようなファイルを用意します。

.secrets
MAIL_USERNAME=xxx@gmail.com
MAIL_PASSWORD=aaaa bbbb cccc dddd
MAIL_TO=abc@example.org,def@example.org
MAIL_FROM=送信者名

結果、以下のようにメールを送信することができました。

% act push --secret-file .secrets
WARN  ⚠ You are using Apple M-series chip and you have not specified container architecture, you might encounter issues while running act. If so, try running it with '--container-architecture linux/amd64'.[Notification Workflow/send-mail] 🚀  Start image=catthehacker/ubuntu:act-latest
[Notification Workflow/send-mail]   🐳  docker pull image=catthehacker/ubuntu:act-latest platform= username= forcePull=true
[Notification Workflow/send-mail] using DockerAuthConfig authentication for docker pull
[Notification Workflow/send-mail]   🐳  docker create image=catthehacker/ubuntu:act-latest platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[]
[Notification Workflow/send-mail]   🐳  docker run image=catthehacker/ubuntu:act-latest platform= entrypoint=["tail" "-f" "/dev/null"] cmd=[]
[Notification Workflow/send-mail]git clone 'https://github.com/dawidd6/action-send-mail' # ref=v3
[Notification Workflow/send-mail] ⭐ Run Main Send mail
[Notification Workflow/send-mail]   🐳  docker cp src=/xxx/.cache/act/dawidd6-action-send-mail@v3/ dst=/var/run/act/actions/dawidd6-action-send-mail@v3/
[Notification Workflow/send-mail]   🐳  docker exec cmd=[node /var/run/act/actions/dawidd6-action-send-mail@v3/main.js] user= workdir=
[Notification Workflow/send-mail]   ✅  Success - Main Send mail
[Notification Workflow/send-mail] 🏁  Job succeeded
Deployment Completed - xxx
xxx <xxx@gmail.com>	2024年1月19日 19:52
To: xxx
Hello,

The deployment process for the repository xxx has been successfully completed.

Commit: xxx
Commit link: https://github.com/nakamura196/ge_editor/commit/xxx
Branch: refs/heads/main

Best regards,

失敗時の挙動確認

失敗時の挙動確認にあたっては、以下のようにrun: exit 1を使うとよいようでした。

.github/workflows/notify.yml
name: Notification Workflow

on: [push]

jobs:
  send-mail:
    runs-on: ubuntu-latest
    steps:

        -   name: Intentional Fail
            run: exit 1

        -   name: Send mail
            if: success() # この行はデプロイが成功した場合にのみメールを送信するようにします
            (省略)

        -   name: Send Failure Mail
            if: failure()
            uses: dawidd6/action-send-mail@v3
            with:
                server_address: smtp.gmail.com
                server_port: 465
                username: ${{ secrets.MAIL_USERNAME }}
                password: ${{ secrets.MAIL_PASSWORD }}
                subject: Deployment Failed - ${{ github.repository }}
                to: ${{ secrets.MAIL_TO }}
                from: ${{ secrets.MAIL_FROM }} # <user@example.com>
                body: |
                    Hello,

                    There was a failure in the deployment process for the repository ${{ github.repository }}.

                    Commit: ${{ github.sha }}
                    Commit link: https://github.com/${{ github.repository }}/commit/${{ github.sha }}
                    Branch: ${{ github.ref }}

                    Please check the GitHub Actions logs for more details.

                    Best regards,
                    ${{ secrets.MAIL_FROM }}

シークレットの登録

ローカル環境での検証が終わったら、変更内容をGitHubにpushします。その際、GitHub CLIのghコマンドを使って、以下のようにシークレットを登録しました。

gh secret set MAIL_USERNAME --body "xxx@gmail.com"
gh secret set MAIL_PASSWORD --body "aaaa bbbb cccc dddd"
gh secret set MAIL_TO --body "abc@example.org,def@example.org"
gh secret set MAIL_FROM --body "送信者名"

まとめ

Slackなどに通知するほうが一般的かと思いますが、参考になりましたら幸いです。

Discussion