- はじまり
- 今回、取り組んだこと
- システム構成
- GitHub Actionsの中身
- 1-1.「generateWfForIssues.yml」を実行して、Issuesを生成するためのワークフローファイル(青い部分のファイル群)を作成する。(「generateIssues.yml」の解説)
- 1-2.「generateWfForIssues.yml」を実行して、Issuesを生成するためのワークフローファイル(青い部分のファイル群)を作成する。(「generateWfForIssues.yml」の解説)
- 2.青い部分のファイル群をcron実行して、IssuesとProjectのカードを生成する。
- 3.「removeWfForIssuesAndCsvContent.yml」を実行して、生成したissuesの元となったCSVやワークフローファイルを削除する。
- おしまい
- 補足
はじまり
私は、ふと思った。日々のタスクをGitHub上で管理したいと。
しかし、GitHubのissuesを登録する時にいちいちオプションを選択して入力する手間が面倒くさい。そして、GitHub Projectsでも管理したいけど、その場合は尚更である。
ふむふむ、どうしたどうした。
ということで、GitHub IssuesとGitHub Projectsを一気に登録するツールとかないですか!?
ほうほうほう・・・、よーし、分かった。やってやろうじゃないか!
では、今回は、そんなことが出来るツールの詳細について紹介するぞ!
第2弾だ!
Workflowだ〜!
今回、取り組んだこと
今回は、自分がリポジトリ内に用意したCSVのタイトルと内容を読み取って、その内容をGitHub Projects内にカードとして登録させるツールです。
例えば、このようにCSVを編集しておいて、・・・
このGitHub Actionsが動くと、CSV内のレコード数と同じ数のワークフローファイルが作成されます。
そして、色々動いた後に、このようにkanban形式内でcardが登録されます。Issueも登録されています。
システム構成
ざっと、今回のツールのシステム構成を書きます。
概要図はこんな感じです。
ざっくりした流れは以下の感じです。
- Issueを作るために、Pythonファイルを動かすGitHub Actionsが動く。(夜中の4時に設定)
- Pythonファイルが動いて、Issueを作るためのGitHub Actionsのワークフローファイルが作成される。
- そのワークフローファイルは、そのPythonファイルが動いた10分後に起動する。
- ワークフローファイルが起動。Issueに登録したと同時にGitHub Projectsにもカードを追加する。
- その日に登録した分のワークフローファイルとCSVの内容を削除するために、Pythonファイルを動かすGitHub Actionsが動く。(1. の30分後に設定。設定処理は、2. で行っていた。)
- Pythonファイルが動いて、ワークフローファイルとCSVの内容を削除する。
流れと概要図を対応させるとこんな感じです。
今回作ったツールの肝となるGitHub Actionsがこれです。GitHub公式のものみたいなので、長い期間利用できそうです。
GitHub Actionsの中身
今回は、後編として、GitHub Actionsを設定しているYAMLファイルの中身を見ていきたいと思います。
ちなみに、前編はこの記事に上がっています。この記事を見るほうが流れを汲み取りやすいかなと思います。
まず、ワークフローファイルがあるフォルダ構成はこの様になっています。
赤い部分は、デフォルトで用意するファイルで、
青い部分は、「generateWfForIssues.yml」を実行することで、生成されるワークフローファイルになっています。
この青い部分のファイルはPythonファイル上で作成されています。そして、それらのワークフローファイルを作成する元になるのが、「generateIssues.yml」になります。
と、少し解説したところで、GitHub Actionsの処理の流れは以下になります。
- 「generateWfForIssues.yml」を実行して、Issuesを生成するためのワークフローファイル(青い部分のファイル群)を作成する。
- 青い部分のファイル群をcron実行して、IssuesとProjectのカードを生成する。
- 「removeWfForIssuesAndCsvContent.yml」を実行して、生成したissuesの元となったCSVやワークフローファイルを削除する。
1-1.「generateWfForIssues.yml」を実行して、Issuesを生成するためのワークフローファイル(青い部分のファイル群)を作成する。(「generateIssues.yml」の解説)
まず、「generateWfForIssues.yml」を実行して、ワークフローファイルを作成するのですが、そのために「generateIssues.yml」が何をしているのかを知る必要があります。
この「generateIssues.yml」自体は実行されないワークフローファイルになるのですが、ワークフローファイル生成のために必要なものになります。
中身はこんな感じで、これを元に編集してワークフローファイルを作成します。
詳しい編集内容は、Python編の方でご確認ください。
name: Generate issues
on:
workflow_dispatch:
jobs:
generate_issues:
name: Generate Issues
runs-on: ubuntu-latest
steps:
# Repo code checkout required if `template` is used
- name: Checkout
uses: actions/checkout@v2
# https://stackoverflow.com/a/60942437
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y/%m/%d')"
- name: Scheduled Issue to landmaster135
uses: imjohnbo/issue-bot@v3.3.6
with:
title: ${{ steps.date.outputs.date }}_(txtのタイトルが入る)
assignees: "landmaster135" # Github Account name without @.
labels: "book"
pinned: false
close-previous: false
template: ".github/ISSUE_TEMPLATE/custom.md"
project: 1
column: Todo
milestone: 1
body: description1
env:
GITHUB_TOKEN: ${{ secrets.ISSUEBOT_TOKEN }}
「Get current date」のstepは、念の為残しているだけで、今回の処理には全く使用しません。以降の処理の「title」に使用されていますが、実際にIssuesを作成する時は使用しません。
「uses: imjohnbo/issue-bot@v3.3.6」のGitHub Actionsを使って、IssuesとProjectのカードに登録していきます。このアクションには、色々とオプションを設定できます。
その設定できるオプションに対して、このように設定しています。
# | オプション | 説明 |
---|---|---|
1 | title | Issuesのタイトルです。今回は、CSVのtitleフィールドの値を入れています。 |
2 | labels | ラベルです。デフォルトだと、「bug」とか「enhanced」とかあるやつです。 今回は、「book」とか「blog」とかを指定しています。 |
3 | templates | Issues作成時に利用できるテンプレートMarkdownを指定します。 ぶっちゃけ、登録する内容が毎回異なるので、指定はしていますが実際のところ使っていません。 |
4 | project | プロジェクト。IDで指定します。 |
5 | column | プロジェクトのkanbanのカラム。「To do」とか「Done」とか。 (カラム名は空白文字が無いほうが良いです。結局設定の仕方が分かりませんでした。) |
6 | milestone | プロジェクトごとに設定できるマイルストーン |
7 | body | Issuesの内容(Description)です。 |
さらに、Issue、ProjectおよびMarkdownテンプレートがある画面と番号を照らし合わせてみてみます。
これがIssueのページになります。
これがProjectのページ。
これがMarkdownテンプレートがある画面になります。
また、「project」と「milestone」の値は、これらの値が対応して、Issuesのオプションが登録されます。
project
milestone
1-2.「generateWfForIssues.yml」を実行して、Issuesを生成するためのワークフローファイル(青い部分のファイル群)を作成する。(「generateWfForIssues.yml」の解説)
先程、「generateIssues.yml」を解説しました。
次に、大元の「generateWfForIssues.yml」の中身に関して解説します。
このワークフローの中身はこうなっています。
name: Generate workflow files to make issue
on:
workflow_dispatch:
schedule:
- cron: '0 19 * * *' # At 04:00. – https://crontab.guru
jobs:
generate_workflows:
name: Generate workflow files
runs-on: ubuntu-latest
steps:
# Repo code checkout required if `template` is used
- name: Checkout
uses: actions/checkout@v2
with:
token: ${{ secrets.ISSUEBOT_TOKEN }}
- name: Setup Python
uses: actions/setup-python@v3
with:
python-version: '3.8'
architecture: 'x64'
- name: Get Python version
run: python -V
- name: Install dependencies
run: pip install --no-cache-dir -r requirements.txt
working-directory: ./generateIssueWf
- name: Run Python
run: python generate_workflow_to_make_issue.py
working-directory: ./generateIssueWf
- name: git setting
run: |
git config --local user.email "52403447+landmaster135@users.noreply.github.com"
git config --local user.name "landmaster135"
- name: git commit
run: |
git log -1
git add .github/workflows/generateIssues_*.yml
git add .github/workflows/generatedWfFiles.txt
git add .github/workflows/removeWfForIssuesAndCsvContent.yml
git diff --cached --quiet || (git commit -m "Generate workflow to make issues" && git push origin master)
行っていることは以下になります。
- AM4:00にcron起動する。
- リポジトリからチェックアウト。
- Python環境をセットアップ。
- 依存先をインストール。
- 「generate_workflow_to_make_issue.py」を実行する。
- git設定する。
- git add → git commit → git pushする。
大体の処理の説明は割愛しますが、「リポジトリからチェックアウト」の部分の設定で僕自身がハマったので、ここだけ説明します。
このワークフローでは、ワークフローファイルをpushするのですが、そのためにこの工程で権限をしっかり開放してあげないとエラーになります。
設定するのは、GitHub上で、「Settings」>「Develpper settings」>「Personal access tokens」で発行したトークンなのですが、この「workflow」の箇所にチェックを付けましょう。
そうしないと、ワークフローファイルをpushできません。
あとは、working-directoryを忘れないようにしましょう!
2.青い部分のファイル群をcron実行して、IssuesとProjectのカードを生成する。
ワークフローファイルを作成したので、それがcron実行されます。
例として、以下のような感じになります。
name: Generate issues
on:
workflow_dispatch:
schedule:
- cron: '40 6 * * *' # https://crontab.guru
jobs:
donelist_generate:
name: Friday Standup
runs-on: ubuntu-latest
steps:
# Repo code checkout required if `template` is used
- name: Checkout
uses: actions/checkout@v2
# https://stackoverflow.com/a/60942437
- name: Get current date
id: date
run: echo "::set-output name=date::$(date +'%Y/%m/%d')"
- name: Scheduled Issue to landmaster135
uses: imjohnbo/issue-bot@v3.3.6
with:
title: FP
assignees: "landmaster135" # Github Account name without @.
labels: "book"
pinned: false
close-previous: false
template: ".github/ISSUE_TEMPLATE/custom.md"
project: 1
column: Todo
milestone: 6
body: 参考書2冊保持済み
env:
GITHUB_TOKEN: ${{ secrets.ISSUEBOT_TOKEN }}
3.「removeWfForIssuesAndCsvContent.yml」を実行して、生成したissuesの元となったCSVやワークフローファイルを削除する。
そして、最後に、Issuesを作成したワークフローファイルとそれの元となったCSVファイルの内容などを削除します。
ここでも、チェックアウトのときのトークン設定に気を付けます。そうしないと、ワークフローファイルを削除することが出来ません。
name: Remove workflow files making issue
on:
workflow_dispatch:
schedule:
- cron: '30 4 * * *' # https://crontab.guru
jobs:
remove_workflows:
name: Remove workflow files
runs-on: ubuntu-latest
steps:
# Repo code checkout required if `template` is used
- name: Checkout
uses: actions/checkout@v2
with:
token: ${{ secrets.ISSUEBOT_TOKEN }}
- name: Setup Python
uses: actions/setup-python@v3
with:
python-version: '3.8'
architecture: 'x64'
- name: Get Python version
run: python -V
- name: Install dependencies
run: pip install --no-cache-dir -r requirements.txt
working-directory: ./generateIssueWf
- name: Run Python
run: python remove_workflow_files_making_issue.py
working-directory: ./generateIssueWf
- name: git setting
run: |
git config --local user.email "52403447+landmaster135@users.noreply.github.com"
git config --local user.name "landmaster135"
- name: git commit
run: |
git log -1
git rm .github/workflows/generateIssues_*.yml
git add .github/workflows/generatedWfFiles.txt
git add ./generateIssueWf/*.csv -u
git diff --cached --quiet || (git commit -m "Remove workflow making issues" && git push origin master)
ちなみに、この部分は、その日に登録するIssuesがなかったら、コメントアウトされます。
schedule:
- cron: '30 4 * * *' # https://crontab.guru
コメントアウトして、「removeWfForIssuesAndCsvContent.yml」が実行されないようにします。
# schedule:
# - cron: '30 4 * * *' # https://crontab.guru
おしまい
とまあ、前回のPython編に引き続き、2回に渡って今回のツールに関して紹介してきました!
意外と大所帯になったね・・・。しかし、ありがとうございます!
これで、GitHub Issuesへのタスクの入力がだいぶ楽になりました!
うい〜。ではまた〜。
補足
Pythonの中身の方を解説した記事はこちらになっているので、よければ見てみてください!
今回のツールのソースを載せたリポジトリが、以下にあります。
以上になります!
コメント