演習 - GitHub Actions で GitHub スクリプトを使用する

完了

このユニットでは、GitHub スクリプトを使用してワークフローを改善する方法について詳しく学習します。

プロジェクト ボードに issue を追加する

octokit/rest.js を使用してコメントを作成し、pull request を開くことだけでなく、octokit/rest.js を使用して GitHub プロジェクトを管理することもできます。 次のコード サンプルでは、誰かが新しい issue をリポジトリに追加するたびに実行されるワークフローを作成します。 これにより、プロジェクト ボードに issue が追加され、作業のトリアージが容易になります。

name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: "🎉 You've created this issue comment using GitHub Script!!!"
            })
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

このワークフローの最初のセクションでは、前のユニットで説明した新しい issue が作成されるたびにコメントを作成します。 次のセクションでは、この issue に基づいてカードを作成し、プロジェクト ボードに追加します。

ワークフローをステップに分ける

アクションを使用する利点の 1 つは、ジョブをステップと呼ばれるより小さな作業単位に分割できることです。 前述のワークフロー例では、ワークフローを 2 つのステップに分けることができます。

現在のワークフローを複数のステップに分割する利点の 1 つは、式を使用してロジックを適用できることです。 ステップを使用すると、ステップの実行を許可するタイミングについてルールを作成することができ、ワークフロー実行の最適化に役立てることができます。

ワークフローの例をステップに分ける方法は次のとおりです。

  • 各ステップに名前を付け、[アクション] タブから追跡できるようにします。
  • 式を使用して、ステップを実行する必要があるかどうかを判断します (省略可能)。

この例では、元のワークフロー ファイル内の 2 つのタスクが個別のステップに分割されています。

name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - name: Comment on new issue
      uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: "🎉 You've created this issue comment using GitHub Script!!!"
            })
    - name: Add issue to project board
      if: contains(github.event.issue.labels.*.name, 'bug')
      uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

各ステップには、説明的な name 要素が含まれています。そのため、[アクション] タブから容易に追跡することができます。

Add issue to project board ステップには if ステートメントも含まれています。これは、issue に bug というラベルが付いている場合にのみ、それをプロジェクト ボードに追加する必要があることを指定します。

Node.js 環境を使用する

GitHub スクリプトからは、完全な Node.js 環境へのアクセス権も許可されます。 GitHub スクリプトは複雑なアクションのロジックの記述には推奨されませんが、それを使うことで、octo/rest.js API にさらに機能を追加できます。

例を 1 つ挙げるとすれば、issue が開かれるたびに Node.js を使用してコントリビューション ガイドを表示することです。 Node.js ファイル システムを使用すれば、ファイルを読み取り、それを issue に関するコメントの本文として使用できます。 リポジトリ内のファイルにアクセスするには、ワークフロー内の最初のステップとして actions/checkout アクションを含めます。

次の例では、ワークフロー ファイルに次の変更を加えます。

  • action/checkout アクションを追加して、.github/ISSUE_COMMENT/comment.md にあるテンプレート化された応答ファイルを読み取ります
  • Node.js ファイル システム モジュールを使用して、テンプレート化された応答の内容を issue コメントの本文として配置するように JavaScript を追加します
name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repo
        uses: actions/checkout@v2
      - name: Comment on new issue
        uses: actions/github-script@0.8.0
        with:
          github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
          script: |
             const fs = require('fs')
             const issueBody = fs.readFileSync(".github/ISSUE_RESPONSES/comment.md", "utf8")
             github.issues.createComment({
             issue_number: context.issue.number,
             owner: context.repo.owner,
             repo: context.repo.repo,
             body: issueBody
             })
      - name: Add issue to project board
        if: contains(github.event.issue.labels.*.name, 'bug')
        uses: actions/github-script@0.8.0
        with:
          github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
          script: |
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

GitHub スクリプトは、開かれている新しい issue に対する包括的な応答を作成するのに役立ちました。 この応答はリポジトリ内のテンプレートにも基づいているため、将来的には変更が簡単です。 最後に、issue をプロジェクト ボードに追加するためのトリガーも含めることで、将来の作業で簡単にトリアージできるようになりました。