Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add logging to project automations #3404

Merged
merged 19 commits into from
Dec 19, 2023
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
e356aab
Add detailed `console.log` statements for enhanced debugging in GitHu…
Proibito04 Nov 27, 2023
680d771
temp update of console.log
Proibito04 Nov 28, 2023
77b75a6
Refactor logging to use `@actions/core` and remove redundant logs
Proibito04 Nov 28, 2023
ce70e6f
Remove `debug` import from issues.mjs
Proibito04 Nov 28, 2023
723183f
Merge branch 'main' into issue_3396
Proibito04 Nov 28, 2023
f1d96e9
Merge branches 'issue_3396' and 'issue_3396' of github.com:Proibito04…
Proibito04 Nov 28, 2023
c05900f
Merge branch 'main' into issue_3396
Proibito04 Nov 30, 2023
df83e81
Pass `core` to from YAML to `main` to `Project`
dhruvkb Dec 1, 2023
8742c21
Use `this.core` to log info, error and debug lines
dhruvkb Dec 1, 2023
e2394a9
Refactored Project class, updated moveCard and YAML files
Proibito04 Dec 2, 2023
ed58894
Applied suggested changes in issue.mjs and projects.mjs.
Proibito04 Dec 2, 2023
ec5fea3
Merge branch 'main' into issue_3396
Proibito04 Dec 4, 2023
917929e
Merge branch 'main' into issue_3396
Proibito04 Dec 5, 2023
9556346
Applied suggested changes in issue.mjs and projects.mjs.
Proibito04 Dec 11, 2023
12a56a9
Merge branch 'issue_3396' of github.com:Proibito04/openverse into iss…
Proibito04 Dec 11, 2023
51cccf6
Merge branch 'main' of https://github.com/WordPress/openverse into is…
dhruvkb Dec 14, 2023
b99d5ed
Add more logging
dhruvkb Dec 14, 2023
e7ecf6c
Dedent code and increase logging
dhruvkb Dec 14, 2023
9c58a2d
Add more `info` and `debug` logs
dhruvkb Dec 14, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/issue_automations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,4 @@ jobs:
github-token: ${{ secrets.ACCESS_TOKEN }}
script: |
const { main } = await import('${{ github.workspace }}/automations/js/src/project_automation/issues.mjs')
await main(github, context)
await main(github, core, context)
2 changes: 1 addition & 1 deletion .github/workflows/pr_automations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,4 @@ jobs:
github-token: ${{ secrets.ACCESS_TOKEN }}
script: |
const { main } = await import('${{ github.workspace }}/automations/js/src/project_automation/prs.mjs')
await main(github)
await main(github, core)
Proibito04 marked this conversation as resolved.
Show resolved Hide resolved
126 changes: 77 additions & 49 deletions automations/js/src/project_automation/issues.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,85 +7,113 @@ import { getBoard } from '../utils/projects.mjs'
* @param issue {import('@octokit/rest')}
* @param board {import('../utils/projects.mjs').Project}
* @param card {import('../utils/projects.mjs').Card}
* @param core {import('@actions/core')} for logging
*/
async function syncPriority(issue, board, card) {
async function syncPriority(issue, board, card, core) {
Proibito04 marked this conversation as resolved.
Show resolved Hide resolved
core.debug(`Starting syncPriority for issue: ${issue.number}`)
Proibito04 marked this conversation as resolved.
Show resolved Hide resolved
const priority = issue.labels.find((label) =>
label.name.includes('priority')
)?.name

if (priority) {
await board.setCustomChoiceField(card.id, 'Priority', priority)
await board.setCustomChoiceField(card.id, 'Priority', priority, core)
}
if (priority === '🟥 priority: critical') {
await board.moveCard(card.id, board.columns.ToDo)
await board.moveCard(card.id, board.columns.ToDo, core)
}
}

/**
* This is the entrypoint of the script.
*
* @param octokit {import('@octokit/rest').Octokit} the Octokit instance to use
* @param core {import('@actions/core')} GitHub Actions toolkit, for logging
* @param context {import('@actions/github').context} info about the current event
*/
export const main = async (octokit, context) => {
export const main = async (octokit, core, context) => {
const { EVENT_ACTION: eventAction } = process.env

core.debug(`Event action received: ${eventAction}`)

const issue = context.payload.issue
const label = context.payload.label
core.info('Issue details:', issue)

if (issue.labels.some((label) => label.name === '🧭 project: thread')) {
// Do not add project threads to the Backlog board.
core.warning('Issue is a project thread. Exiting.')
Proibito04 marked this conversation as resolved.
Show resolved Hide resolved
process.exit(0)
}

const backlogBoard = await getBoard(octokit, 'Backlog')
await core.group('Processing Issue or PR', async () => {
core.debug('Getting instance for the project')
const backlogBoard = await getBoard(octokit, core, 'Backlog')

// Create new, or get the existing, card for the current issue.
const card = await backlogBoard.addCard(issue.node_id)
core.debug('Adding the issue or PR to the project')
const card = await backlogBoard.addCard(issue.node_id)

switch (eventAction) {
case 'opened':
case 'reopened': {
if (issue.labels.some((label) => label.name === '⛔ status: blocked')) {
await backlogBoard.moveCard(card.id, backlogBoard.columns.Blocked)
} else {
await backlogBoard.moveCard(card.id, backlogBoard.columns.Backlog)
}

await syncPriority(issue, backlogBoard, card)
break
}
switch (eventAction) {
case 'opened':
case 'reopened':
Proibito04 marked this conversation as resolved.
Show resolved Hide resolved
core.info('Issue opened or reopened')
Proibito04 marked this conversation as resolved.
Show resolved Hide resolved
if (issue.labels.some((label) => label.name === '⛔ status: blocked')) {
await backlogBoard.moveCard(
card.id,
backlogBoard.columns.Blocked,
core
)
} else {
await backlogBoard.moveCard(
card.id,
backlogBoard.columns.Backlog,
core
)
}
await syncPriority(issue, backlogBoard, card, core)
break

case 'closed': {
if (issue.state_reason === 'completed') {
await backlogBoard.moveCard(card.id, backlogBoard.columns.Done)
} else {
await backlogBoard.moveCard(card.id, backlogBoard.columns.Discarded)
}
break
}
case 'closed':
core.info('Issue closed')
if (issue.state_reason === 'completed') {
await backlogBoard.moveCard(card.id, backlogBoard.columns.Done, core)
} else {
await backlogBoard.moveCard(
card.id,
backlogBoard.columns.Discarded,
core
)
}
break

case 'assigned': {
if (card.status === backlogBoard.columns.Backlog) {
await backlogBoard.moveCard(card.id, backlogBoard.columns.ToDo)
}
break
}
case 'assigned':
core.info('Issue assigned')
if (card.status === backlogBoard.columns.Backlog) {
await backlogBoard.moveCard(card.id, backlogBoard.columns.ToDo, core)
}
break

case 'labeled': {
if (label.name === '⛔ status: blocked') {
await backlogBoard.moveCard(card.id, backlogBoard.columns.Blocked)
}
await syncPriority(issue, backlogBoard, card)
break
}
case 'labeled':
core.info(`Issue labeled: ${label.name}`)
if (label.name === '⛔ status: blocked') {
await backlogBoard.moveCard(
card.id,
backlogBoard.columns.Blocked,
core
)
}
await syncPriority(issue, backlogBoard, card, core)
break

case 'unlabeled': {
if (label.name === '⛔ status: blocked') {
// TODO: Move back to the column it came from.
await backlogBoard.moveCard(card.id, backlogBoard.columns.Backlog)
}
await syncPriority(issue, backlogBoard, card)
break
case 'unlabeled':
core.info(`Label removed: ${label.name}`)
if (label.name === '⛔ status: blocked') {
await backlogBoard.moveCard(
card.id,
backlogBoard.columns.Backlog,
core
)
}
await syncPriority(issue, backlogBoard, card, core)
break
}
}
})
}
141 changes: 76 additions & 65 deletions automations/js/src/project_automation/prs.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,97 +3,108 @@ import { readFileSync } from 'fs'
import { getBoard } from '../utils/projects.mjs'
import { PullRequest } from '../utils/pr.mjs'

/**
* Move the PR to the right column based on the number of reviews.
*
* @param pr {PullRequest}
* @param prBoard {Project}
* @param prCard {Card}
*/
async function syncReviews(pr, prBoard, prCard) {
async function syncReviews(pr, prBoard, prCard, core) {
core.debug(`Synchronizing reviews for PR: ${pr.nodeId}`)
const reviewDecision = pr.reviewDecision
const reviewCounts = pr.reviewCounts
core.debug(`Review decision: ${reviewDecision}`)

if (reviewDecision === 'APPROVED') {
await prBoard.moveCard(prCard.id, prBoard.columns.Approved)
} else if (reviewDecision === 'CHANGES_REQUESTED') {
await prBoard.moveCard(prCard.id, prBoard.columns.ChangesRequested)
} else if (reviewCounts.APPROVED === 1) {
await prBoard.moveCard(prCard.id, prBoard.columns.Needs1Review)
} else {
await prBoard.moveCard(prCard.id, prBoard.columns.Needs2Reviews)
}
await core.group(
`Handling review decision for PR: ${pr.nodeId}`,
async () => {
if (reviewDecision === 'APPROVED') {
await prBoard.moveCard(prCard.id, prBoard.columns.Approved, core)
} else if (reviewDecision === 'CHANGES_REQUESTED') {
await prBoard.moveCard(
prCard.id,
prBoard.columns.ChangesRequested,
core
)
} else if (pr.reviewCounts.APPROVED === 1) {
await prBoard.moveCard(prCard.id, prBoard.columns.Needs1Review, core)
} else {
await prBoard.moveCard(prCard.id, prBoard.columns.Needs2Reviews, core)
}
}
)
}

/**
* Move all linked issues to the specified column.
*
* @param pr {PullRequest}
* @param backlogBoard {Project}
* @param destColumn {string}
*/
async function syncIssues(pr, backlogBoard, destColumn) {
async function syncIssues(pr, backlogBoard, destColumn, core) {
core.debug(`Synchronizing linked issues for PR: ${pr.nodeId}`)
for (let linkedIssue of pr.linkedIssues) {
const issueCard = await backlogBoard.addCard(linkedIssue)
await backlogBoard.moveCard(issueCard.id, backlogBoard.columns[destColumn])
await core.group(`Processing linked issue: ${linkedIssue}`, async () => {
core.debug('Adding linked issue to board')
const issueCard = await backlogBoard.addCard(linkedIssue)
await backlogBoard.moveCard(
issueCard.id,
backlogBoard.columns[destColumn],
core
)
})
}
}

/**
* This is the entrypoint of the script.
*
* @param octokit {import('@octokit/rest').Octokit} the Octokit instance to use
* @param core {import('@actions/core')} GitHub Actions toolkit, for logging
*/
export const main = async (octokit) => {
export const main = async (octokit, core) => {
core.debug('Starting PR script')

const { eventName, eventAction, prNodeId } = JSON.parse(
readFileSync('/tmp/event.json', 'utf-8')
)
core.debug(
`Event details - Name: ${eventName}, Action: ${eventAction}, PR Node ID: ${prNodeId}`
)

const pr = new PullRequest(octokit, prNodeId)
await pr.init()

const prBoard = await getBoard(octokit, 'PRs')
const backlogBoard = await getBoard(octokit, 'Backlog')
const prBoard = await getBoard(octokit, core, 'PRs')
const backlogBoard = await getBoard(octokit, core, 'Backlog')

// Create new, or get the existing, card for the current pull request.
const prCard = await prBoard.addCard(pr.nodeId)
core.debug(`PR card created or fetched: ${prCard.id}`)

if (eventName === 'pull_request_review') {
await syncReviews(pr, prBoard, prCard)
} else {
switch (eventAction) {
case 'opened':
case 'reopened': {
if (pr.isDraft) {
await prBoard.moveCard(prCard.id, prBoard.columns.Draft)
} else {
await core.group('Processing PR based on event action', async () => {
if (eventName === 'pull_request_review') {
await syncReviews(pr, prBoard, prCard)
} else {
switch (eventAction) {
case 'opened':
case 'reopened': {
core.debug('PR opened or reopened')
if (pr.isDraft) {
await prBoard.moveCard(prCard.id, prBoard.columns.Draft, core)
} else {
await syncReviews(pr, prBoard, prCard)
}
await syncIssues(pr, backlogBoard, 'InProgress')
break
}
case 'edited': {
await syncIssues(pr, backlogBoard, 'InProgress')
break
}
case 'converted_to_draft': {
await prBoard.moveCard(prCard.id, prBoard.columns.Draft, core)
break
}
case 'ready_for_review': {
core.debug('PR ready for review')
await syncReviews(pr, prBoard, prCard)
break
}
await syncIssues(pr, backlogBoard, 'InProgress')
break
}

case 'edited': {
await syncIssues(pr, backlogBoard, 'InProgress')
break
}

case 'converted_to_draft': {
await prBoard.moveCard(prCard.id, prBoard.columns.Draft)
break
}

case 'ready_for_review': {
await syncReviews(pr, prBoard, prCard)
break
}

case 'closed': {
if (!pr.isMerged) {
await syncIssues(pr, backlogBoard, 'Backlog')
case 'closed': {
core.debug('PR closed')
if (!pr.isMerged) {
await syncIssues(pr, backlogBoard, 'Backlog')
}
break
}
break
}
}
}
})
}
Loading