初めに
みなさん草生やしてますかーー!!!!
Githubが日常に入り込んできてから、いろいろな人のレポジトリを見るようになったのですが、草がたくさん生えてる方のProfileって映えてますよね。
あくまでも見た目です。開発力があるかどうかはそれだけではわからない。
けど、なんとなくすごそうに見えるのがあの草だと思ってます。
あとコード書くのが好きなんだろうなーってのも伝わる?気がしますね。
一日最低1lineは開発をしているのかなと思いきや、毎日なんらかの差分をpushする流れを定期実行できるようにしてしまえば、旅行に行こうと開発できなかろうと草は生やせることに気がつきました。
前置きはいいから先にコードを見せろ! という方、是非こちらからどうぞ。
このqiita記事を読むことで、あなたも明日からプロフィールを草だらけにできることでしょう。
(あくまでも生やすだけなので、自己満足の領域は超えないことをしっかり胸に刻み込みましょう。)
せっかくなので少しでも価値あるものを
とはいえ、毎日訳のわからない差分を無理やり生み出してcommit → pushするのも味気ない。と、思ったので今回は
BTC/JPY通貨の、Job実行タイミングでの価格を毎日記録してpushする
この流れをGithubActionsで自動化してみようと思います。
今回の実行イメージはこんな感じ。!
補足
確かにGithubActionsは、CI/CDツールとして有名ですが、今回実装するcronジョブは、CI/CDの定義からは若干離れているような気がします。
サービスを公開している訳でもなければ、テストの自動化でもなく、
ただ草を生やすための継続的KUSA生やしBot なので、CI/CDパイプラインを作ったった!とは言わないようにします。
なんちゃってCI/CDくらいのイメージだと個人的に思っていますのでご了承ください。
準備
みなさんの環境でもすぐ動かせる流れを記載します。ご自身で手を動かしてみたい方も、是非ご参考ください。
Forkしてくる
こちら(https://github.com/ishidao0910/kusa-bot) に飛んでいただいて、
こちらからご自身のgithubにコピーしてください。
Forkが完了すると、ご自身のレポジトリにkusa-botが追加されていると思います。
Github Actions有効化
ここは初めてGithub Actionsを使う方向けですが、これを使うためにはGithubでActionsを有効にする必要があります。
こちらの記事で丁寧に説明してくれているのでご参考ください。
環境変数の設定
Github Actionsでflowを正しく実行させるために、Actions secretsを設定する必要があります。
Forkしたレポジトリ内で、Settings > Secrets > Actionsに飛んでください。
ここで、①New repository secretからEMAIL
, USERNAME
をそれぞれご自身のgithubアカウントのもので作成してください。
(blank.ymlで利用します。)
作成したら②のようにキーが追加されると思います。
flowのテスト実行
kusa-botのActionsに飛んでいただくと、このような画面に出くわすかと思いますが、
Enable workflow
をクリックしてから、Run workflow
をクリックしてください。
出ない方はそのままRun workflow
を実行していただくと、実行中のworkflowが見えると思います。
Jobが成功すると、レポジトリのReadMe.md最下部に、現在時刻のBTC/JPY価格が追記されていると思います。
cronの設定もしているので、Jobが成功したらやることおしまい!
中身の解説
やりたいことを編集できるように、中身を軽く解説しようと思います。
pythonスクリプト
実行タイミングでのBTC/JPYの価格を、README.mdに追記するスクリプトです。
- 通貨選択してページにアクセス
- 静的ファイルを解析して、通貨データを取得
-
add_txt
という変数にstr型で結果を格納 - Readmeの中身を読み込んで、
add_txt
を追記
この流れで書きました。
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ページはこちらを指定しています。
スクレイピングをする上で、規約やルールなどいろいろ注意が必要ですが、
規約等も特になく、商用利用する訳でもないので良かろうと判断しました。
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
こんなことをしています。
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立てるなり、コメントいただけたらと思います。
ご精読ありがとうございました!!