练习 - 在 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_COMMENT/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 脚本,可对打开的新问题创建全面的响应。 此响应还基于存储库中的模板,因此将来可以轻松更改它。 最后,你还包含了一个触发器,用于将问题添加到项目板,以便轻松对其进行分类以备将来工作使用。