Open14

GithubActionsのymlファイルを読み解く

ピン留めされたアイテム
にふうちにふうち

修正

  • しっかり動作して、しっかりテストが失敗したことを教えてくれた。
  • めも:ruby/setup-ruby@v1 bundle installもやってくれるので別で書く必要はない。
name: rails-test #このActionの名前

on: #トリガー
  push:
    branches: #どのブランチへpushされたとき?
      - develop
  pull_request: #PRがされた時

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:                    
          MYSQL_ROOT_PASSWORD: password  
          TZ: "Asia/Tokyo"
        options: >- 
          --health-cmd "mysqladmin ping -h localhost"
          --health-interval 20s 
          --health-timeout 10s 
          --health-retries 10
    env:
      RAILS_ENV: test
      MYSQL_DATABASE: root
      MYSQL_ROOT_PASSWORD: password
      DB_HOST: 127.0.0.1              # config/database.ymlで参照する

    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1      # https://github.com/ruby/setup-ruby
        with:
          ruby-version: 3.1.1
          bundler-cache: true         # vandle/cacheにgemインストールする
      - name: DB initialize
        run: |
          bundle exec rails db:create
          bundle exec rake db:migrate
      - name: Run Rspec
        run: bundle exec rspec

  rubocop:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1      # https://github.com/ruby/setup-ruby
        with:
          ruby-version: 3.1.1
          bundler-cache: true         # vandle/cacheにgemインストールする
      - name: Run rubocop
        run: bundle exec rubocop
ピン留めされたアイテム
にふうちにふうち
name: rails-test

on: 
  push:
    branches: 
      - develop
  pull_request:

concurrency:
  group: test-ci-${{ github.head_ref }}
  cancel-in-progress: true

jobs:
  run-rspec:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:                    
          MYSQL_ROOT_PASSWORD: dockerdbpass1  
          TZ: "Asia/Tokyo"
        options: >- 
          --health-cmd "mysqladmin ping -h localhost"
          --health-interval 20s 
          --health-timeout 10s 
          --health-retries 10
    env:
      RAILS_ENV: test
      MYSQL_DATABASE: root
      MYSQL_ROOT_PASSWORD: dockerdbpass1
      DB_HOST: 127.0.0.1 

    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: DB initialize
        run: |
          bundle exec rails db:create
          bundle exec rails db:schema:load
      - name: Run Rspec
        run: bundle exec rspec

  run-rubocop:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: rubocop
        uses: reviewdog/action-rubocop@v2
        with:
            rubocop_version: gemfile
            rubocop_extensions: rubocop-rails:gemfile rubocop-rspec:gemfile
            reporter: github-pr-review

  run-brakeman:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: brakeman
        uses: reviewdog/action-brakeman@v2
        with:
          reporter: github-pr-review

  run-erbLint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: ERBlint
        run:  bundle exec erblint --lint-all
# NOTE:  https://zenn.dev/nifchi/scraps/7d3f3f5fcd754c
にふうちにふうち

やること

  • rails specrubocop をPR実施時にGithubActionsで実行させる
  • 自分で定義して実行できるようになりたい

必要なもの(必要そうなもの)

  • rails実行環境+Mysqlサーバ それぞれのインスタンス

経験

  • ない、初めて
  • Dockerのような感じで定義していけば良さそうだが、ymlを見るとだいぶ違う
にふうちにふうち

この辺まではなんとなくわかったが、うーん

name: rails-app test

on:
  push:
    branches:
      - develop
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:
          MYSQL_ROOT_PASSWORD: password
        options: >- 
          --health-cmd "mysqladmin ping -h localhost"
          --health-interval 20s 
          --health-timeout 10s 
          --health-retries 10
    env:
      RAILS_ENV: test
にふうちにふうち

基本要素について整理してみる

name, on

name: #このActionの名前

on: #トリガー
  push:
    branches: #どのブランチへpushされたとき?
      - develop
  pull_request: #PRがされた時

jobs

ref:GitHub Actionsのワークフロー構文 - GitHub Docs

  • 1セットのworkflowを定義する。複数作れる。
  • 大きく<job_id>stepsの二項目に分かれる

jobs.<job_id>

  • jobのid。今回はrails-testとかにしておく
jobs:
    rails-test:
    name: rails test          # なくてもいい
    runs-on: 	ubuntu-latest   # マシンタイプ よくわからないのでubuntsu 
    services:                 # サービス走らせるためのDpckerコンテナを立てられる。
    ##
    ##
    ##
    env:                      # ジョブの全てのstepから参照できる環境変数

  • 今回はMySQLインスタンスをserviceを使って立ち上げる

refs:

にふうちにふうち

jobs.<job_id>.services

  • mysqlのインスタンスを立てる
  • refのものを参考にしました
jobs:
  test:
   ...
    services:
      mysql:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:
          MYSQL_ROOT_PASSWORD: password
          TZ: "Asia/Tokyo"
        options: >- 
          --health-cmd "mysqladmin ping"
          --health-interval 20s 
          --health-timeout 10s 
          --health-retries 10
  • 基本的にはDockerfleと同じような書き方で良い

optionsのヘルスチェックについて

  • 詳しくは読み解いていないが、mysqlコンテナのヘルスチェックが通るまでworkflowをwaitさせる
  • ないとエラーになる

refs:

にふうちにふうち

steps

    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1      # https://github.com/ruby/setup-ruby
        with:
          ruby-version: 3.1.1
          bundler-cache: true         # vandle/cacheにgemインストールする
      - run: bundle exec
      - name: DB initialize
        run: |
          bundle exec rails db:create
          bundle exec rake db:migrate
  • steps.usesはあらかじめ定義されて公開されているactionを参照し実行できる
    • <repo>/<name>@versionで指定できる
    • 今回は公式に従ってacitonsが公開しているアクションとrubyビルド用のアクションを使うことにした
  • withではrubyのバージョンやらを指定する

steps.run steps.name.run

  • コマンドを実行する。nameをつけることもできる

stepsのまとめ

  • 上から順にコマンドを実行していく
  • 自分で直接記述する場合はrunを、アクションを参照して実行する場合はusesを使う

refs:

にふうちにふうち

完成品

  • 動作確認はまだ,明日やる
name: rails-test #このActionの名前

on: #トリガー
  push:
    branches: #どのブランチへpushされたとき?
      - develop
  pull_request: #PRがされた時

jobs:
  test:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:5.7
        ports:
          - 3306:3306
        env:                    
          MYSQL_ROOT_PASSWORD: password  
          TZ: "Asia/Tokyo"
        options: >- 
          --health-cmd "mysqladmin ping -h localhost"
          --health-interval 20s 
          --health-timeout 10s 
          --health-retries 10
    env:
      RAILS_ENV: test
      MYSQL_DATABASE: root
      MYSQL_ROOT_PASSWORD: password
      DB_HOST: 127.0.0.1              # config/database.ymlで参照する

    steps:
      - uses: actions/checkout@v2
      - uses: ruby/setup-ruby@v1      # https://github.com/ruby/setup-ruby
        with:
          ruby-version: 3.1.1
          bundler-cache: true         # vandle/cacheにgemインストールする
      - run: bundle exec
      - name: DB initialize
        run: |
          bundle exec rails db:create
          bundle exec rake db:migrate
      - name: Run Rspec
        run: bundle exec rspec
      - name: Run rubocop
        run: rubocop
にふうちにふうち

jobs.<job_id>.strategy

マトリックス戦略を使うと、単一のジョブ定義中で変数を使って、変数の組み合わせに基づく複数のジョブの実行を自動的に生成できます。 たとえばマトリックス戦略を使って、コードを言語の複数のバージョンや、複数のオペレーティングシステムでテストできます。
Using a matrix for your jobs - GitHub Docs

  • 組み合わせの一次元配列を作れる。複数のOSバージョンや、シンプルに並列処理をさせたいときに使う
  • 今の自分の生活部レベルでは不要そう。
  • 例えば
jobs:
  example_matrix:
    strategy:
      matrix:
        version: [10, 12, 14]
        os: [ubuntu-latest, windows-latest]
  • version * osの変数の組み合わせ全てに対して勝手にjobを実行してくれる
  • 変数をstepから参照したい時は${{ matrix.XXXX }}でよい

マトリっくすを使ったテスト並行実行

にふうちにふうち

動作確認

  • 失敗
  • なぜか止まった

    エラーが起きた原因も出てない
にふうちにふうち

rubocopをコメントアウトしたら解決

      - name: Run Rspec
        run: bundle exec rspec
      # - name: Run rubocop
      #   run: rubocop

別jobに切り出したら解決

にふうちにふうち

MEMO

  • なんかDBで出てたWarn。あとてみる
Warning:  2022-08-13T14:13:26.753368Z 0 [Warning] InnoDB: New log files created, LSN=45790
Warning:  2022-08-13T14:13:26.854432Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
Warning:  2022-08-13T14:13:26.862683Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 19722914-1b12-11ed-aa81-0242ac120002.
Warning:  2022-08-13T14:13:26.864056Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
Warning:  2022-08-13T14:13:27.172406Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
Warning:  2022-08-13T14:13:27.172431Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
Warning:  2022-08-13T14:13:27.173133Z 0 [Warning] CA certificate ca.pem is self signed.
Warning:  2022-08-13T14:13:27.240613Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
Warning:  2022-08-13T14:13:29.940300Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).