リソースレス
ガイガーカウンターのIoT化マッピングサービスを、レンタルサーバなど使わずに実現したい。
「OpenStreetMap ベースのガイガーカウンター測定マップを umap で考える」
https://qiita.com/nanbuwks/items/d971341f824bb2cc96ef
それを実現するために、GitHub Actions を学習してみました。
今回は、Google Spreadsheet から csv ファイルをダウンロードして GitHub レポジトリの release にアップロードするまでを自動で実現してみます。
最初の一歩
最初は公式ページを元にやっていきます。
まず、練習のためのGitHubレポジトリを開き、Actions を選びます。
「set up a workflow yourself 」を押して
旧い資料だとデフォルトでサンプルが入っているみたいですが、今回は中身が空でした。
.github/workflows/learn-github-actions.yml
を以下の内容で作成
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
check-bats-version:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm install -g bats
- run: bats -v
プッシュアクションで発火するようになっています。早速push してみます。
$ git push origin main
実行できました。
なお、最初間違って .git
ディレクトリ内に作ってしまっていて、git commit
できずにおかしーなーと思ってました。
実行結果のうち、Run bats -v を展開してみると、バージョンらしきものが表示されていました。
メイン処理以外にもいろいろログっぽいものが記録されているようです。実行結果を全部展開してみました。
Current runner version: '2.311.0'
Operating System
Ubuntu
22.04.3
LTS
Runner Image
Image: ubuntu-22.04
Version: 20231126.1.0
Included Software: https://github.com/actions/runner-images/blob/ubuntu22/20231126.1/images/ubuntu/Ubuntu2204-Readme.md
Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu22%2F20231126.1
Runner Image Provisioner
2.0.321.1
GITHUB_TOKEN Permissions
Contents: read
Metadata: read
Packages: read
Secret source: Actions
Prepare workflow directory
Prepare all required actions
Getting action download info
Download action repository 'actions/checkout@v4' (SHA:b4ffde65f46336ab88eb53be808477a3936bae11)
Download action repository 'actions/setup-node@v3' (SHA:1a4442cacd436585916779262731d5b162bc6ec7)
Complete job name: check-bats-version
1s
Run actions/checkout@v4
with:
repository: nanbuwks/GeigerMap
token: ***
ssh-strict: true
persist-credentials: true
clean: true
sparse-checkout-cone-mode: true
fetch-depth: 1
fetch-tags: false
show-progress: true
lfs: false
submodules: false
set-safe-directory: true
Syncing repository: nanbuwks/GeigerMap
Getting Git version info
Working directory is '/home/runner/work/GeigerMap/GeigerMap'
/usr/bin/git version
git version 2.43.0
Temporarily overriding HOME='/home/runner/work/_temp/dcbf52c5-a394-4d2b-bdff-d1aed9d64cdd' before making global git config changes
Adding repository directory to the temporary git global config as a safe directory
/usr/bin/git config --global --add safe.directory /home/runner/work/GeigerMap/GeigerMap
Deleting the contents of '/home/runner/work/GeigerMap/GeigerMap'
Initializing the repository
/usr/bin/git init /home/runner/work/GeigerMap/GeigerMap
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
Initialized empty Git repository in /home/runner/work/GeigerMap/GeigerMap/.git/
/usr/bin/git remote add origin https://github.com/nanbuwks/GeigerMap
Disabling automatic garbage collection
/usr/bin/git config --local gc.auto 0
Setting up auth
/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
yml を書き換えて HelloWorld にしてみる
.github/workflows/learn-github-actions.yml
を以下のように変更してみます。
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
HelloWorld:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo HelloWorld!
変更し、プッシュしたら実行できたようです。
OSコマンドを動かしてみる
runs-on
に Ubuntu とあることから、Ubuntuマシン上で動いているみたいです。run の記述はシェルスクリプトっぽいですね。Ubuntu のシェルコマンドが動くかどうか試してみました。
なるほど! レポジトリにアクセスできるみたいです。
Actions
さて、Marketplace を見るといろんな環境が使えるみたいです。
こういったものを組み合わせて、便利に素早くいろんな処理ができるようです。
今回はここらへんは使わず、勉強を兼ねてプリミティブに組んでいくことにしました。
レポジトリ内のスクリプトを実行してみる
githubaction/getdata.sh
なるファイルをレポジトリに作成します。
内容で以下のようなスクリプトです。パーミッションに実行権を与えました。
wget 'https://docs.google.com/spreadsheets/d/1Jk68vqIKBKF-Um-DHvvRcIo76F_VRXgU0vffuJI26eI/export?format=csv&gid=1838501433' -O test3.csv
このスクリプトは以下の Google Sheet からデータを csv 形式でをダウンロードするものです。
これを実行できるように、yml を以下のように変更します。
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
HelloWorld:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./getdata.sh
working-directory: githubaction
実行すると、以下のように test3.csv の保存処理が行われ散るみたいです。
しかしながら、Actions では test3.csv が保存できたのですが、チェックアウト時に消えてしまいます。
さて。
ファイルの保存
ファイルの保存はいろんなやり方があると思いますが、今回はレポジトリのリリースを作り、そこにファイルを追加アップロードすることにします。
rerelase の準備
とはいえ、 github で release は全然使っていなかったのでまずは手元のローカルマシンで release の挙動を確かめてみます。
まず、gh コマンドをこちらの記事のようにインストール。
「gh ( GitHub CLI ) を Ubuntu にインストール」
https://qiita.com/nanbuwks/items/d2d2ec44948c9301d834
次に git コマンドと gh コマンドを使って手作業で release を作ってみました
まずは 適当なタグ pre0.1
を作ります。
$ git tag
$ git tag pre0.1
$ git push origin pre0.1
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:nanbuwks/GeigerMap.git
* [new tag] pre0.1 -> pre0.1
gh を試してみようとしたらログインが必要と出たので
$ gh release list
Welcome to GitHub CLI!
To authenticate, please run `gh auth login`.
以下のコマンドを進めてログインを終わらせておきます。
$ gh auth login
再度 gh コマンドを試します。
$ gh release list
何もないことを確認して、新たに release を作ります。
$ gh release create pre0.1
? Title (optional) test
? Release notes Write my own
? Is this a prerelease? Yes
? Submit? Publish release
https://github.com/nanbuwks/GeigerMap/releases/tag/pre0.1
あれれ、いろいろと聞いてきますね。
とりあえず、これにファイルをアップロード。ここまではうまくいったようです。
$ cd githubaction
$ ls
$ gh release upload pre0.1 test3.csv
Github Actions でアップロード
次に、pre0.2 という名前でリリースをつくっておき、ここに github action でファイルをアップロードしてみます。
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
HelloWorld:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./getdata.sh
working-directory: githubaction
- run: gh release upload pre0.2 githubaction/test3.csv
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
エラーが出ました!
https://github.com/nanbuwks/GeigerMap/settings/actions でパーミッションを設定すると解決します。
アップロードできました!
上記のファイルは以下の URL で外部からアクセスできるようになります。
https://github.com/nanbuwks/GeigerMap/releases/download/pre0.2/test3.csv
release strategy
今までの作業を元に、作戦を考えます。
- ガイガーカウンターの値を自動更新したい
- 1日に1回〜数回アップデートしたい
- release タグは datetime 値で管理
- 1日に1回〜数回アップデートしたい
- 最新のファイルを固定アドレスでアクセスできるようにしたい。
- 最新のファイルは latest でアクセス
https://github.com/nanbuwks/GeigerMap/releases/latest/download/test3.csv
- 最新のファイルは latest でアクセス
- 先に release が作成されてその後で ファイルを追加していく
- ファイルが揃うまでは pre-release 扱い
- ファイルが揃ったら release に変更して latest とする
- ファイルが揃うまでは pre-release 扱い
release を自動で作る
上記のように動作するものを作ってみました。
name: learn-github-actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
uploadrelease:
runs-on: ubuntu-latest
steps:
- name: Get current daytime
uses: actions/checkout@v4
- run: echo "RELEASEDATE=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
- run: ./getdata.sh
working-directory: githubaction
- run: |
echo "リリース名:$RELEASEDATE"
git tag $RELEASEDATE
git push origin $RELEASEDATE
gh release create $RELEASEDATE --prerelease --notes automake
gh release upload $RELEASEDATE githubaction/test3.csv
gh release edit $RELEASEDATE --prerelease=false --latest
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
実行すると、思ったとおりの挙動ができてめでたしめでたし。
Tips
-
gh release create
コマンドで対話的なアレコレが出てきましたが、--notes
オプションをを使えば非対話的になるようだ - 上記では
20231209114536
という datetime 文字列がecho "RELEASEDATE=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
で生成して使っています。- UTC だけど日本ローカルにしなくてもいいかな
俺達のたたかいはこれからだ!
とりあえず、このあとのお遊戯的なことは外でやっていきます。
- csv をグラフに変更
- uMap と連携
- ガイガーカウンター濃度の登録を Issue で管理
- cron で実行
- GitHub Page 化
- GitLab に移植
- .
- .
- .