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

release/test skipping #14071

Closed
wants to merge 21 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
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
77 changes: 77 additions & 0 deletions .github/scripts/jira/enforce-jira-issue.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import * as core from "@actions/core";
import jira from "jira.js";
import { createJiraClient, parseIssueNumberFrom } from "./lib";

async function doesIssueExist(
client: jira.Version3Client,
issueNumber: string,
dryRun: boolean
) {
const payload = {
issueIdOrKey: issueNumber,
};

if (dryRun) {
core.info("Dry run enabled, skipping JIRA issue enforcement");
return true;
}

try {
/**
* The issue is identified by its ID or key, however, if the identifier doesn't match an issue, a case-insensitive search and check for moved issues is performed.
* If a matching issue is found its details are returned, a 302 or other redirect is not returned. The issue key returned in the response is the key of the issue found.
*/
const issue = await client.issues.getIssue(payload);
core.debug(
`JIRA issue id:${issue.id} key: ${issue.key} found while querying for ${issueNumber}`
);
if (issue.key !== issueNumber) {
core.error(
`JIRA issue key ${issueNumber} not found, but found issue key ${issue.key} instead`
);
return false;
}

return true;
} catch (e) {
core.debug(e as any);
return false;
}
}

async function main() {
const prTitle = process.env.PR_TITLE;
const commitMessage = process.env.COMMIT_MESSAGE;
const branchName = process.env.BRANCH_NAME;
const dryRun = !!process.env.DRY_RUN;
const client = createJiraClient();

// Checks for the Jira issue number and exit if it can't find it
const issueNumber = parseIssueNumberFrom(prTitle, commitMessage, branchName);
if (!issueNumber) {
const msg =
"No JIRA issue number found in PR title, commit message, or branch name. This pull request must be associated with a JIRA issue.";

core.setFailed(msg);
return;
}

const exists = await doesIssueExist(client, issueNumber, dryRun);
if (!exists) {
core.setFailed(`JIRA issue ${issueNumber} not found, this pull request must be associated with a JIRA issue.`);
return;
}
}

async function run() {
try {
await main();
} catch (error) {
if (error instanceof Error) {
return core.setFailed(error.message);
}
core.setFailed(error as any);
}
}

run();
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { expect, describe, it } from "vitest";
import { parseIssueNumberFrom, tagsToLabels } from "./update-jira-issue";
import { parseIssueNumberFrom, tagsToLabels } from "./lib";

describe("parseIssueNumberFrom", () => {
it("should return the first JIRA issue number found", () => {
Expand All @@ -18,6 +18,17 @@ describe("parseIssueNumberFrom", () => {
expect(r).to.equal("CORE-123");
});

it("works with multiline commit bodies", () => {
const r = parseIssueNumberFrom(
`This is a multiline commit body

CORE-1011`,
"CORE-456",
"CORE-789"
);
expect(r).to.equal("CORE-1011");
});

it("should return undefined if no JIRA issue number is found", () => {
const result = parseIssueNumberFrom("No issue number");
expect(result).to.be.undefined;
Expand Down
63 changes: 63 additions & 0 deletions .github/scripts/jira/lib.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@

import * as core from '@actions/core'
import * as jira from 'jira.js'

/**
* Given a list of strings, this function will return the first JIRA issue number it finds.
*
* @example parseIssueNumberFrom("CORE-123", "CORE-456", "CORE-789") => "CORE-123"
* @example parseIssueNumberFrom("2f3df5gf", "chore/test-RE-78-branch", "RE-78 Create new test branches") => "RE-78"
*/
export function parseIssueNumberFrom(
...inputs: (string | undefined)[]
): string | undefined {
function parse(str?: string) {
const jiraIssueRegex = /[A-Z]{2,}-\d+/;

return str?.toUpperCase().match(jiraIssueRegex)?.[0];
}

core.debug(`Parsing issue number from: ${inputs.join(", ")}`);
const parsed: string[] = inputs.map(parse).filter((x) => x !== undefined);
core.debug(`Found issue number: ${parsed[0]}`);

return parsed[0];
}

/**
* Converts an array of tags to an array of labels.
*
* A label is a string that is formatted as `core-release/{tag}`, with the leading `v` removed from the tag.
*
* @example tagsToLabels(["v1.0.0", "v1.1.0"]) => [{ add: "core-release/1.0.0" }, { add: "core-release/1.1.0" }]
*/
export function tagsToLabels(tags: string[]) {
const labelPrefix = "core-release";

return tags.map((t) => ({
add: `${labelPrefix}/${t.substring(1)}`,
}));
}

export function createJiraClient() {
const jiraHost = process.env.JIRA_HOST;
const jiraUserName = process.env.JIRA_USERNAME;
const jiraApiToken = process.env.JIRA_API_TOKEN;

if (!jiraHost || !jiraUserName || !jiraApiToken) {
core.setFailed(
"Error: Missing required environment variables: JIRA_HOST and JIRA_USERNAME and JIRA_API_TOKEN."
);
process.exit(1);
}

return new jira.Version3Client({
host: jiraHost,
authentication: {
basic: {
email: jiraUserName,
apiToken: jiraApiToken,
},
},
});
}
4 changes: 3 additions & 1 deletion .github/scripts/jira/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
"pnpm": ">=9"
},
"scripts": {
"start": "tsx update-jira-issue.ts"
"issue:update": "tsx update-jira-issue.ts",
"issue:enforce": "tsx enforce-jira-issue.ts",
"test": "vitest"
},
"dependencies": {
"@actions/core": "^1.10.1",
Expand Down
59 changes: 1 addition & 58 deletions .github/scripts/jira/update-jira-issue.ts
Original file line number Diff line number Diff line change
@@ -1,40 +1,6 @@
import * as core from "@actions/core";
import jira from "jira.js";

/**
* Given a list of strings, this function will return the first JIRA issue number it finds.
*
* @example parseIssueNumberFrom("CORE-123", "CORE-456", "CORE-789") => "CORE-123"
* @example parseIssueNumberFrom("2f3df5gf", "chore/test-RE-78-branch", "RE-78 Create new test branches") => "RE-78"
*/
export function parseIssueNumberFrom(
...inputs: (string | undefined)[]
): string | undefined {
function parse(str?: string) {
const jiraIssueRegex = /[A-Z]{2,}-\d+/;

return str?.toUpperCase().match(jiraIssueRegex)?.[0];
}

const parsed: string[] = inputs.map(parse).filter((x) => x !== undefined);

return parsed[0];
}

/**
* Converts an array of tags to an array of labels.
*
* A label is a string that is formatted as `core-release/{tag}`, with the leading `v` removed from the tag.
*
* @example tagsToLabels(["v1.0.0", "v1.1.0"]) => [{ add: "core-release/1.0.0" }, { add: "core-release/1.1.0" }]
*/
export function tagsToLabels(tags: string[]) {
const labelPrefix = "core-release";

return tags.map((t) => ({
add: `${labelPrefix}/${t.substring(1)}`,
}));
}
import { tagsToLabels, createJiraClient, parseIssueNumberFrom } from "./lib";

function updateJiraIssue(
client: jira.Version3Client,
Expand Down Expand Up @@ -64,29 +30,6 @@ function updateJiraIssue(
return client.issues.editIssue(payload);
}

function createJiraClient() {
const jiraHost = process.env.JIRA_HOST;
const jiraUserName = process.env.JIRA_USERNAME;
const jiraApiToken = process.env.JIRA_API_TOKEN;

if (!jiraHost || !jiraUserName || !jiraApiToken) {
core.setFailed(
"Error: Missing required environment variables: JIRA_HOST and JIRA_USERNAME and JIRA_API_TOKEN."
);
process.exit(1);
}

return new jira.Version3Client({
host: jiraHost,
authentication: {
basic: {
email: jiraUserName,
apiToken: jiraApiToken,
},
},
});
}

async function main() {
const prTitle = process.env.PR_TITLE;
const commitMessage = process.env.COMMIT_MESSAGE;
Expand Down
17 changes: 0 additions & 17 deletions .github/workflows/auto-update.yml

This file was deleted.

101 changes: 0 additions & 101 deletions .github/workflows/automation-benchmark-tests.yml

This file was deleted.

Loading
Loading