【GitHub】PythonとGitHub ActionsでProjectsにIssuesを作る作業を自動化する(後編:GitHub Actionの内容)
はじまり




今回、取り組んだこと
今回は、自分がリポジトリ内に用意した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 issueson: 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のカードに登録していきます。このアクションには、色々とオプションを設定できます。
その設定できるオプションに対して、このように設定しています。
| No | オプション | 説明 |
|---|---|---|
| 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 issueon: 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 issueson: 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 issueon: 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の中身の方を解説した記事はこちらです。

今回のツールのソースを載せたリポジトリが、以下にあります。
以上になります!
記事を共有
この記事が役に立ったなら、ぜひ他の人と共有してください!