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 spec
とrubocop
を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については公式ドキュメントにほぼ完璧に書かれている
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 }}
でよい
マトリっくすを使ったテスト並行実行
- CircleCIのような並列実行ができないため分割実行用のコードを置いておき、それ使って分割させる
- 調べていたら会社の先輩の記事が出てきた
- GitHub ActionsでRspec並列実行 - ohbarye
- 分割用rbファイルを置いておいて貪欲法でspecファイルを各インスタンスに割り振っている
- Github Actionsで並列テストをする - amacou's blog
動作確認
- 失敗
- なぜか止まった
エラーが起きた原因も出てない
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).
concurrencyを使う
- https://docs.github.com/ja/actions/using-jobs/using-concurrency
- pushした際に既存の実行中actionをキャンセルできる。
- 先輩からレビューで教えていただいた
concurrency:
group: test-ci-${{ github.head_ref }}
cancel-in-progress: true