Search code examples
github-actionscicdgithub-issuesgithub-projects

GitHub Actions: Do not run a job, if issue is already in project


Is there a way to detect, if an issue is already in a project, like if: ${{ !contains(github.event.issue.projects.*.name, 'Board') }}?

This is my situation: I have an action, which moves automatically new issues into my project "Board". But this action should only should run if the new issue isn't in the project "Board" already.

This is the currenct action:

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/[email protected]
        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 }}

But I watched into the attributes of the GitHub Context and there is no "project" attribute:

{
  "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"
      }
    },
[...]

Is there a way to check the project in an action?


Solution

  • As @GuiFalourd suggested, can I use the GitHub API (I needed to use the GraphQL API, because the REST API does not show the linked projects of an issue) to check first, if the issue is already in the board.

    Here is my full workflow:

    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/[email protected]
            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 }}