You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airflow.apache.org by po...@apache.org on 2020/12/27 14:02:28 UTC

[airflow-checks-action] 26/27: Select the right SHA for pull_request triggers, fixes #12 (#13)

This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airflow-checks-action.git

commit 442ad2296fb110373e3fe01c2a3717b546583631
Author: Louis Brunner <Lo...@users.noreply.github.com>
AuthorDate: Sat Nov 7 14:50:02 2020 +0000

    Select the right SHA for pull_request triggers, fixes #12 (#13)
---
 .prettierrc.json         |  2 +-
 __tests__/main.test.ts   | 60 ++++++++++++++++++++++++++++++++++++++++++++----
 dist/index.js            |  2 +-
 src/main.ts              | 28 ++++++++++++++++++----
 src/namespaces/GitHub.ts |  4 ++++
 src/namespaces/Inputs.ts | 10 ++++----
 6 files changed, 90 insertions(+), 16 deletions(-)

diff --git a/.prettierrc.json b/.prettierrc.json
index bf0887a..45441f4 100644
--- a/.prettierrc.json
+++ b/.prettierrc.json
@@ -1,5 +1,5 @@
 {
-  "printWidth": 120,
+  "printWidth": 100,
   "tabWidth": 2,
   "useTabs": false,
   "semi": true,
diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts
index 8f4c49e..e7b1dba 100644
--- a/__tests__/main.test.ts
+++ b/__tests__/main.test.ts
@@ -1,5 +1,21 @@
 import * as cp from 'child_process';
 import * as path from 'path';
+import * as fs from 'fs';
+import * as os from 'os';
+
+const fakeEvent = (event: Record<string, unknown>, scope: (filename: string) => void): void => {
+  const directory = fs.mkdtempSync(path.join(os.tmpdir(), 'checks-actions-'));
+  const filename = path.join(directory, 'github_event.json');
+  fs.writeFileSync(filename, JSON.stringify(event));
+  try {
+    scope(filename);
+  } finally {
+    fs.unlinkSync(filename);
+    fs.rmdirSync(directory);
+  }
+};
+
+type ExecSyncError = Error & {stdout: Buffer};
 
 // shows how the runner will run a javascript action with env / stdout protocol
 test('test runs (creation)', () => {
@@ -17,7 +33,7 @@ test('test runs (creation)', () => {
   try {
     console.log(cp.execSync(`node ${entry}`, options).toString());
   } catch (e) {
-    const error = e as Error & {stdout: Buffer};
+    const error = e as ExecSyncError;
     const output = error.stdout.toString();
     console.log(output);
     expect(output).toMatch(/::debug::Creating a new Run on LB\/ABC@SHA/);
@@ -40,7 +56,7 @@ test('test runs (update)', () => {
   try {
     console.log(cp.execSync(`node ${entry}`, options).toString());
   } catch (e) {
-    const error = e as Error & {stdout: Buffer};
+    const error = e as ExecSyncError;
     const output = error.stdout.toString();
     console.log(output);
     expect(output).toMatch(/::debug::Updating a Run on LB\/ABC@SHA \(123\)/);
@@ -65,7 +81,7 @@ test('test runs (creation on remote repository)', () => {
   try {
     console.log(cp.execSync(`node ${entry}`, options).toString());
   } catch (e) {
-    const error = e as Error & {stdout: Buffer};
+    const error = e as ExecSyncError;
     const output = error.stdout.toString();
     console.log(output);
     expect(output).toMatch(/::debug::Creating a new Run on remote\/repo@DEF/);
@@ -90,7 +106,7 @@ test('test runs (update on remote repository)', () => {
   try {
     console.log(cp.execSync(`node ${entry}`, options).toString());
   } catch (e) {
-    const error = e as Error & {stdout: Buffer};
+    const error = e as ExecSyncError;
     const output = error.stdout.toString();
     console.log(output);
     expect(output).toMatch(/::debug::Updating a Run on remote\/repo@DEF \(123\)/);
@@ -115,11 +131,45 @@ test('test rejects invalid repo', () => {
   try {
     console.log(cp.execSync(`node ${entry}`, options).toString());
   } catch (e) {
-    const error = e as Error & {stdout: Buffer};
+    const error = e as ExecSyncError;
     const output = error.stdout.toString();
     console.log(output);
     expect(output).toMatch(/::debug::Error: repo needs to be in the {owner}\/{repository} format/);
   }
 });
 
+test('test runs (creation + pull_request)', () => {
+  const event = {
+    pull_request: {
+      head: {
+        sha: '123',
+      },
+    },
+  };
+  fakeEvent(event, (filename: string): void => {
+    const entry = path.join(__dirname, '..', 'lib', 'main.js');
+    const options: cp.ExecSyncOptions = {
+      env: {
+        GITHUB_REPOSITORY: 'LB/ABC',
+        GITHUB_SHA: 'SHA',
+        GITHUB_EVENT_NAME: 'pull_request',
+        GITHUB_EVENT_PATH: filename,
+        INPUT_TOKEN: 'ABC',
+        INPUT_NAME: 'ABC',
+        INPUT_STATUS: 'completed',
+        INPUT_CONCLUSION: 'success',
+      },
+    };
+    try {
+      console.log(cp.execSync(`node ${entry}`, options).toString());
+    } catch (e) {
+      const error = e as ExecSyncError;
+      const output = error.stdout.toString();
+      console.log(output);
+      expect(output).toMatch(/::debug::Creating a new Run on LB\/ABC@123/);
+      expect(output).toMatch(/::debug::HttpError: Bad credentials/);
+    }
+  });
+});
+
 // TODO: add more
diff --git a/dist/index.js b/dist/index.js
index 0283cd9..e7efeb5 100644
--- a/dist/index.js
+++ b/dist/index.js
@@ -1 +1 @@
-module.exports=(()=>{var __webpack_modules__={321:function(e,t,r){"use strict";var s=this&&this.__createBinding||(Object.create?function(e,t,r,s){if(s===undefined)s=r;Object.defineProperty(e,s,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,s){if(s===undefined)s=r;e[s]=t[r]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(e [...]
\ No newline at end of file
+module.exports=(()=>{var __webpack_modules__={321:function(e,t,r){"use strict";var s=this&&this.__createBinding||(Object.create?function(e,t,r,s){if(s===undefined)s=r;Object.defineProperty(e,s,{enumerable:true,get:function(){return t[r]}})}:function(e,t,r,s){if(s===undefined)s=r;e[s]=t[r]});var o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var n=this&&this.__importStar||function(e [...]
\ No newline at end of file
diff --git a/src/main.ts b/src/main.ts
index ce440ae..c89c2d5 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,6 +1,7 @@
 import * as core from '@actions/core';
 import * as github from '@actions/github';
 import * as Inputs from './namespaces/Inputs';
+import * as GitHub from './namespaces/GitHub';
 import {parseInputs} from './inputs';
 import {createRun, updateRun} from './checks';
 
@@ -8,6 +9,27 @@ const isCreation = (inputs: Inputs.Args): inputs is Inputs.ArgsCreate => {
   return !!(inputs as Inputs.ArgsCreate).name;
 };
 
+// prettier-ignore
+const prEvents = [
+  'pull_request',
+  'pull_request_review',
+  'pull_request_review_comment',
+];
+
+const getSHA = (inputSHA: string | undefined): string => {
+  let sha = github.context.sha;
+  if (prEvents.includes(github.context.eventName)) {
+    const pull = github.context.payload.pull_request as GitHub.PullRequest;
+    if (pull?.head.sha) {
+      sha = pull?.head.sha;
+    }
+  }
+  if (inputSHA) {
+    sha = inputSHA;
+  }
+  return sha;
+};
+
 async function run(): Promise<void> {
   try {
     core.debug(`Parsing inputs`);
@@ -20,7 +42,7 @@ async function run(): Promise<void> {
       owner: github.context.repo.owner,
       repo: github.context.repo.repo,
     };
-    let sha = github.context.sha;
+    const sha = getSHA(inputs.sha);
 
     if (inputs.repo) {
       const repo = inputs.repo.split('/');
@@ -28,10 +50,6 @@ async function run(): Promise<void> {
       ownership.repo = repo[1];
     }
 
-    if (inputs.sha) {
-      sha = inputs.sha;
-    }
-
     if (isCreation(inputs)) {
       core.debug(`Creating a new Run on ${ownership.owner}/${ownership.repo}@${sha}`);
       const id = await createRun(octokit, inputs.name, sha, ownership, inputs);
diff --git a/src/namespaces/GitHub.ts b/src/namespaces/GitHub.ts
new file mode 100644
index 0000000..cad698f
--- /dev/null
+++ b/src/namespaces/GitHub.ts
@@ -0,0 +1,4 @@
+import {RestEndpointMethodTypes} from '@octokit/rest';
+
+// @octokit/rest > Endpoints.d.ts > PullsGetResponseData
+export type PullRequest = RestEndpointMethodTypes['pulls']['get']['response']['data'];
diff --git a/src/namespaces/Inputs.ts b/src/namespaces/Inputs.ts
index 12cdca8..592348f 100644
--- a/src/namespaces/Inputs.ts
+++ b/src/namespaces/Inputs.ts
@@ -26,18 +26,20 @@ export interface ArgsUpdate extends ArgsBase {
 
 export type Args = ArgsCreate | ArgsUpdate;
 
-// ChecksCreateParamsOutputAnnotations[]
+// @octokit/rest > Endpoints.d.ts > ChecksCreateParamsOutputAnnotations[]
 export type Annotations = NonNullable<
   NonNullable<RestEndpointMethodTypes['checks']['create']['parameters']['output']>['annotations']
 >;
 
-// ChecksCreateParamsOutputImages[]
+// @octokit/rest > Endpoints.d.ts > ChecksCreateParamsOutputImages[]
 export type Images = NonNullable<
   NonNullable<RestEndpointMethodTypes['checks']['create']['parameters']['output']>['images']
 >;
 
-// ChecksCreateParamsActions[]
-export type Actions = NonNullable<RestEndpointMethodTypes['checks']['create']['parameters']['actions']>;
+// @octokit/rest > Endpoints.d.ts > ChecksCreateParamsActions[]
+export type Actions = NonNullable<
+  RestEndpointMethodTypes['checks']['create']['parameters']['actions']
+>;
 
 export type Output = {
   summary: string;