GitHub Actions を触ってみた(放射線測定マップの作成 Ⅲ)

# リソースレス

ガイガーカウンターのIoT化マッピングサービスを、レンタルサーバなど使わずに実現したい。

「OpenStreetMap ベースのガイガーカウンター測定マップを umap で考える」
https://qiita.com/nanbuwks/items/d971341f824bb2cc96ef

それを実現するために、GitHub Actions を学習してみました。

今回は、Google Spreadsheet から csv ファイルをダウンロードして GitHub レポジトリの release にアップロードするまでを自動で実現してみます。



# 最初の一歩

最初は公式ページを元にやっていきます。

https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions#create-an-example-workflow


まず、練習のためのGitHubレポジトリを開き、Actions を選びます。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ed7eff81-c614-e389-5e56-97d50b74a468.png)


「set up a workflow yourself 」を押して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cee1eb48-a16b-0b68-ea31-2a67c5c85b1b.png)

旧い資料だとデフォルトでサンプルが入っているみたいですが、今回は中身が空でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/4248656e-7681-2e75-3986-da87716b3620.png)


`.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
```

実行できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/8be11bb7-afd5-08dd-58c8-d59077f94d06.png)

なお、最初間違って `.git`  ディレクトリ内に作ってしまっていて、`git commit` できずにおかしーなーと思ってました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/608325ed-f278-fd3e-bc9c-61bb2eb5ba53.png)


実行結果のうち、Run bats -v を展開してみると、バージョンらしきものが表示されていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/3113e669-e28b-b739-7893-3bd4d0dfb727.png)

メイン処理以外にもいろいろログっぽいものが記録されているようです。実行結果を全部展開してみました。

```

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!

```
変更し、プッシュしたら実行できたようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/cfe37e31-fa13-04dd-1d81-f9bbd7b1b8bb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/a18d7e5a-4991-a7d8-d456-a0c012a4f41c.png)


# OSコマンドを動かしてみる

`runs-on` に Ubuntu とあることから、Ubuntuマシン上で動いているみたいです。run の記述はシェルスクリプトっぽいですね。Ubuntu のシェルコマンドが動くかどうか試してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/2da9bf70-c669-3ca3-6fcc-4ecd0d86b156.png)

なるほど! レポジトリにアクセスできるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/6fab5900-14bf-a1b6-7890-45bd6a03b3ea.png)

# Actions

さて、Marketplace を見るといろんな環境が使えるみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/54d913ea-1afd-460b-3d98-ff8f33aef252.png)

こういったものを組み合わせて、便利に素早くいろんな処理ができるようです。
今回はここらへんは使わず、勉強を兼ねてプリミティブに組んでいくことにしました。


# レポジトリ内のスクリプトを実行してみる

`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 形式でをダウンロードするものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/43d76c61-b648-9e64-57db-1fd47d936146.png)

これを実行できるように、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 の保存処理が行われ散るみたいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/318e7e83-effa-6c43-176e-b3d345722133.png)

しかしながら、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 でファイルをアップロードしてみます。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/b1b74a17-cdf7-ec33-f0aa-2163eca5c979.png)
```

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 }}


```

エラーが出ました!


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c471f1dd-a7cb-d82d-d094-cd0d1268ef53.png)

https://github.com/nanbuwks/GeigerMap/settings/actions でパーミッションを設定すると解決します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1f31fe53-914f-3a54-3b6b-f443be78c3b6.png)

アップロードできました!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d4580d8f-01ad-43a8-7010-43c91fece439.png)



上記のファイルは以下の URL で外部からアクセスできるようになります。
`https://github.com/nanbuwks/GeigerMap/releases/download/pre0.2/test3.csv`



# release strategy

今までの作業を元に、作戦を考えます。

- ガイガーカウンターの値を自動更新したい
  - 1日に1回〜数回アップデートしたい
    - release タグは datetime 値で管理 
- 最新のファイルを固定アドレスでアクセスできるようにしたい。
  - 最新のファイルは latest でアクセス
    - `https://github.com/nanbuwks/GeigerMap/releases/latest/download/test3.csv`
- 先に release が作成されてその後で ファイルを追加していく
  - ファイルが揃うまでは pre-release 扱い
    - ファイルが揃ったら release に変更して latest とする

# 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 }}


```
実行すると、思ったとおりの挙動ができてめでたしめでたし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f46a0d2c-888b-b2f8-dbff-4fda3ad73d1f.png)


## 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 に移植
- .
- .
- .