GitHub Actions workflowについてのススメ

# 概要

`GitHubActions`を利用したテストワークフローの構築について社内布教用にまとめてみた

# 経緯

@ucan-lab さんのハンズオンに参加して個人的に導入はしているがチーム内で技術共有をしてなかったので布教用としてまとめることにしました
なお、今回の`workflow`については以下のハンズオン資料を流用させていただいています。

https://qiita.com/ucan-lab/items/56c9dc3cf2e6762672f4#github-actions-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%93%E3%83%AB%E3%83%89%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E6%9B%B8%E3%81%8F

https://php-builders.connpass.com/event/239066/


# 解説

https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions

> GitHub リポジトリの [Actions] タブに表示されるワークフローの名前。

```yaml
name: Laravel Testing
```

- `on:`ワークフローを発火させるトリガーを指定します
- `pull_request:` PRが作成されたタイミングをトリガーします
- `branches`:特定のブランチに対してのPRに対してだけトリガーします（デフォルトは全てのブランチが対象です）


```yaml
on:
  pull_request:
    branches:
      - main
```

- `runs-on: ubuntu-latest`: 実行する仮想マシンを指定します（今回は`ubuntu`の最新版)
- `steps`:ジョブのステップをグループ化する
- `uses: actions/checkout@v2` : リポジトリをチェックアウトし、ワークフローがアクセス可能にする

https://github.com/actions/checkout

```yaml
jobs:
  laravel-testing:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
```

`- name` :GitHubに表示するステップの名前
`run`:コマンドを実行するようにジョブに指示を出します

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#onpull_requestpull_request_targetbranchesbranches-ignore

```yaml
steps:
      - name: Docker Version
        run: docker version
```

`run: |`:複数コマンド順に実行します

`docker-compose exec -T` :擬似TTY（疑似端末）への割り当てを無効にする


> ttyとは、標準入出力となっている端末デバイス(制御端末、controlling terminal)の名前を表示するUnix系のコマンドである。元来ttyとはteletypewriter（テレタイプライター）のことを指す。

https://qiita.com/toshihirock/items/22de12f99b5c40365369


https://docs.docker.jp/compose/reference/exec.html?highlight=exec

```yaml
steps:

      - name: OS Version
        # -T 擬似TTY(標準出力の接続先デバイス)への割り当てを無効
        run: |
          docker-compose exec -T app cat /etc/os-release
          docker-compose exec -T app cat /etc/debian_version
```


# 全体

```yml:.github/workflows/laravel-testing.yml
name: Laravel Testing

on:
  pull_request:
    branches:
      - main

jobs:
  laravel-testing:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Docker Version
        run: docker version

      - name: Build Docker Images
        run: docker-compose build

      - name: Create & Start Docker Containers
        run: docker-compose up -d

      - name: OS Version
        # -T 擬似TTY(標準出力の接続先デバイス)への割り当てを無効
        run: |
          docker-compose exec -T app cat /etc/os-release
          docker-compose exec -T app cat /etc/debian_version

      - name: PHP Version
        run: docker-compose exec -T app php --version

      - name: Composer Version
        run: docker-compose exec -T app composer --version

      - name: Install Dependencies
        run: docker-compose exec -T app composer install

      - name: Laravel Version
        run: docker-compose exec -T app php artisan --version

      - name: Laravel Setting
        run: |
          docker-compose exec -T app cp .env.example .env
          docker-compose exec -T app php artisan key:generate

      - name: Laravel Migrate Testing
        run: docker-compose exec -T app php artisan migrate

      - name: Laravel Rollback Testing
        run: docker-compose exec -T app php artisan migrate:refresh

      - name: Laravel Seeding Testing
        run: docker-compose exec -T app php artisan db:seed

      - name: Laravel PHPUnit Testing
        run: docker-compose exec -T app php artisan test
```