练习 - 在 GitHub Actions 中使用 GitHub 脚本

已完成

在本单元中,你将详细了解如何使用 GitHub 脚本改进工作流。

向项目板添加问题

除了使用 octokit/rest.js 创建注释和打开拉取请求外,还可以使用 octokit/rest.js 来管理 GitHub 项目。 在以下代码示例中,将创建一个工作流,每当任何人向存储库添加新问题时,都会运行该工作流。 这会将问题添加到项目看板,使你更轻松地对工作进行分类和排序。

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"
            });

每当创建新问题时,此工作流的第一部分都会创建一条注释,该过程在上一单元中已介绍。 下一部分将基于此问题创建卡片,并将其添加到项目板。

将工作流分解为若干步骤

使用操作的一个好处是,可以将作业分成称为 步骤的较小工作单元。 在上面的示例工作流中,可以将此工作流分为两个步骤。

将当前工作流分解为多个步骤的一个优点是,它使你能够使用表达式来应用逻辑。 使用步骤使你能够围绕何时允许运行步骤创建规则,并有助于优化工作流运行。

将示例工作流分解为若干步骤:

  • 命名每个步骤,以便你可以从动作选项卡跟踪它。
  • 使用表达式确定步骤是否应运行(可选)。

在此示例中,原始工作流文件中的两个任务分为各个步骤:

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 语句,该语句指定仅当项目板标记 bug时,才应将问题添加到项目板。

使用 Node.js 环境

GitHub 脚本还授予你对完整 Node.js 环境的访问权限。 虽然不建议使用 GitHub 脚本编写复杂作的逻辑,但你可以使用它向 octo/rest.js API 添加更多功能。

例如,每当打开问题时,可以使用 Node.js 显示贡献指南。 可以使用 Node.js 文件系统读取文件,并将其用作问题注释的正文。 若要访问存储库中的文件,请将 actions/checkout 操作作为工作流中的第一步包含在内。

以下示例对工作流文件进行了以下更改:

  • 添加action/checkout操作以读取位于.github/ISSUE_RESPONSES/comment.md的模板化响应文件
  • 添加 JavaScript,以使用 Node.js 文件系统模块将模板化响应的内容作为问题注释的正文
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 脚本帮助你创建对新问题的全面响应。 此响应也基于存储库中的模板,因此可以轻松更改。 最后,你还包含了一个触发器,用于将问题添加到项目板,以便轻松对其进行分类以备将来工作使用。