🕰️

GitHubActionsとPlaywrightを使用してOS側の日付を変更したい

2022/10/27に公開

弊社システムのうちの一つ、一部分でOSの時計を参照する機能がある(将来的に直したいという思いはある)
この機能をtesting frameworkであるPlaywrightでテストするときにどうすればいいか考えたので共有

ちなみにTimezoneだけ変えればいいなら設定でいける
https://playwright.dev/docs/emulation#locale--timezone

要件

  • GHAで実行されるテストの実行環境のOSのTimezone/日時/時刻を指定したものにしたい

アプローチ

1. Docker使う

多分一番正気をとどめたやり方がDocker使う方法で、ググれば知見の嵐に見舞われる

https://docs.github.com/en/actions/creating-actions/creating-a-docker-container-action
https://qiita.com/suzuki0430/items/d625f8b57ae317ae7d66

ただ確実に工数多くなるので2の方法を試した後で行うことにした

2. GHA環境のOSの時計をそのまま変えちゃう

ソースは見つけられてないがログ見た感じGHAは多分Azureで実行されてそうな感じがする(同じMSだし)
で、使用するOSは変更できて、

https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources

弊環境だとubuntuを利用している
だから、stepの中でubuntuの日付/時間を変更する処理を挟むことでテスト実行時に参照する時刻も変更されるのではと考えた

yaml
# .github/workflows/playwright.yaml から 一部抜粋

     steps:
       - uses: actions/checkout@v3
       - name: Node.js v${{ matrix.node-version }} ⚙
         uses: actions/setup-node@v3
         with:
           node-version: ${{ matrix.node-version }}
       - name: moduleインストール 🎁 💨
         run: npm ci
       - name: PlayWrightのセットアップ 🤡
         run: npx playwright install-deps && npx playwright install # ref: https://playwright.dev/docs/next/cli#install-system-dependencies
+      - name: タイムゾーンと時刻設定 ⏰
+        run: sudo timedatectl set-ntp no && sudo timedatectl set-timezone "Asia/Tokyo" && sudo timedatectl set-time 2022-11-21 && sudo timedatectl set-time 00:00:00 && date
       - name: PlayWright実行 ✊
         id: playwright
         run: IS_CI=true npx playwright test e2e/hoge/* e2e/fuga/*

解説

最初は

      - name: タイムゾーンと時刻設定 ⏰
        run: timedatectl set-timezone "Asia/Tokyo" && timedatectl set-time 2022-11-21 && timedatectl set-time 00:00:00
      - name: PlayWrightのセットアップ 🤡
        run: npx playwright install-deps && npx playwright install # ref: https://playwright.dev/docs/next/cli#install-system-dependencies

こんな感じだったけどいくつか問題があった

エラー1

Failed to set time: Automatic time synchronization is enabled
=> timedatectl set-ntp noを追加
=> 権限エラー出た
=> sudoで実行

yaml
-        run: timedatectl set-timezone "Asia/Tokyo" && timedatectl set-time 2022-11-21 && timedatectl set-time 00:00:00
+        run: sudo timedatectl set-ntp no && sudo timedatectl set-timezone "Asia/Tokyo" && sudo timedatectl set-time 2022-11-21 && sudo timedatectl set-time 00:00:00 && date

参考: https://haiju.hatenablog.com/entry/2018/04/17/180747

エラー2

Playwrightがインストールできなかった

Run npx playwright install-deps && npx playwright install
Installing dependencies...
Switching to root user to install dependencies...
Hit:1 http://azure.archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:3 http://azure.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
Get:4 http://azure.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:5 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease [10.5 kB]
Hit:6 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal InRelease
Get:7 https://packages.microsoft.com/ubuntu/20.04/prod focal/main armhf Packages [28.4 kB]
Get:8 https://packages.microsoft.com/ubuntu/20.04/prod focal/main arm64 Packages [40.0 kB]
Get:9 https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages [200 kB]
Reading package lists...
E: Release file for http://azure.archive.ubuntu.com/ubuntu/dists/focal-updates/InRelease is not valid yet (invalid for another 2h 38min 8s). Updates for this repository will not be applied.
E: Release file for http://azure.archive.ubuntu.com/ubuntu/dists/focal-backports/InRelease is not valid yet (invalid for another 2h 39min 37s). Updates for this repository will not be applied.
E: Release file for http://azure.archive.ubuntu.com/ubuntu/dists/focal-security/InRelease is not valid yet (invalid for another 2h 36min 57s). Updates for this repository will not be applied.
Failed to install browser dependencies
Error: Installation process exited with code: 100
Error: Process completed with exit code 1.

おそらく下記と同様

OSをアップデートするために# apt updateを実行すると、次のエラーが出た。
「Release fileが6時間56分ずれており、無効である」のような意味。システム時刻が問題のようである。

https://kunpu1306.hatenablog.com/entry/2018/10/14/095340

今回幸いにもubuntu環境で行うことは

  • 時刻変更
  • playwrightのinstall

の2つのみだったので、

  1. 時刻変更
  2. Playwrightのinstall => 時刻ずれてるのでエラー

  1. Playwrightのinstall
  2. 時刻変更

という流れに変更したら難なく解消

後日談

OSの時刻を未来の日付に変更してGHAを実行するとこのように

24日5時間かかってそうな表記になる(実際は数分から十数分程度かと思われる)
1つのstepの開始時間は多分Date.now()的な感じで実行環境以外のところから取得しており、終了タイミングに関してはOSの時刻を参照して、その差分を使用量として計算している結果このような表記になるものかと思われる
もしそうなら逆に過去の日付を指定して実行すると一生無料で使える脆弱性にもなりかねないなぁという発見と引き換えに24日5時間のGHA実行分のトンデモ請求されるかと焦った

が、使用量のCSV見たところ正常な時間で記録されてそうなのでそこら辺はしっかりしていて、単にフロントでの計算だけおかしいぽそう

Discussion