Skip to content

Commit

Permalink
Project Automation: set Roadmap project value on issue/pr close and…
Browse files Browse the repository at this point in the history
… Auto-type new issues (#389)

* Create action to set roadmap on close

* Update job name to be more descriptive

* [skip ci] fixing #408

* [skip ci] Undoing fix for #408, moving it to #387

* [skip ci] Add action to autoset issue type on open
  • Loading branch information
jarmak-nv authored Sep 7, 2023
1 parent ac161d7 commit c7eb05d
Show file tree
Hide file tree
Showing 2 changed files with 306 additions and 0 deletions.
129 changes: 129 additions & 0 deletions .github/workflows/project_automation_set_issue_type.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# SPDX-FileCopyrightText: Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Set Issue Type Single Select

on:
issues:
# Run this action when an issue is opened
types: [opened]

env:
ISSUE_NODE_ID: ${{ github.event.issue.node_id }}

# The environment vars below are hard-coded from external queries to save time + complexity here
# Note: PVT means Project V2, not "Private" - although this is a private project
# PVT = Project V2, PVTSSF = Project V2 Single Select Field, PVTIF = Project V2 Iteration Field
PROJECT_ID: "PVT_kwDOABpemM4AEhOI"
ISSUE_TYPE_FIELD_ID: "PVTSSF_lADOABpemM4AEhOIzgCzg-4"
BUG_OPTION_ID: "e7e7e23f"
FEATURE_OPTION_ID: "f8765953"
DOCS_OPTION_ID: "cb6cb7bf"
EPIC_OPTION_ID: "1d095615"
THEME_OPTION_ID: "22f101c0"

jobs:
update_issue_type_in_project:
runs-on: ubuntu-latest

steps:
- name: Sleep 1s
id: sleep_1s
run: sleep 1 # We sleep to ensure the issue is added to the project before we run this action

- name: Generate token
id: generate_token
uses: tibdex/github-app-token@v1.8.0
with:
app_id: ${{ secrets.CCCL_AUTH_APP_ID }}
private_key: ${{ secrets.CCCL_AUTH_APP_PEM }}

- name: Get Issue Project ID
id: get_issue_id
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
# Query up to 10 projects for the Issue
gh api graphql -f query='
query {
node(id: "${{ env.ISSUE_NODE_ID }}") {
... on Issue {
projectItems(first: 10) {
nodes {
id
project {
id
}
}
}
}
}
}' > project_data.json
# Filter the json result to only the project-specific ID for the PR
# An issue can be in multiple projects so we need to filter by the project ID we want
issue_id=$(jq -r '.data.node.projectItems.nodes[] |
select(.project.id == "${{ env.PROJECT_ID }}") |
.id' project_data.json)
echo "ISSUE_PROJECT_ID=$issue_id" >> $GITHUB_ENV
- name: Extract Issue Type Text
id: extract_issue_type
env:
ISSUE_TITLE: ${{ github.event.issue.title }}
run: |
# Extract the text between two brackets in the issue title
issue_type=$(echo "$ISSUE_TITLE" | grep -o '\[.*\]' | tr -d '[]')
# Set the issue type option ID based on the extracted text
if [ "$issue_type" == "BUG" ]; then
option_id=${{ env.BUG_OPTION_ID }}
elif [ "$issue_type" == "FEA" ]; then
option_id=${{ env.FEATURE_OPTION_ID }}
elif [ "$issue_type" == "DOC" ]; then
option_id=${{ env.DOCS_OPTION_ID }}
elif [ "$issue_type" == "EPIC" ]; then
option_id=${{ env.EPIC_OPTION_ID }}
elif [ "$issue_type" == "THEME" ]; then
option_id=${{ env.THEME_OPTION_ID }}
else
option_id="Undefined"
fi
echo "TYPE_OPTION_ID=$option_id" >> $GITHUB_ENV
- name: Set Issue Type
id: set_issue_type
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
if: ${{ env.TYPE_OPTION_ID }} != "Undefined"
run: |
# Mutation to update the Issue's Issue Type field
gh api graphql -f query='
mutation {
updateProjectV2ItemFieldValue(
input: {
projectId: "${{ env.PROJECT_ID }}"
itemId: "${{ env.ISSUE_PROJECT_ID }}"
fieldId: "${{ env.ISSUE_TYPE_FIELD_ID }}"
value: {
singleSelectOptionId: "${{ env.TYPE_OPTION_ID }}"
}
}
) {
projectV2Item {
id
}
}
}'
177 changes: 177 additions & 0 deletions .github/workflows/project_automation_set_roadmap.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,177 @@
# SPDX-FileCopyrightText: Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Set PR or Issue Roadmap Value on Close

on:
pull_request_target:
# Run this action when a PR is closed
types: [closed]
issues:
# Run this action when an issue is closed
types: [closed]

env:
ORG: ${{ github.event.repository.owner.login }}
PR_NUMBER: ${{ github.event.pull_request.number }} # evaluates to null for issues
ISSUE_NUMBER: ${{ github.event.issue.number }} # evaluates to null for PRs
REPO: ${{ github.event.repository.name }}

# The environment vars below are hard-coded from external queries to save time + complexity here
# Note: PVT means Project V2, not "Private"
# PVT = Project V2, PVTSSF = Project V2 Single Select Field, PVTIF = Project V2 Iteration Field
PROJECT_ID: "PVT_kwDOABpemM4AEhOI"
ROADMAP_FIELD_ID: "PVTSSF_lADOABpemM4AEhOIzgC_MXI"

jobs:
set_roadmap_value:
runs-on: ubuntu-latest

steps:
- name: Generate token
id: generate_token
uses: tibdex/github-app-token@v1.8.0
with:
app_id: ${{ secrets.CCCL_AUTH_APP_ID }}
private_key: ${{ secrets.CCCL_AUTH_APP_PEM }}

- name: Get PR Project ID
if: github.event_name == 'pull_request_target'
id: get_pr_id
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
# Query up to 10 projects for the PR
gh api graphql -f query='
query {
organization(login: "${{ env.ORG }}") {
repository(name: "${{ env.REPO }}") {
issueOrPullRequest(number: ${{ env.PR_NUMBER }}) {
... on PullRequest {
id
projectItems(first: 10) {
edges {
node {
id
project {
id
}
}
}
}
}
}
}
}
}' > project_data.json
# Filter the json result to only the project-specific ID for the PR
# A PR can be in multiple projects so we need to filter by the project ID we want
pr_id=$(jq -r '.data.organization.repository.issueOrPullRequest.projectItems.edges[] |
select(.node.project.id == "${{ env.PROJECT_ID }}") |
.node.id' project_data.json)
echo "ITEM_ID=$pr_id" >> $GITHUB_ENV
continue-on-error: true

- name: Get Issue Project ID
if: github.event_name == 'issues'
id: get_issue_id
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
# Query up to 10 projects for the Issue
gh api graphql -f query='
query {
organization(login: "${{ env.ORG }}") {
repository(name: "${{ env.REPO }}") {
issueOrPullRequest(number: ${{ env.ISSUE_NUMBER }}) {
... on Issue {
id
projectItems(first: 10) {
edges {
node {
id
project {
id
}
}
}
}
}
}
}
}
}' > project_data.json
# Filter the json result to only the project-specific ID for the PR
# A PR can be in multiple projects so we need to filter by the project ID we want
issue_id=$(jq -r '.data.organization.repository.issueOrPullRequest.projectItems.edges[] |
select(.node.project.id == "${{ env.PROJECT_ID }}") |
.node.id' project_data.json)
echo "ITEM_ID=$issue_id" >> $GITHUB_ENV
continue-on-error: true

- name: Get Current Release
id: get_current_release
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
# Get current roadmap id
# We maintain the roadmap as a single select field in the project, with the first value being the upcoming release
gh api graphql -f query='
query MyQuery {
node(id: "${{ env.PROJECT_ID }}") {
... on ProjectV2 {
id
field(name: "Roadmap") {
... on ProjectV2SingleSelectField {
id
options {
id
}
}
}
}
}
}' > roadmap_option_data.json
current_roadmap_option_id=$(jq -r '.data.node.field.options[0].id' roadmap_option_data.json)
echo "CURRENT_ROADMAP_OPTION_ID=$current_roadmap_option_id" >> $GITHUB_ENV
continue-on-error: true

- name: Set Item Roadmap
id: set_item_roadmap
env:
GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }}
run: |
# Update the PR status to In Review
gh api graphql -f query='
mutation {
updateProjectV2ItemFieldValue(
input: {
projectId: "${{ env.PROJECT_ID }}"
itemId: "${{ env.ITEM_ID }}"
fieldId: "${{ env.ROADMAP_FIELD_ID }}"
value: {
singleSelectOptionId: "${{ env.CURRENT_ROADMAP_OPTION_ID }}"
}
}
) {
projectV2Item {
id
}
}
}'
continue-on-error: true

0 comments on commit c7eb05d

Please sign in to comment.