From f132eb7aac9e538c8a258a3829730e73f2b7f469 Mon Sep 17 00:00:00 2001 From: Takayuki WATANABE Date: Fri, 25 Sep 2020 09:42:40 +0900 Subject: [PATCH 1/2] Add label based routing example --- examples/label-based-routing.yml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 examples/label-based-routing.yml diff --git a/examples/label-based-routing.yml b/examples/label-based-routing.yml new file mode 100644 index 0000000..78f4b48 --- /dev/null +++ b/examples/label-based-routing.yml @@ -0,0 +1,27 @@ +name: Add a new GitHub Project card to the specified project column based on issue labels +on: [issues] +jobs: + github-actions-automate-projects: + runs-on: ubuntu-latest + steps: + - name: add-new-issues-to-sre-tech-radar-project + uses: docker://takanabe/github-actions-automate-projects:latest + if: github.event_name == 'issues' && github.event.action == 'opened' && contains(github.event.issue.labels.*.name, 'Category:Tech Radar') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PROJECT_URL: https://github.com/ORGANIXATION/REPOSITORY/projects/3 + GITHUB_PROJECT_COLUMN_NAME: Backlog + - name: add-new-kaizen-to-sre-kanban + uses: docker://takanabe/github-actions-automate-projects:latest + if: github.event_name == 'issues' && github.event.action == 'opened' && contains(github.event.issue.labels.*.name, 'Type:Kaizen') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PROJECT_URL: https://github.com/ORGANIXATION/REPOSITORY/projects/4 + GITHUB_PROJECT_COLUMN_NAME: Kaizen Backlog + - name: add-new-toil-to-sre-kanban + uses: docker://takanabe/github-actions-automate-projects:latest + if: github.event_name == 'issues' && github.event.action == 'opened' && contains(github.event.issue.labels.*.name, 'Type:Toil') + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GITHUB_PROJECT_URL: https://github.com/ORGANIXATION/REPOSITORY/projects/4 + GITHUB_PROJECT_COLUMN_NAME: Toil Backlog From 39df63c740a472514914fbf53a575086764a8d18 Mon Sep 17 00:00:00 2001 From: Adrian Lai Date: Tue, 23 Mar 2021 14:16:43 +0000 Subject: [PATCH 2/2] Support moving project cards between columns A bit hacky. Github API doesn't allow for easy retrieval of the project card id given an issue id. --- main.go | 73 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 58 insertions(+), 15 deletions(-) diff --git a/main.go b/main.go index 3eced28..e04660d 100644 --- a/main.go +++ b/main.go @@ -24,22 +24,7 @@ func main() { os.Exit(0) } - // eventID stores issue ID or pull-request ID - var eventID int64 var err error - if eventName == "issues" { - payload := issueEventPayload() - eventID, err = extractIssueID(payload) - errCheck(err) - } else if eventName == "pull_request" { - payload := pullRequestEventPayload() - eventID, err = extractPullRequestID(payload) - errCheck(err) - } - - infoLog("Payload for %s extract correctly", eventName) - debugLog("Target event ID: %d\n", eventID) - client, ctx := getGitHubClient() url := os.Getenv("GITHUB_PROJECT_URL") @@ -56,6 +41,24 @@ func main() { parentResource, parentName, err := projectParentName(url) errCheck(err) + // eventID stores issue ID or pull-request ID + var eventID int64 + var projectCards []*github.ProjectCard + if eventName == "issues" { + payload := issueEventPayload() + eventID, err = extractIssueID(payload) + errCheck(err) + projectCards, err = getProjectCardsFromIssue(ctx, client, payload.Issue, parentResource, parentName) + errCheck(err) + } else if eventName == "pull_request" { + payload := pullRequestEventPayload() + eventID, err = extractPullRequestID(payload) + errCheck(err) + } + + infoLog("Payload for %s extract correctly", eventName) + debugLog("Target event ID: %d\n", eventID) + var pjID int64 if pjType == "repository" { pjID, err = projectIDByRepo(ctx, client, url, parentResource, parentName) @@ -78,6 +81,21 @@ func main() { columnID, err := projectColumnID(ctx, client, pjID, pjColumn) errCheck(err) + for _, card := range projectCards { + if *card.ProjectID == pjID { + // Check card still exists + // Ignore errors - if the card has been deleted, we want to respect the workflow and create it + c, _, _ := client.Projects.GetProjectCard(ctx, *card.ID) + if c == nil { + continue + } + infoLog("Project card is being moved to column %s\n", pjColumn) + err = moveCardInProject(ctx, client, columnID, card) + errCheck(err) + os.Exit(0) + } + } + infoLog("Project card is being added to column %s\n", pjColumn) //// @@ -269,3 +287,28 @@ func validateGitHubResponse(res *github.Response, err error) error { } return nil } + +func getProjectCardsFromIssue(ctx context.Context, client *github.Client, issue *github.Issue, owner string, repo string) ([]*github.ProjectCard, error) { + cards := []*github.ProjectCard{} + // TODO: Pagination, but let's assume any project will be in the first set of results. + events, resp, err := client.Issues.ListIssueEvents(ctx, owner, repo, *issue.Number, nil) + err = validateGitHubResponse(resp, err) + if err != nil { + return cards, err + } + for _, event := range events { + if event.ProjectCard != nil { + cards = append(cards, event.ProjectCard) + } + } + return cards, nil +} + +func moveCardInProject(ctx context.Context, client *github.Client, columnID int64, card *github.ProjectCard) error { + resp, err := client.Projects.MoveProjectCard(ctx, *card.ID, &github.ProjectCardMoveOptions{ColumnID: columnID, Position: "top"}) + err = validateGitHubResponse(resp, err) + if err != nil { + return err + } + return nil +}