OSSとかでよく見るGitHubのプルリク作成で動くCIを導入してみた目次

takahiko tominaga
nextbeat-engineering
8 min readMay 23, 2022
  1. はじめに
  2. 概要
  3. 導入
  4. おわりに

1. はじめに

こんにちは、ネクストビートの富永です。

今回はちょーゆるい内容になります。ブログというより日記に近いかもです。

何をやるかと言うと、OSSなどでプルリク作成したらなんか勝手にGithub Actionsが動いてるあれがなんなのか気になったので、調べて自分も入れてみました。と言う感じです。

なんで入れるかと言うと、設定を入れれば複数バージョンのScalaやJavaでビルドやテストを自動でやってくれるということだったので、シンプルに入れたいと思ったからです。

こんなやつ

あと、なんかかっこいいからです。

今回導入する先は、僕が趣味で作成を行っているフレームワーク(擬き)です。
現在このフレームワークは以下のような環境で動いています。

Scala: 2.12.x, 2.13.x, 3.x

Java: 11

なんでこんなことになっているかはさておき、都度バージョン切り替えて検証してってやるのがちょーめんどくさかったので、導入して上手くここら辺の手間を省ければと思ってます。

2. 概要

sbt-github-actionsというプラグインを使用してプルリク生成時とプッシュ時に動くCI/CDを導入します。

各種設定や詳しい説明などは行いませんので、ご了承ください。

3. 導入

まずはsbt-github-actionsのREADMEに書いている手順通りに導入して行きます。

以下設定をplugins.sbtに記載します。

addSbtPlugin("com.codecommit" % "sbt-github-actions" % "0.14.2")

2022/04時点で最新のv0.14.2を使用しています。

上記追記後ターミナルで、sbt githubWorkflowGenerateコマンドを実行すると自動で.github/workflowsディレクトリ配下にci.ymlとclean.ymlファイルが生成されます。

ci.yml

このファイルが各バージョンごとにビルドとテスト実行してくれるやつです。

生成されたファイルを見ると、各バージョンが設定されてます。

Java8は、もしかしたらJava11に代わると使えないライブラリが出てくるかもしれないので入れておきました。

jobs:
build:
name: Build and Test
strategy:
matrix:
os: [ubuntu-latest]
scala: [3.1.2, 2.13.7, 2.12.15]
java: [temurin@11, temurin@8]
runs-on: ${{ matrix.os }}

こんな感じでJavaのバージョンは切り替えてるみたいです。

- name: Setup Java (temurin@11)
if: matrix.java == 'temurin@11'
uses: actions/setup-java@v2
with:
distribution: temurin
java-version: 11

- name: Setup Java (temurin@8)
if: matrix.java == 'temurin@8'
uses: actions/setup-java@v2
with:
distribution: temurin
java-version: 8

キャッシュの設定も入れてくれているのはありがたいですね。
ただ、どこに、なにのキャッシュが入っているのかよくわかってないので、勉強しなければ…

- name: Cache sbt
uses: actions/cache@v2
with:
path: |
~/.sbt
~/.ivy2/cache
~/.coursier/cache/v1
~/.cache/coursier/v1
~/AppData/Local/Coursier/Cache/v1
~/Library/Caches/Coursier/v1
key: ${{ runner.os }}-sbt-cache-v2-${{ hashFiles('**/*.sbt') }}-${{ hashFiles('project/build.properties') }}

ここで実際に生成されたファイルが間違ってないかを確認してるみたいです。
手動で変えたい場合は、このフローを生成しないようにもできるみたいです。

- name: Check that workflows are up to date
run: sbt ++${{ matrix.scala }} githubWorkflowCheck

ここで各Scalaバージョンに応じてテストをしています

- name: Build project
run: sbt ++${{ matrix.scala }} test

ここでtarファイルをアップロードしておき、ビルド後に実行されるPublishアクションで時間短縮して使用できるようにするみたいです。
Publishはしないので今回は割愛(どこにも公開しないから)

- name: Compress target directories
run: tar cf targets.tar core/lepus-router/target development/lepus-swagger/target target development/lepus-server/target development/sbt-plugin/target core/lepus/target project/target

- name: Upload target directories
uses: actions/upload-artifact@v2
with:
name: target-${{ matrix.os }}-${{ matrix.scala }}-${{ matrix.java }}
path: targets.tar

clean.yml

このファイルはci.ymlで生成されたキャッシュとかをクリーンしてくれるやつです。

早速プルリク作って確認してみます。

以下のような感じで、色々実行されます。

Actionsタブに移動したらたくさん走っているのが確認できます。

各バージョンの組み合わせで、動いていることも確認できました。

ビルドもテストも、問題がなければ、tarが生成されるようになります。

プルリクに戻ると全部成功してました。

4. おわりに

導入してみて複数バージョンを使うプロジェクトの場合は、すごく楽になりました。

OSSとかだとプルリク作成した時点で全部検証してくれるので、レビュワーの負担も減りますし、このバージョンでだけ動かないってことも減らせるからいいですね。

あとはこのActionsが全部成功しないとそもそもレビューしないよっていうOSSもありますし。

sbt-github-actionsは設定でフローを追加することもできるので、scalafmtとかでインデントとかも自動で揃えるもしくは、揃ってない場合にはエラーとして落とすみたいなのもできると、よりコードをきれいに保つことが出来そうですね。

あとはプロジェクトで使用する言語のバージョンをあげるときとかも使えそうですかね?
無難にタグで分けた方がいいか。

今回はちょーゆるい感じの内容でしたが、最後まで読んでくれた方ありがとうございました。

参考文献

We are hiring!

株式会社ネクストビートでは

「人口減少社会において必要とされるインターネット事業を創造し、ニッポンを元気にする。」
を理念に掲げ一緒に働く仲間を募集しております。

https://www.nextbeat.co.jp/recruit

--

--