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

Code

はじまり

リサちゃん
リサちゃん

私は、ふと思った。日々のタスクをGitHub上で管理したいと。

しかし、GitHubのissuesを登録する時にいちいちオプションを選択して入力する手間が面倒くさい。そして、GitHub Projectsでも管理したいけど、その場合は尚更である。

135ml
135ml

ふむふむ、どうしたどうした。

リサちゃん
リサちゃん

ということで、GitHub IssuesとGitHub Projectsを一気に登録するツールとかないですか!?

135ml
135ml

ほうほうほう・・・、よーし、分かった。やってやろうじゃないか!

では、今回は、そんなことが出来るツールの詳細について紹介するぞ!

第2弾だ!

リサちゃん
リサちゃん

Workflowだ〜!

今回、取り組んだこと

今回は、自分がリポジトリ内に用意した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公式のものみたいなので、長い期間利用できそうです。

GitHub - imjohnbo/issue-bot: GitHub Actions powered Issue Bot 🦾
GitHub Actions powered Issue Bot 🦾. Contribute to imjohnbo/issue-bot development by creating an account on GitHub.

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のカードに登録していきます。このアクションには、色々とオプションを設定できます。

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

#オプション説明
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テンプレートがある画面になります。

また、「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)

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

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

おしまい

135ml
135ml

とまあ、前回のPython編に引き続き、2回に渡って今回のツールに関して紹介してきました!

リサちゃん
リサちゃん

意外と大所帯になったね・・・。しかし、ありがとうございます!

これで、GitHub Issuesへのタスクの入力がだいぶ楽になりました!

135ml
135ml

うい〜。ではまた〜。

補足

ペンギン
ペンギン

Pythonの中身の方を解説した記事はこちらになっているので、よければ見てみてください!

ペンギン
ペンギン

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

GitHub - landmaster135/generateIssueWf_Dev
Contribute to landmaster135/generateIssueWf_Dev development by creating an account on GitHub.

以上になります!

コメント

タイトルとURLをコピーしました