Github ActionでCI回してSlack通知する

Docker + Laravelの環境を作ったので、Github ActionでCI回してSlack通知するまでサクッと作る

# 前提
- Docker + Laravel + MySQL の環境を構築済み
- ディレクトリ構成
```
.
├── docker
│   ├── app
│   │   ├── Dockerfile
│   │   └── php.ini
│   └── db
│       ├── Dockerfile
│       └── my.cnf
├── src
│   └── project
└── docker-compose.yml
```
- コンテナの起動
```sh
docker compose up -d
```
- テスト
```sh
docker compose exec app php artisan test
```

# 手順
## GitHub Action
### Actionの設定
.github/workflows/ 以下に workflowsファイルを作成
```sh
vim .github/workflows/ci.yaml
```
[GitHub Actionsのドキュメント](https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions) を参考に
mainブランチにpushしたら、
checkoutして、コンテナの起動して、テストを走らせるワークフローを設定。

```yaml:ci.yaml
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ページを確認する。
![スクリーンショット 2022-07-04 23.05.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/2612314b-29b9-d16f-8688-35034490f9b4.png)

エラーとなった。


### SQLSTATE[HY000] [2002] Connection refused 対応
上記 Actionだと `SQLSTATE[HY000] [2002] Connection refused` が出てエラーとなってしまう。
DBコンテナが起動完了する前に、テストを走らせようとしていることが原因。

こちらを参考に、Dockerコンテナのヘルスチェックを設定する
https://zenn.dev/snowcait/articles/0cc4a464610e61

```yaml:docker-compose.yml
  db:
    build:
      context: .
      dockerfile: ./docker/db/Dockerfile
    healthcheck:
      test: ["CMD", "mysqladmin", "ping"]
      interval: 60s
      timeout: 5s
      retries: 1
    ports:
      - 3306:3306
```

ヘルスチェックが完了するのを待つように
`--wait` オプションを付ける

```yaml:ci.yaml
      - 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 の設定画面で以下の内容を入力
```yaml
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
```


![スクリーンショット 2022-07-01 10.43.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/7f474dcb-dc5e-ea2e-9ef8-ded093fdc56d.png)

上記画面に遷移するので、
`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
```yaml:ci.yaml
      - 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に通知が来ること確認できました。
![スクリーンショット 2022-07-01 11.29.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6568/c0a6cb89-1c9a-db02-735a-2ff54efe0f51.png)

実際は、
```
if: ${{ failure() }}
```
を付けてエラー時のみ通知にするのが良さそう。