GitHubActionsとPlaywrightを使用してOS側の日付を変更したい
弊社システムのうちの一つ、一部分でOSの時計を参照する機能がある(将来的に直したいという思いはある)
この機能をtesting frameworkであるPlaywrightでテストするときにどうすればいいか考えたので共有
ちなみにTimezoneだけ変えればいいなら設定でいける
要件
- GHAで実行されるテストの実行環境のOSのTimezone/日時/時刻を指定したものにしたい
アプローチ
1. Docker使う
多分一番正気をとどめたやり方がDocker使う方法で、ググれば知見の嵐に見舞われる
ただ確実に工数多くなるので2の方法を試した後で行うことにした
2. GHA環境のOSの時計をそのまま変えちゃう
ソースは見つけられてないがログ見た感じGHAは多分Azureで実行されてそうな感じがする(同じMSだし)
で、使用するOSは変更できて、
弊環境だとubuntuを利用している
だから、stepの中でubuntuの日付/時間を変更する処理を挟むことでテスト実行時に参照する時刻も変更されるのではと考えた
# .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で実行
- 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分ずれており、無効である」のような意味。システム時刻が問題のようである。
今回幸いにもubuntu環境で行うことは
- 時刻変更
- playwrightのinstall
の2つのみだったので、
- 時刻変更
- Playwrightのinstall => 時刻ずれてるのでエラー
を
- Playwrightのinstall
- 時刻変更
という流れに変更したら難なく解消
後日談
OSの時刻を未来の日付に変更してGHAを実行するとこのように
24日5時間かかってそうな表記になる(実際は数分から十数分程度かと思われる)
1つのstepの開始時間は多分Date.now()
的な感じで実行環境以外のところから取得しており、終了タイミングに関してはOSの時刻を参照して、その差分を使用量として計算している結果このような表記になるものかと思われる
もしそうなら逆に過去の日付を指定して実行すると一生無料で使える脆弱性にもなりかねないなぁという発見と引き換えに24日5時間のGHA実行分のトンデモ請求されるかと焦った
が、使用量のCSV見たところ正常な時間で記録されてそうなのでそこら辺はしっかりしていて、単にフロントでの計算だけおかしいぽそう
Discussion