GithubActionsを用いてpushをcronで定期実行し、毎日レポジトリに1草生やしていく

# 初めに

みなさん草生やしてますかーー！！！！

Githubが日常に入り込んできてから、いろいろな人のレポジトリを見るようになったのですが、草がたくさん生えてる方のProfileって**映えて**ますよね。

私はまだまだ道半ばですが、、、
![スクリーンショット 2022-05-29 13.09.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/18bb93f9-04a4-0e1c-b5d1-0ae012f11924.png)


あくまでも見た目です。開発力があるかどうかはそれだけではわからない。

けど、なんとなくすごそうに見えるのがあの草だと思ってます。
あとコード書くのが好きなんだろうなーってのも伝わる？気がしますね。

一日最低1lineは開発をしているのかなと思いきや、毎日なんらかの差分をpushする流れを定期実行できるようにしてしまえば、旅行に行こうと開発できなかろうと草は生やせることに気がつきました。

前置きはいいから先にコードを見せろ！ という方、是非こちらからどうぞ。

https://github.com/ishidao0910/kusa-bot

このqiita記事を読むことで、あなたも明日からプロフィールを草だらけにできることでしょう。

(あくまでも生やすだけなので、自己満足の領域は超えないことをしっかり胸に刻み込みましょう。）

# せっかくなので少しでも価値あるものを
とはいえ、毎日訳のわからない差分を無理やり生み出してcommit → pushするのも味気ない。と、思ったので今回は

**BTC/JPY通貨の、Job実行タイミングでの価格を毎日記録してpushする**

この流れをGithubActionsで自動化してみようと思います。

今回の実行イメージはこんな感じ。!

![スクリーンショット 2022-05-29 12.55.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/734f0f17-0e2a-2540-25dd-8465359f2d10.png)


# 補足
確かにGithubActionsは、CI/CDツールとして有名ですが、今回実装するcronジョブは、CI/CDの定義からは若干離れているような気がします。

サービスを公開している訳でもなければ、テストの自動化でもなく、

ただ草を生やすための***継続的KUSA生やしBot*** なので、CI/CDパイプラインを作ったった！とは言わないようにします。

なんちゃってCI/CDくらいのイメージだと個人的に思っていますのでご了承ください。


# 準備
みなさんの環境でもすぐ動かせる流れを記載します。ご自身で手を動かしてみたい方も、是非ご参考ください。

## Forkしてくる


こちら（https://github.com/ishidao0910/kusa-bot) に飛んでいただいて、

[![Image from Gyazo](https://i.gyazo.com/2caf978e593622311499ad6ccb554068.png)](https://gyazo.com/2caf978e593622311499ad6ccb554068)

こちらからご自身のgithubにコピーしてください。

Forkが完了すると、ご自身のレポジトリにkusa-botが追加されていると思います。
[![Image from Gyazo](https://i.gyazo.com/524904adb3fb402b463c119efe20b588.png)](https://gyazo.com/524904adb3fb402b463c119efe20b588)

## Github Actions有効化
ここは初めてGithub Actionsを使う方向けですが、これを使うためにはGithubでActionsを有効にする必要があります。

https://qiita.com/1915keke/items/8b18097d2981e88eca93

こちらの記事で丁寧に説明してくれているのでご参考ください。


## 環境変数の設定
Github Actionsでflowを正しく実行させるために、Actions secretsを設定する必要があります。

Forkしたレポジトリ内で、Settings > Secrets > Actionsに飛んでください。
[![Image from Gyazo](https://i.gyazo.com/3fe9ea5732bb3679c332551eee775542.png)](https://gyazo.com/3fe9ea5732bb3679c332551eee775542)

ここで、①New repository secretから```EMAIL```, ```USERNAME```をそれぞれご自身のgithubアカウントのもので作成してください。

(blank.ymlで利用します。)

作成したら②のようにキーが追加されると思います。

[![Image from Gyazo](https://i.gyazo.com/1493f58b4f203e4bf2b9f51472d3f6b4.png)](https://gyazo.com/1493f58b4f203e4bf2b9f51472d3f6b4)

## flowのテスト実行
kusa-botのActionsに飛んでいただくと、このような画面に出くわすかと思いますが、
```Enable workflow```をクリックしてから、```Run workflow```をクリックしてください。

![スクリーンショット 2022-05-29 11.02.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/845778/504add92-c8e6-3358-4d78-22d6ba3b6591.png)

出ない方はそのまま```Run workflow```を実行していただくと、実行中のworkflowが見えると思います。
[![Image from Gyazo](https://i.gyazo.com/ecc82f3e6be2502534fc0d851978ea5d.png)](https://gyazo.com/ecc82f3e6be2502534fc0d851978ea5d)

Jobが成功すると、レポジトリのReadMe.md最下部に、現在時刻のBTC/JPY価格が追記されていると思います。

cronの設定もしているので、Jobが成功したらやることおしまい！



# 中身の解説
やりたいことを編集できるように、中身を軽く解説しようと思います。

## pythonスクリプト

実行タイミングでのBTC/JPYの価格を、README.mdに追記するスクリプトです。

1. 通貨選択してページにアクセス
1. 静的ファイルを解析して、通貨データを取得
1. ```add_txt```という変数にstr型で結果を格納
1. Readmeの中身を読み込んで、```add_txt```を追記

この流れで書きました。

```python
import datetime
from bs4 import BeautifulSoup
import urllib.request as req

d_today = datetime.date.today()


# 通貨設定
crypto = 'BTC'
currency = 'JPY'

# スクレイピングページ
url = 'https://coinyep.com/ja/ex/' + crypto + '-' + currency

# 取得結果
current_value = ''

# 取得先URLにアクセス
res = req.urlopen(url)

# 対象を抽出
soup = BeautifulSoup(res, 'html.parser');
values = soup.select_one("#coinyep-reverse1").findAll(text=True)
current_value = str(''.join(values))
current_value = current_value.replace('1 ' + crypto + ' = ', '')
current_value = current_value.replace(' ' + currency, '')

# 取得結果
add_txt = '<br>' + str(d_today) + ' 1' + crypto + '(' + currency + '): ' + str(current_value)

file_path = "README.md"
 
with open(file_path, "r") as file:
    txt = file.read()
    txt = txt + add_txt
    print(txt)

with open(file_path, 'w') as file:
    file.write(txt)
```

スクレイピング先のwebページはこちらを指定しています。

https://coinyep.com/

スクレイピングをする上で、規約やルールなどいろいろ注意が必要ですが、
規約等も特になく、商用利用する訳でもないので良かろうと判断しました。


## Github Actions Flow
Github Actionsのワークフローは、ymlファイルで管理することができます。

- workflow_dispatchで、GUIでの手動テストボタンを追加する
- cronはUTCなので、01:00を指定すると日本時間10:00/amに実行される
- Ubuntuの上にpython実行環境を立てる(pythonは3.9を使用)
- Commit and Pushで、変更差分をcommit→push

こんなことをしています。

```yml
name: write today's jpy-btc

on:
  workflow_dispatch:
  schedule:
    - cron: 0 1 * * * #JST 10:00

jobs:
  build:
    name: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - name: Setup Python
        uses: actions/setup-python@v2
        with:
          python-version: "3.9"

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install requests
          pip install bs4

      - name: Run btc_jpy.py
        run: |
          python btc_jpy.py

      - name: Commit and Push
        run: |
          echo commit and push
          git config --local user.email ${{ secrets.EMAIL }}
          git config --local user.name ${{ secrets.USERNAME }}
          git add . 
          git commit -m "write today's btc-jpy"
          git pull
          git push origin main
```

# 最後に
Github Actionsのcronジョブが水物だという情報は、ググっていてもよく見つかるのですが、

私自身も実際にcronしてみるまでは半信半疑でした。

JST10:00に設定しているはずのジョブが、2時間遅れで実行されたので、正確な定期実行にcronは向かなそうですが。今回の目的としては毎日1草最低限生やすことだったので、よしとしましょう。


この記事を読んでお困りのことがあれば、気軽にissue立てるなり、コメントいただけたらと思います。

ご精読ありがとうございました！!