Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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/workflows/create_job.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
const { CloudTasksClient } = require('@google-cloud/tasks');
const { v4: uuidv4 } = require('uuid');

const client = new CloudTasksClient();

const constructPayload = () => {
const jobId = String(uuidv4());
const commitHash = process.env.COMMIT_HASH;
const branch = process.env.BRANCH;
const classes = process.env.CLASSES;
const pullRequestNumber = process.env.PULL_REQUEST_NUMBER;

const payloadStructure = {
"jobId": jobId,
"commitHash": commitHash.trim(),
"branch": branch.trim(),
"classes": convertClassesStringToArray(classes),
"pullRequest": pullRequestNumber.trim(),
}
return payloadStructure;
}

const convertClassesStringToArray = (classes) => {
const classesArray = classes.split(',');
const trimmedClassesArray = classesArray.map(currentClass => currentClass.trim());
return trimmedClassesArray;
}

const formatPayload = (payloadStructure) => {
const parsedPayload = JSON.stringify(JSON.stringify(payloadStructure));
const payload = `{"argument": ${parsedPayload}}`;
console.log(`Payload: ${payload}`);
return payload;
}

const constructTask = (serviceAccountEmail, payload, url) => {
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oauthToken: {
serviceAccountEmail,
},
body: Buffer.from(payload).toString('base64'),
},
};
return task;
}

const createRequestBody = (payload) => {
const project = process.env.PROJECT_ID;
const queue = process.env.QUEUE_ID;
const location = process.env.LOCATION;
const url = process.env.WORKFLOW_URL
const serviceAccountEmail = process.env.SERVICE_ACCOUNT_EMAIL;
const requestBody = {
"fullyQualifiedQueueName": client.queuePath(project, location, queue),
"task": constructTask(serviceAccountEmail, payload, url)
}
return requestBody;
}

const constructRequest = () => {
const payloadStructure = constructPayload();
const payload = formatPayload(payloadStructure);
const requestBody = createRequestBody(payload);
const request = { parent: requestBody.fullyQualifiedQueueName, task: requestBody.task };
return request;
}

async function createHttpTaskWithToken() {
const request = constructRequest();
const [response] = await client.createTask(request);
const name = response.name;
console.log(`Created task ${name}`);
}
createHttpTaskWithToken();
57 changes: 57 additions & 0 deletions .github/workflows/invoke_test_runner.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
name: invoke_test_runner
on:
push:
branches:
- master
workflow_dispatch:
inputs:
BRANCH_INPUT:
description: 'Branch'
required: true
COMMIT_HASH_INPUT:
description: 'Commit hash'
required: true
CLASSES_TO_EXECUTE_INPUT:
description: 'Classes to test'
required: false
PULL_REQUEST_NUMBER_INPUT:
description: 'Pull request number'
required: false
env:
PROJECT_ID: ${{ secrets.PROJECT_ID }}
QUEUE_ID: ${{ secrets.QUEUE_ID }}
LOCATION: ${{ secrets.LOCATION }}
SERVICE_ACCOUNT_EMAIL: ${{ secrets.SERVICE_ACCOUNT_EMAIL }}
WORKFLOW_URL: ${{ secrets.WORKFLOW_URL }}
#Payload variables
COMMIT_HASH: ${{ (github.sha) }}
BRANCH: ${{ (github.ref_name) }}
CLASSES: ${{ (github.event.inputs.CLASSES_TO_EXECUTE_INPUT) }}
PULL_REQUEST_NUMBER: ${{ (github.event.inputs.PULL_REQUEST_NUMBER_INPUT) }}

jobs:
execute_workflow:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: '14'
- run: npm install --prefix .github/workflows

- name: Update COMMIT_HASH
if: ${{ github.event_name == 'workflow_dispatch' }}
run: echo "COMMIT_HASH=${{ (github.event.inputs.COMMIT_HASH_INPUT) }} " >> $GITHUB_ENV

- name: Update BRANCH
if: ${{ github.event_name == 'workflow_dispatch' }}
run: echo "BRANCH=${{ (github.event.inputs.BRANCH_INPUT) }} " >> $GITHUB_ENV

- id: 'auth'
name: 'Authenticate to Google Cloud'
uses: google-github-actions/auth@v0.4.0
with:
credentials_json: ${{ secrets.GOOGLE_APPLICATION_CREDENTIALS }}

- name: Execute JS script
run: node .github/workflows/create_job.js
14 changes: 14 additions & 0 deletions .github/workflows/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "workflow-testrunner-tasksenqueuer",
"private": true,
"engines": {
"node": ">=12.0.0"
},
"files": [
"*.js"
],
"dependencies": {
"@google-cloud/tasks": "^3.0.0",
"uuid": "^8.0.0"
}
}