GitHub 操作:如果项目中已经存在问题,则不要运行作业

时间:2021-07-16 10:37:48

标签: github-actions cicd github-issues github-projects

有没有办法检测项目中是否已经存在问题,例如 if: ${{ !contains(github.event.issue.projects.*.name, 'Board') }}

这是我的情况:我有一个操作,它会自动将新问题移动到我的项目“Board”中。但是,只有当新问题不在“Board”项目中时,才应运行此操作。

这是当前的操作:

name: new-issue-automation

on:
  issues:
    types: [opened]
    
env:
  BOARD_NAME: "Board"

jobs:
  move-new-issues-to-backlog:
    # We don't want to move P0 issues to the backlog column
    if: ${{ !contains(github.event.issue.labels.*.name, 'P0') }}
    runs-on: ubuntu-latest
    steps:
      - uses: alex-page/github-project-automation-plus@v0.8.0
        with:
          project: ${{ env.BOARD_NAME }}
          column: "Backlog"
          # The normal GITHUB_TOKEN should have enough permission to edit the board. However, it seems so, 
          # that there is a GitHub bug. As a workaround we add an Personal GitHub Token (Nils Token)
          repo-token: ${{ secrets.PROJECT_AUTOMATION_PLUS_TOKEN }}

但是我查看了 GitHub Context 的属性,并没有“project”属性:

{
  "token": "***",
  "job": "one",
  "ref": "refs/heads/main",
  "sha": "a53e94dd74818acf6dcc60a433488b4573008867",
  "repository": "nilsreichardt/playground",
  "repository_owner": "nilsreichardt",
  "repositoryUrl": "git://github.com/nilsreichardt/playground.git",
  "run_id": "1033281712",
  "run_number": "1",
  "retention_days": "90",
  "actor": "nilsreichardt",
  "workflow": ".github/workflows/issue_test.yml",
  "head_ref": "",
  "base_ref": "",
  "event_name": "issues",
  "event": {
    "action": "opened",
    "issue": {
      "active_lock_reason": null,
      "assignee": null,
      "assignees": [],
      "author_association": "OWNER",
      "body": "",
      "closed_at": null,
      "comments": 0,
      "comments_url": "https://api.github.com/repos/nilsreichardt/playground/issues/19/comments",
      "created_at": "2021-07-15T08:53:48Z",
      "events_url": "https://api.github.com/repos/nilsreichardt/playground/issues/19/events",
      "html_url": "https://github.com/nilsreichardt/playground/issues/19",
      "id": 945154403,
      "labels": [],
      "labels_url": "https://api.github.com/repos/nilsreichardt/playground/issues/19/labels{/name}",
      "locked": false,
      "milestone": null,
      "node_id": "MDU6SXNzdWU5NDUxNTQ0MDM=",
      "number": 19,
      "performed_via_github_app": null,
      "repository_url": "https://api.github.com/repos/nilsreichardt/playground",
      "state": "open",
      "title": "test",
      "updated_at": "2021-07-15T08:53:48Z",
      "url": "https://api.github.com/repos/nilsreichardt/playground/issues/19",
      "user": {
        "avatar_url": "https://avatars.githubusercontent.com/u/24459435?v=4",
        "events_url": "https://api.github.com/users/nilsreichardt/events{/privacy}",
        "followers_url": "https://api.github.com/users/nilsreichardt/followers",
        "following_url": "https://api.github.com/users/nilsreichardt/following{/other_user}",
        "gists_url": "https://api.github.com/users/nilsreichardt/gists{/gist_id}",
        "gravatar_id": "",
        "html_url": "https://github.com/nilsreichardt",
        "id": 24459435,
        "login": "nilsreichardt",
        "node_id": "MDQ6VXNlcjI0NDU5NDM1",
        "organizations_url": "https://api.github.com/users/nilsreichardt/orgs",
        "received_events_url": "https://api.github.com/users/nilsreichardt/received_events",
        "repos_url": "https://api.github.com/users/nilsreichardt/repos",
        "site_admin": false,
        "starred_url": "https://api.github.com/users/nilsreichardt/starred{/owner}{/repo}",
        "subscriptions_url": "https://api.github.com/users/nilsreichardt/subscriptions",
        "type": "User",
        "url": "https://api.github.com/users/nilsreichardt"
      }
    },
[...]

有没有办法在一个动作中检查项目?

1 个答案:

答案 0 :(得分:0)

正如@GuiFalourd 所建议的,我可以使用 GitHub API(我需要使用 GraphQL API,因为 REST API 不显示问题的链接项目)来首先检查,如果问题已经在板上。

这是我的完整工作流程:

name: new-issue-automation

on:
  issues:
    types: [opened]
    
jobs:
  move-new-issues-to-backlog:
    # We not want to move P0 issues to the backlog column
    if: ${{ !contains(github.event.issue.labels.*.name, 'P0') }}
    runs-on: ubuntu-latest
    env:
      BOARD_NAME: "Board"
      OWNER: ${{ github.repository_owner }}
      REPO: ${{ github.event.repository.name }}
      ISSUE: ${{ github.event.issue.number }}
    steps:
      - name: Check if issue is already in "${{ env.BOARD_NAME }}"
        run: |
          if curl -i -H 'Content-Type: application/json' -H "Authorization: bearer ${{ secrets.GITHUB_TOKEN }}" -X POST -d '{"query": "query($issue: Int!, $owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { issue(number: $issue) { projectCards { nodes { project { name } } } } } } ", "variables" : "{ \"issue\": '${ISSUE}', \"owner\": \"'${OWNER}'\", \"repo\": \"'${REPO}'\" }" }' https://api.github.com/graphql | grep "\b$BOARD_NAME\b"; then
            echo "Issue is already in Project '$BOARD_NAME', cancelling this workflow";
            echo "ALREADY_IN_BOARD=true" >> $GITHUB_ENV
          else
            echo "Issue is not in project '$BOARD_NAME', adding it to $BOARD_NAME."
            echo "ALREADY_IN_BOARD=false" >> $GITHUB_ENV
          fi
      - uses: alex-page/github-project-automation-plus@v0.8.0
        if: ${{ env.ALREADY_IN_BOARD == 'false' }}
        with:
          project: ${{ env.BOARD_NAME }}
          column: "Backlog"
          # The normal GITHUB_TOKEN can not be used inside a private repo. So we
          # have to use a Personal GitHub Token. See more information:
          # https://github.com/alex-page/github-project-automation-plus#personal-access-token
          repo-token: ${{ secrets.PROJECT_AUTOMATION_PLUS_TOKEN }}