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

2287 語
11 分
【GitHub】PythonとGitHub ActionsでProjectsにIssuesを作る作業を自動化する(後編:GitHub Actionの内容)

はじまり#

リサちゃん avatar
リサちゃん
私は、ふと思った。日々のタスクをGitHub上で管理したいと。しかし、GitHubのissuesを登録する時にいちいちオプションを選択して入力する手間が面倒くさい。そして、GitHub Projectsでも管理したいけど、その場合は尚更である。
135ml avatar
135ml
ふむふむ、どうしたどうした。
リサちゃん avatar
リサちゃん
ということで、GitHub IssuesとGitHub Projectsを一気に登録するツールとかないですか!?
135ml avatar
135ml
作ってみますかぁ。第2弾だ!

今回、取り組んだこと#

今回は、自分がリポジトリ内に用意したCSVのタイトルと内容を読み取って、その内容をGitHub Projects内にカードとして登録させるツールです。

例えば、このようにCSVを編集しておいて、・・・

このGitHub Actionsが動くと、CSV内のレコード数と同じ数のワークフローファイルが作成されます。

そして、色々動いた後に、このようにkanban形式内でcardが登録されます。Issueも登録されています。

システム構成#

ざっと、今回のツールのシステム構成を書きます。

概要図はこんな感じです。

ざっくりした流れは以下の感じです。

  1. Issueを作るために、Pythonファイルを動かすGitHub Actionsが動く。(夜中の4時に設定)
  2. Pythonファイルが動いて、Issueを作るためのGitHub Actionsのワークフローファイルが作成される。
  3. そのワークフローファイルは、そのPythonファイルが動いた10分後に起動する。
  4. ワークフローファイルが起動。Issueに登録したと同時にGitHub Projectsにもカードを追加する。
  5. その日に登録した分のワークフローファイルとCSVの内容を削除するために、Pythonファイルを動かすGitHub Actionsが動く。(1. の30分後に設定。設定処理は、2. で行っていた。)
  6. Pythonファイルが動いて、ワークフローファイルとCSVの内容を削除する。

流れと概要図を対応させるとこんな感じです。

今回作ったツールの肝となるGitHub Actionsがこれです。GitHub公式のものみたいなので、長い期間利用できそうです。

imjohnbo
/
issue-bot
Waiting for api.github.com...
00K
0K
0K
Waiting...

GitHub Actionsの中身#

今回は、後編として、GitHub Actionsを設定しているYAMLファイルの中身を見ていきたいと思います。

ちなみに、前編はこの記事に上がっています。この記事を見るほうが流れを汲み取りやすいかなと思います。

まず、ワークフローファイルがあるフォルダ構成はこの様になっています。

赤い部分は、デフォルトで用意するファイルで、 青い部分は、generateWfForIssues.ymlを実行することで、生成されるワークフローファイルになっています。 この青い部分のファイルはPythonファイル上で作成されています。そして、それらのワークフローファイルを作成する元になるのが、generateIssues.ymlになります。

と、少し解説したところで、GitHub Actionsの処理の流れは以下になります。

  1. generateWfForIssues.ymlを実行して、Issuesを生成するためのワークフローファイル(青い部分のファイル群)を作成する。
  2. 青い部分のファイル群をcron実行して、IssuesとProjectのカードを生成する。
  3. 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のカードに登録していきます。このアクションには、色々とオプションを設定できます。

その設定できるオプションに対して、このように設定しています。

Noオプション説明
1titleIssuesのタイトルです。今回は、CSVのtitleフィールドの値を入れています。
2labelsラベルです。デフォルトだと、「bug」とか「enhanced」とかあるやつです。今回は、「book」とか「blog」とかを指定しています。
3templatesIssues作成時に利用できるテンプレートMarkdownを指定します。ぶっちゃけ、登録する内容が毎回異なるので、指定はしていますが実際のところ使っていません。
4projectプロジェクト。IDで指定します。
5columnプロジェクトのkanbanのカラム。「To do」とか「Done」とか。(カラム名は空白文字が無いほうが良いです。結局設定の仕方が分かりませんでした。)
6milestoneプロジェクトごとに設定できるマイルストーン
7bodyIssuesの内容(Description)です。

さらに、Issue、ProjectおよびMarkdownテンプレートがある画面と番号を照らし合わせてみてみます。

これがIssueのページになります。

これがProjectのページ。

これがMarkdownテンプレートがある画面になります。

また、projectmilestoneの値は、これらの値が対応して、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)

行っていることは以下になります。

  1. AM4:00にcron起動する。
  2. リポジトリからチェックアウト。
  3. Python環境をセットアップ。
  4. 依存先をインストール。
  5. generate_workflow_to_make_issue.pyを実行する。
  6. git設定する。
  7. git addgit commitgit pushする。

大体の処理の説明は割愛しますが、「リポジトリからチェックアウト」の部分の設定で僕自身がハマったので、ここだけ説明します。

このワークフローでは、ワークフローファイルをpushするのですが、そのためにこの工程で権限をしっかり開放してあげないとエラーになります。 設定するのは、GitHub上で、SettingsDevelpper settingsPersonal 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

おしまい#

135ml avatar
135ml
とまあ、前回のPython編に引き続き、2回に渡って今回のツールに関して紹介してきました!
リサちゃん avatar
リサちゃん
これで、GitHub Issuesへのタスクの入力がだいぶ楽になるかもしれん!

補足#

Pythonの中身の方を解説した記事はこちらです。

今回のツールのソースを載せたリポジトリが、以下にあります。

landmaster135
/
generateIssueWf_Dev
Waiting for api.github.com...
00K
0K
0K
Waiting...

以上になります!

記事を共有

この記事が役に立ったなら、ぜひ他の人と共有してください!

【GitHub】PythonとGitHub ActionsでProjectsにIssuesを作る作業を自動化する(後編:GitHub Actionの内容)
https://endorphinbath.com/posts/github-action-automake-issue-to-projects-latter/
著者
kinkinbeer135ml
公開日
2022-04-08
ライセンス
CC BY-NC-SA 4.0
関連記事 スマート
1
【GitHub】PythonとGitHub ActionsでProjectsにIssuesを作る作業を自動化する(前編:Pythonのソース)
Code 日々のタスクをGitHub IssuesおよびGitHub Projectsで管理する時に登録する作業が面倒くさいと思います。いちいちオプションを選択して入力する手間が面倒くさいと思います。本記事では、その作業を省略したツールを紹介します。
2
【GitHub】Pythonでリポジトリの情報を取得するCloud Functionsを作る
Code Pythonを使用してGitHubリポジトリの情報を取得し、Cloud Functionsで処理する方法に関する記事です。PyGithubとThreadingで実装および処理を効率的にしました。
3
【GitHub】Goでリポジトリの情報を取得するCloud Functionsを作って、Pythonと比較する
Code Go言語でGitHubのリポジトリ情報を取得するCloud Functionsを開発し、Pythonで作成した同様の機能と比較した記事です。使ったツールや、並行処理の比較も行っています。
4
【Python】文字列の先頭と末尾にあるスペース、空白文字を削除する
Code Pythonで文字列の先頭と末尾にスペース(空白文字)が混じっていることがあります。そのスペースを削除するスクリプトを掲載します。
5
【GitHub】「github-readme-stats」と「github-profile-trophy」でGitHubをゴージャスに見せる
Code GitHubのプロフィール画面を豪華にするために、README.mdをいじりました。けっこう簡単にゴージャスになります。手が空いた時に設定してみて下さい。
ランダム記事 ランダム
Profile Image of the Author
kinkinbeer135ml
SIerをやめて、プログラミングを勉強しています。※Amazonアソシエイトに参加しています。
お知らせ
私のブログへようこそ!これはサンプルのお知らせです。
音楽
カバー

音楽

再生中なし

0:00 0:00
歌詞なし
カテゴリ
タグ
サイト統計
記事
287
カテゴリー
8
タグ
93
総文字数
486,174
運用日数
0
最終活動
0 日前

目次