From b79019bd6ad9783e15ce2c2087fb1db4d1445b0d Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Tue, 31 Jan 2023 13:21:36 -0500 Subject: [PATCH 1/2] Validate that an action exists --- .../src/validate-action.ts | 5 +++ .../src/validate.actions.test.ts | 32 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/actions-languageservice/src/validate-action.ts b/actions-languageservice/src/validate-action.ts index 8a5d30d..b5c1931 100644 --- a/actions-languageservice/src/validate-action.ts +++ b/actions-languageservice/src/validate-action.ts @@ -25,6 +25,11 @@ export async function validateAction( const actionInputs = await config.getActionInputs(action); if (actionInputs === undefined) { + diagnostics.push({ + severity: DiagnosticSeverity.Error, + range: mapRange(step.uses.range), + message: `Unable to resolve action \`${step.uses.value}\`, repository or version not found` + }); return; } diff --git a/actions-languageservice/src/validate.actions.test.ts b/actions-languageservice/src/validate.actions.test.ts index b9be81b..05842bb 100644 --- a/actions-languageservice/src/validate.actions.test.ts +++ b/actions-languageservice/src/validate.actions.test.ts @@ -10,7 +10,7 @@ registerLogger(new TestLogger()); const validationConfig: ValidationConfig = { getActionInputs: async (ref: ActionReference) => { - let inputs: Record = {}; + let inputs: Record | undefined = undefined; switch (ref.owner + "/" + ref.name + "@" + ref.ref) { case "actions/checkout@v3": inputs = { @@ -58,6 +58,7 @@ const validationConfig: ValidationConfig = { return inputs; } }; + describe("validate action steps", () => { it("valid action reference", async () => { const input = ` @@ -73,6 +74,35 @@ jobs: expect(result).toEqual([]); }); + it("action does not exist", async () => { + const input = ` + on: push + jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/does-not-exist@v3 + `; + const result = await validate(createDocument("wf.yaml", input), validationConfig); + + expect(result).toEqual([ + { + message: "Unable to resolve action `actions/does-not-exist@v3`, repository or version not found", + range: { + end: { + character: 41, + line: 6 + }, + start: { + character: 16, + line: 6 + } + }, + severity: DiagnosticSeverity.Error + } + ]); + }); + it("invalid input", async () => { const input = ` on: push From 3f05308f3ba4aac358e334e4a7561b8adea391c0 Mon Sep 17 00:00:00 2001 From: Josh Gross Date: Wed, 1 Feb 2023 16:43:39 -0500 Subject: [PATCH 2/2] Fix invalid action references in tests --- actions-languageservice/src/validate.actions.test.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actions-languageservice/src/validate.actions.test.ts b/actions-languageservice/src/validate.actions.test.ts index 05842bb..0b01bff 100644 --- a/actions-languageservice/src/validate.actions.test.ts +++ b/actions-languageservice/src/validate.actions.test.ts @@ -29,7 +29,7 @@ const validationConfig: ValidationConfig = { } }; break; - case "actions/deploy-pages": + case "actions/deploy-pages@main": inputs = { token: { required: true, @@ -67,7 +67,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 `; const result = await validate(createDocument("wf.yaml", input), validationConfig); @@ -110,7 +110,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: notanoption: true `; @@ -277,7 +277,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: notanoption: true `;