GithubActions導入

初CI設定だったので、丁寧にメモを残しておこうと思います。
(※まだまだ解説も書いていないざっくりな内容なので、追加編集します)
CIツールは他にもありますが、GithubActionsはprivate repoでも2000分/月(約33時間分)無料で使用できるので導入しました。

## 結論🚀
GithubActionsを使用して、
![無題のプレゼンテーション_-_Google_スライド.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/b4581b16-28fd-df72-08e4-c5e75507106e.jpeg)

CI(継続的インテグレーション)を実装します。


#### CI(継続的インテグレーション)とは...？
>CIとは、Continuous Integrationの略で、継続的インテグレーションと呼ばれています。
CI(継続的インテグレーション)では、開発者が自分のコード変更を頻繁にセントラルリポジトリにマージし、その度に自動化されたビルドとテストを実行します。
小さなサイクルでインテグレーションを繰り返し行い、インテグレーションのエラーを素早く修正することによりチームは統合されたソフトウェアをより迅速に開発できるようになります。
[CI(継続的インテグレーション)](https://cloudbees.techmatrix.jp/devops/ci/)



## Github Actions
**「何をしたら(トリガー)、どうする(実行したい処理)」**を設定することで、Github上でCIを設定できる。


[GitHub Actionsのワークフローリファレンス](https://help.github.com/ja/actions/reference/workflow-syntax-for-github-actions)

```yml:.github/workflows/github_actions.yml

name: GithubActions

# トリガー
on:
  push:
    branches: [ development ]
  pull_request:
    branches: [ development ]

jobs:
  rspec-test:
    # 実行環境: ubuntu-18
    runs-on: ubuntu-latest

    # タスク
    steps:
    - uses: actions/checkout@v2

    # Rubyのセットアップ
    - name: Set up Ruby
      uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
      with:
        ruby-version: 2.6

    # Rubyバージョン確認
    - name: check Ruby version
      run: ruby -v

    - name: check dirctory
      run: |
        pwd
        bundler -v

    - name: sqlite3 install
      run: |
        sudo apt install libsqlite3-dev
        gem install sqlite3 -v '1.4.2' --source 'https://rubygems.org/'
        dpkg -L libsqlite3-dev

    # Gemキャッシュ
    - name: Cache gems
      uses: actions/cache@v2
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gems-

    # bundle install
    - name: Install dependencies
      run: |
        bundle config path vendor/bundle
        bundle install --jobs 4 --retry 3

    # TEST DB setup
    - name: database setup
      run: |
        mv config/database.org config/database.yml
        mv config/secrets.org config/secrets.yml
        bundle exec rails db:migrate RAILS_ENV=test

    # Rspec実行
    - name: run Rspec
      run: bundle exec rspec

  # Slack通知
  success_notify:
    needs: [rspec-test]
    runs-on: ubuntu-latest
    steps:
    - name: slack notify
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        SLACK_TITLE: GithubActionsテスト結果
        SLACK_MESSAGE: 'Success :rocket:'

  failure_notify:
    if: failure()
    needs: [rspec-test]
    runs-on: ubuntu-latest
    steps:
    - name: slack notify
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        SLACK_MESSAGE: 'Failure :scream:'
        SLACK_TITLE: GithubActionsテスト結果
        SLACK_COLOR: '#FF0000'

```

### cacheを入れる
[Cache](https://github.com/marketplace/actions/cache)

毎回`bundle install`するのに3~5分くらいかかるので、キャッシュしておきましょうという話。

```yml:cache部分のコード
   # Gemキャッシュ
    - name: Cache gems
      uses: actions/cache@v2
      with:
        path: vendor/bundle
        key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gems-
```

### 結果をSlack通知
実行結果をSlackに通知させるのは、 [Slack Notify](https://github.com/marketplace/actions/slack-notify) を使用。
<img width="742" alt="ウィンドウ_と_Slack___botテストチャンネル___infratop.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168550/52c8831f-1d86-c1fa-e39c-39f3bf303ea1.jpeg">

```yml:slack通知部分のコード
 # Slack通知
  success_notify:
   # 特定のタスクを待ってから実行
    needs: [rspec-test]
    runs-on: ubuntu-latest
    steps:
    - name: slack notify
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        SLACK_TITLE: GithubActionsテスト結果
        SLACK_MESSAGE: 'Success :rocket:'

  failure_notify:
    if: failure()
    needs: [rspec-test]
    runs-on: ubuntu-latest
    steps:
    - name: slack notify
      uses: rtCamp/action-slack-notify@master
      env:
        SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
        SLACK_MESSAGE: 'Failure :scream:'
        SLACK_TITLE: GithubActionsテスト結果
        SLACK_COLOR: '#FF0000'
```