Skip to content

Commit

Permalink
Merge origin/develop into master-sync
Browse files Browse the repository at this point in the history
  • Loading branch information
hjetpoluru committed Nov 22, 2024
2 parents a53a6dd + b6613df commit 94c6aa9
Show file tree
Hide file tree
Showing 734 changed files with 38,437 additions and 12,531 deletions.
33 changes: 31 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ workflows:
requires:
- prep-deps
- test-e2e-chrome-webpack:
<<: *develop_master_rc_only
requires:
- prep-build-test-webpack
- get-changed-files-with-git-diff
Expand All @@ -205,6 +206,7 @@ workflows:
- prep-build-test
- get-changed-files-with-git-diff
- test-e2e-firefox:
<<: *develop_master_rc_only
requires:
- prep-build-test-mv2
- get-changed-files-with-git-diff
Expand Down Expand Up @@ -234,6 +236,9 @@ workflows:
- test-e2e-mmi-playwright:
requires:
- prep-build-test-mmi-playwright
- test-e2e-swap-playwright - OPTIONAL:
requires:
- prep-build
- test-e2e-chrome-rpc-mmi:
requires:
- prep-build-test-mmi
Expand Down Expand Up @@ -351,6 +356,19 @@ workflows:
requires:
- prep-build-ts-migration-dashboard

rerun-from-failed:
when:
condition:
equal: ["<< pipeline.schedule.name >>", "rerun-from-failed"]
jobs:
- prep-deps
- rerun-workflows-from-failed:
filters:
branches:
only: develop
requires:
- prep-deps

locales_only:
when:
matches:
Expand Down Expand Up @@ -444,7 +462,7 @@ jobs:
- gh/install
- run:
name: Install dependencies
command: .circleci/scripts/install-dependencies.sh
command: yarn --immutable
- save_cache:
key: dependency-cache-{{ checksum "/tmp/YARN_VERSION" }}-{{ checksum "yarn.lock" }}
paths:
Expand Down Expand Up @@ -925,6 +943,17 @@ jobs:
paths:
- development/ts-migration-dashboard/build/final

rerun-workflows-from-failed:
executor: node-browsers-small
steps:
- run: *shallow-git-clone-and-enable-vnc
- run: sudo corepack enable
- attach_workspace:
at: .
- run:
name: Rerun workflows from failed
command: yarn ci-rerun-from-failed

test-yarn-dedupe:
executor: node-browsers-small
steps:
Expand Down Expand Up @@ -1192,7 +1221,7 @@ jobs:
at: .
- run:
name: test:e2e:single
command: .circleci/scripts/test-run-e2e.sh yarn test:e2e:single test/e2e/vault-decryption-chrome.spec.js --browser chrome
command: .circleci/scripts/test-run-e2e.sh yarn test:e2e:single test/e2e/vault-decryption-chrome.spec.ts --browser chrome
no_output_timeout: 5m
- store_artifacts:
path: test-artifacts
Expand Down
6 changes: 5 additions & 1 deletion .circleci/scripts/git-diff-develop.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ type PRInfo = {
ref: string;
};
body: string;
labels: { name: string }[];
};

/**
Expand Down Expand Up @@ -123,7 +124,7 @@ async function storeGitDiffOutputAndPrBody() {
fs.mkdirSync(CHANGED_FILES_DIR, { recursive: true });

console.log(
`Determining whether this run is for a PR targeting ${MAIN_BRANCH}`,
`Determining whether to run git diff...`,
);
if (!PR_NUMBER) {
console.log('Not a PR, skipping git diff');
Expand All @@ -140,6 +141,9 @@ async function storeGitDiffOutputAndPrBody() {
console.log(`This is for a PR targeting '${baseRef}', skipping git diff`);
writePrBodyToFile(prInfo.body);
return;
} else if (prInfo.labels.some(label => label.name === 'skip-e2e-quality-gate')) {
console.log('PR has the skip-e2e-quality-gate label, skipping git diff');
return;
}

console.log('Attempting to get git diff...');
Expand Down
42 changes: 0 additions & 42 deletions .circleci/scripts/install-dependencies.sh

This file was deleted.

211 changes: 211 additions & 0 deletions .circleci/scripts/rerun-ci-workflow-from-failed.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
const CIRCLE_TOKEN = process.env.API_V2_TOKEN;

interface Actor {
login: string;
avatar_url: string | null;
}

interface Trigger {
received_at: string;
type: string;
actor: Actor;
}

interface VCS {
origin_repository_url: string;
target_repository_url: string;
revision: string;
provider_name: string;
branch: string;
}

interface WorkflowItem {
id: string;
errors: string[];
project_slug: string;
updated_at: string;
number: number;
state: string;
created_at: string;
trigger: Trigger;
vcs: VCS;
}

interface CircleCIResponse {
next_page_token: string | null;
items: WorkflowItem[];
}

interface WorkflowStatusItem {
pipeline_id: string;
id: string;
name: string;
project_slug: string;
tag?: string;
status: string;
started_by: string;
pipeline_number: number;
created_at: string;
stopped_at: string;
}

interface WorkflowStatusResponse {
next_page_token: string | null;
items: WorkflowStatusItem[];
}

/**
* Fetches the last 20 CircleCI workflows for the given branch.
* Note: the API returns the first 20 workflows by default.
* If we wanted to get older workflows, we would need to use the 'page-token' we would get in the first response
* and perform a subsequent request with the 'page-token' parameter.
* This seems unnecessary as of today, as the amount of daily PRs merged to develop is not that high.
*
* @returns {Promise<WorkflowItem[]>} A promise that resolves to an array of workflow items.
* @throws Will throw an error if the CircleCI token is not defined or if the HTTP request fails.
*/
async function getCircleCiWorkflowsByBranch(branch: string): Promise<WorkflowItem[]> {
if (!CIRCLE_TOKEN) {
throw new Error('CircleCI token is not defined');
}

const url = `https://circleci.com/api/v2/project/github/${process.env.CIRCLE_PROJECT_USERNAME}/${process.env.CIRCLE_PROJECT_REPONAME}/pipeline?branch=${branch}`;
const options = {
method: 'GET',
headers: {
'Content-Type': 'application/json',
}
};

try {
const response = await fetch(url, options);
if (!response.ok) {
const errorBody = await response.text();
console.error('HTTP error response:', errorBody);
throw new Error(`HTTP error! status: ${response.status}`);
}
const body = await response.json();
console.log('Circle Ci workflows fetched successfully!');
return body.items;
} catch (error) {
console.error('Error:', error);
throw error;
}
}

/**
* Fetches the status of a specific CircleCI workflow.
*
* @param {string} workflowId - The ID of the workflow to fetch the status for.
* @returns {Promise<WorkflowStatusResponse>} A promise that resolves to the workflow status response.
* @throws Will throw an error if the CircleCI token is not defined or if the HTTP request fails.
*/
async function getWorkflowStatusById(workflowId: string): Promise<WorkflowStatusResponse> {
if (!CIRCLE_TOKEN) {
throw new Error('CircleCI token is not defined');
}

const url = `https://circleci.com/api/v2/pipeline/${workflowId}/workflow`;
const options = {
method: 'GET',
headers: {
'Content-Type': 'application/json',
}
};

try {
console.log(`Fetching workflow ${workflowId}...`);

const response = await fetch(url, options);
if (!response.ok) {
const errorBody = await response.text();
console.error('HTTP error response:', errorBody);
throw new Error(`HTTP error! status: ${response.status}`);
}
const workflowStatus = await response.json();

console.log(`Number of runs: ${workflowStatus.items.length}`);
console.log(`Workflow status from last run: ${workflowStatus.items[0].status}`);

return workflowStatus;

} catch (error) {
console.error('Error:', error);
throw error;
}
}

/**
* Reruns a CircleCI workflow by its ID.
*
* @param {string} workflowId - The ID of the workflow to rerun.
* @throws Will throw an error if the CircleCI token is not defined or if the HTTP request fails.
*/
async function rerunWorkflowById(workflowId: string) {
if (!CIRCLE_TOKEN) {
throw new Error('CircleCI token is not defined');
}

const url = `https://circleci.com/api/v2/workflow/${workflowId}/rerun`;
const options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Circle-Token': CIRCLE_TOKEN,
},
body: JSON.stringify({
enable_ssh: false,
from_failed: true,
sparse_tree: false, // mutually exclusive with the from_failed parameter
})
};

try {
console.log(`Rerunning workflow ${workflowId}...`);
const response = await fetch(url, options);
if (!response.ok) {
const errorBody = await response.text();
console.error('HTTP error response:', errorBody);
throw new Error(`HTTP error! status: ${response.status}`);
}
const body = await response.json();
console.log('Workflow rerun successfully!');
console.log(body);
} catch (error) {
console.error('Error:', error);
}
}

/**
* Re-runs failed CircleCI workflows from develop branch.
* The workflow will only be re-runed if:
* 1. It has the status of 'failed'
* 2. It has only been run once
* 3. It is among the most recent 20 workflows
* 4. It was triggered by the 'github-merge-queue[bot]' user
*
* @throws Will throw an error if fetching the workflows or re-running a workflow fails.
*/
async function rerunFailedWorkflowsFromDevelop() {
console.log('Getting Circle Ci workflows from develop branch...');
const workflows = await getCircleCiWorkflowsByBranch('develop');

console.log('Assessing if any of the workflows needs to be rerun...');
for (const item of workflows) {
if (item.trigger.actor.login === 'github-merge-queue[bot]') {
const workflowStatus = await getWorkflowStatusById(item.id);

if (workflowStatus.items.length === 1 && workflowStatus.items[0].status === 'failed') {
await rerunWorkflowById(workflowStatus.items[0].id);
console.log(`Rerun workflow with ID: ${workflowStatus.items[0].id}`);
}
}
}
console.log('Task completed successfully!');
}

rerunFailedWorkflowsFromDevelop()
.catch((error) => {
console.error(error);
process.exitCode = 1;
});
1 change: 0 additions & 1 deletion .depcheckrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ ignores:
- 'crypto-browserify' # polyfill
- 'process' # polyfill
- 'stream-http' # polyfill
- 'rimraf' # misc: install helper
- 'json-schema-to-ts' # misc: typescript helper
- 'https-browserify' # polyfill
- 'path-browserify' # polyfill
Expand Down
Loading

0 comments on commit 94c6aa9

Please sign in to comment.