diff --git a/.github/workflows/create_job.js b/.github/workflows/create_job.js new file mode 100644 index 0000000000..e14f39f828 --- /dev/null +++ b/.github/workflows/create_job.js @@ -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(); diff --git a/.github/workflows/invoke_test_runner.yml b/.github/workflows/invoke_test_runner.yml new file mode 100644 index 0000000000..0792700115 --- /dev/null +++ b/.github/workflows/invoke_test_runner.yml @@ -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 diff --git a/.github/workflows/package.json b/.github/workflows/package.json new file mode 100644 index 0000000000..71ef804476 --- /dev/null +++ b/.github/workflows/package.json @@ -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" + } +}