🚀

Launchable Advent Calendar 12日目 - record sessionコマンド

2022/12/12に公開

Launchableの各機能の利用方法を紹介する Launchable Advent Calendar 12日目です。

はじめに

ここまで launchable record build, launchable subset, launchable record tests コマンドを紹介してきました。また、これまでのサンプルではこれらのコマンドを同一のマシン上で実行する想定になっていました。
しかし、環境によってはテストをインスタンスサイズの大きいスポットインスタンスで実行したり、複数のマシンで並列に実行したりする環境もあるでしょう。

今日紹介するlaunchable record sessionコマンドはテストを実行するマシンが分かれている様な環境で利用するコマンドになります。

今日まで launchable record session というコマンドは出ていませんでしたが、実は launchable subsetlaunchable record build コマンドの内部で launchable record session コマンドが実行されていました。launchableコマンドの実行ディレクトリに .launchable がファイルが生成されそこに情報が保存されています。興味がある人は確認してみて下さい。

launchable record session

それでは launchable record session コマンドについて紹介します。
基本的な使い方はこの様になります。

launchable record session --build <BUILD NAME>
builds/<BUILD NAME>/test_sessions/1616806

--build オプションに launchable record build コマンドの --name オプションに指定したビルド名を指定します。

example
$ launchable record build --name try-record-session
Launchable recorded 0 commits from repository /Users/yabuki-ryosuke/src/github.com/Konboi/launchable-java-example
Launchable recorded build try-record-session to workspace konboi/advent-calendar-2022 with commits from 1 repository:

| Name   | Path   | HEAD Commit                              |
|--------|--------|------------------------------------------|
| .      | .      | 1e896f8860c8b8965c1205ed5e66efc7db2116ca |
$ launchable record session --build try-record-session
builds/try-record-session/test_sessions/1616806

GitHub Actionsでの例

Day 6サンプルを元にPrimary Node 1台、テストを実行するWorker Node 1台という構成を想定して変更します。

完了するとbuild1台で全て実行していたのがPrimary Node, Worker Noteの2台で実行するようになります。

※GitHub Actionsを使う関係上リソースを別のマシンへ転送する際に outputs というGitHub Actions特有の機能を使いますが、適宜利用しているCI環境のものをお使いください。

ci.yaml
   LAUNCHABLE_TOKEN: ${{ secrets.LAUNCHABLE_TOKEN }}

 jobs:
-  build:
+  primary-node:
     runs-on: ubuntu-latest
+    outputs:
+      test_session:  ${{ steps.issue_test_session.outputs.test_session}}
     steps:
       - uses: actions/checkout@v3
         with:
...

         run: launchable verify
       - name: record build
         run: launchable record build --name ${GITHUB_RUN_ID}
+      - name: record session
+        id: issue_test_session
+        run: |
+          launchable record session --build ${GITHUB_RUN_ID} > test_session.txt
+          test_session=$(cat test_session.txt)
+          echo "test_session=$test_session" >> $GITHUB_OUTPUT
+  worker-node:
+    runs-on: ubuntu-latest
+    needs: [primary-node]
+    steps:
+      - uses: actions/checkout@v3
+      - uses: actions/setup-python@v4
+        with:
+          python-version: "3.10"
+      - name: Set up JDK 1.8
+        uses: actions/setup-java@v3
+        with:
+          distribution: 'adopt'
+          java-version: '8'
+      - name: Install launchable command
+        run: |
+          pip install launchable
+      - name: Restore test session
+        run: echo -n '${{needs.primary-node.outputs.test_session}}' > test_session.txt
       - name: subset
-        run: launchable subset --target 80% maven src/test/java > launchable-subset.txt
+        run: launchable subset --session $(cat test_session.txt) --target 80% maven src/test/java > launchable-subset.txt
       - name: Run tests
         run: mvn test -Dsurefire.includesFile=launchable-subset.txt
       - name: launchable record tests
-        run: launchable record tests maven target/surefire-reports/TEST-example.*.xml
+        run: launchable record tests --session $(cat test_session.txt) maven target/surefire-reports/TEST-example.*.xml
         if: always()

サンプルPR

さいごに

本日は launchable record session コマンドの紹介と複数台に跨ってlaunchableコマンドを使用する例を紹介しました。今回はPrimary NodeとWorker Nodeが1対1でしたが、Primary Node 1, Worker Noteが複数の場合の設定を後日紹介する予定です。
明日はtest sessionのオプションflavorについて紹介します。

Discussion