Docker + Laravelの環境を作ったので、Github ActionでCI回してSlack通知するまでサクッと作る
前提
- Docker + Laravel + MySQL の環境を構築済み
- ディレクトリ構成
.
├── docker
│ ├── app
│ │ ├── Dockerfile
│ │ └── php.ini
│ └── db
│ ├── Dockerfile
│ └── my.cnf
├── src
│ └── project
└── docker-compose.yml
- コンテナの起動
docker compose up -d
- テスト
docker compose exec app php artisan test
手順
GitHub Action
Actionの設定
.github/workflows/ 以下に workflowsファイルを作成
vim .github/workflows/ci.yaml
GitHub Actionsのドキュメント を参考に
mainブランチにpushしたら、
checkoutして、コンテナの起動して、テストを走らせるワークフローを設定。
name: artisan-test-action
on:
push:
branches:
- main
jobs:
artisan-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: setup
run: |
docker compose up -d
docker compose exec app composer install
- name: test
run: docker compose exec app php artisan test
Action実行確認
変更をmainにpushしてActionが実行されるか
Githubの対象のレポジトリのActionsページを確認する。
エラーとなった。
SQLSTATE[HY000] [2002] Connection refused 対応
上記 Actionだと SQLSTATE[HY000] [2002] Connection refused
が出てエラーとなってしまう。
DBコンテナが起動完了する前に、テストを走らせようとしていることが原因。
こちらを参考に、Dockerコンテナのヘルスチェックを設定する
https://zenn.dev/snowcait/articles/0cc4a464610e61
db:
build:
context: .
dockerfile: ./docker/db/Dockerfile
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
interval: 60s
timeout: 5s
retries: 1
ports:
- 3306:3306
ヘルスチェックが完了するのを待つように
--wait
オプションを付ける
- name: setup
run: |
docker compose up -d --wait
Action正常実行確認
Github Actionによりテストが走り、正常完了することが確認できた。
Slack
Slackアプリの作成
webhookを使うために、Slackアプリの作成
https://api.slack.com/apps
Create an app > From an app manifest
App Manifest の設定画面で以下の内容を入力
display_information:
name: {name}
settings:
org_deploy_enabled: false
socket_mode_enabled: false
is_hosted: false
token_rotation_enabled: false
features:
bot_user:
display_name: {display_name}
oauth_config:
scopes:
bot:
- incoming-webhook
上記画面に遷移するので、
Install to Workspace
ボタン押下、
通知を受けるチャンセル選択してインストール完了。
アプリの画面から
Incoming Webhooks > Webhook URL 確認
GitHubの設定
GithubのSecretに確認したWebhook URL
を追加
Settings > Secrets > Actions secrets > New repository secret
- Name: SLACK_WEBHOOK_URL
- Value: {確認したWebhook URL}
Actionの設定
workflowのファイルに slack通知を追加。
payloadに通知内容を設定する
参考: https://github.com/slackapi/slack-github-action
- name: notify slack
uses: slackapi/slack-github-action@v1.19.0
with:
payload: |
{
"text": "テスト結果: ${{ job.status }}\n\n${{github.server_url}}/${{github.repository}}/actions/runs/${{github.run_id}}"
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
Slack通知の動作確認
変更をmainにpushしてSlackに通知が来ること確認できました。
実際は、
if: ${{ failure() }}
を付けてエラー時のみ通知にするのが良さそう。