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 2 #14072

Closed
wants to merge 22 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
f4c9d51
Split out lib functions into their own file
HenryNguyen5 Aug 6, 2024
fa4e192
Create issue enforcement option
HenryNguyen5 Aug 6, 2024
2279c26
chore: Update detect-solidity-file-changes action to detect changes i…
HenryNguyen5 Aug 6, 2024
9286531
Setup solidity-jira workflow
HenryNguyen5 Aug 6, 2024
43880b5
fixup! Create issue enforcement option
HenryNguyen5 Aug 6, 2024
167d3ef
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 6, 2024
ff4b0bc
TEST: Isolate jira workflow
HenryNguyen5 Aug 6, 2024
bb45c6c
Revert "chore: Update detect-solidity-file-changes action to detect c…
HenryNguyen5 Aug 6, 2024
215943f
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 6, 2024
149b6f7
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 7, 2024
c60c8bf
Merge branch 'develop' of https://github.com/smartcontractkit/chainli…
HenryNguyen5 Aug 7, 2024
d3f7cf1
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 7, 2024
dd8fb31
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 7, 2024
e410138
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 7, 2024
db16045
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 7, 2024
b79bd02
fixup! Setup solidity-jira workflow
HenryNguyen5 Aug 7, 2024
1b604a6
TEST: Trigger solidity jira
HenryNguyen5 Aug 7, 2024
6a9b46f
Update jira script
HenryNguyen5 Aug 7, 2024
6eb7f08
fixup! Update jira script
HenryNguyen5 Aug 7, 2024
0a441da
fixup! Update jira script
HenryNguyen5 Aug 7, 2024
6d9bdc1
fixup! Update jira script
HenryNguyen5 Aug 7, 2024
f232ee7
Cleanup conditionals
HenryNguyen5 Aug 7, 2024
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