From aa1e7d8aec983cb1df9dacccb0ae6adf4642947e Mon Sep 17 00:00:00 2001 From: eric sciple Date: Wed, 18 Mar 2026 10:53:25 -0500 Subject: [PATCH] Add deployment key support for job environment (#338) Add a boolean 'deployment' property to the job environment mapping. When set to false, the parsed environment reference sets skipDeployment to signal that no deployment record should be created. --- languageservice/src/validate.test.ts | 18 ++++ .../src/model/converter/job/environment.ts | 8 ++ .../src/model/workflow-template.ts | 1 + workflow-parser/src/workflow-v1.0.json | 4 + .../reader/job-environment-deployment.yml | 91 +++++++++++++++++++ 5 files changed, 122 insertions(+) create mode 100644 workflow-parser/testdata/reader/job-environment-deployment.yml diff --git a/languageservice/src/validate.test.ts b/languageservice/src/validate.test.ts index 0b2e7af..82c69e2 100644 --- a/languageservice/src/validate.test.ts +++ b/languageservice/src/validate.test.ts @@ -368,6 +368,24 @@ jobs: }); }); + describe("environment deployment", () => { + it("allows deployment boolean under environment mapping", async () => { + const workflow = ` +on: push +jobs: + build: + runs-on: ubuntu-latest + environment: + name: prod + deployment: false + steps: + - run: echo +`; + const result = await validate(createDocument("wf.yaml", workflow)); + expect(result).toEqual([]); + }); + }); + describe("workflow_dispatch", () => { it("allows empty string in choice options", async () => { const result = await validate( diff --git a/workflow-parser/src/model/converter/job/environment.ts b/workflow-parser/src/model/converter/job/environment.ts index 8da87cf..4d289c3 100644 --- a/workflow-parser/src/model/converter/job/environment.ts +++ b/workflow-parser/src/model/converter/job/environment.ts @@ -34,6 +34,14 @@ export function convertToActionsEnvironmentRef( case "url": result.url = property.value; break; + + case "deployment": { + const deploymentValue = property.value.assertBoolean("job environment deployment"); + if (deploymentValue.value === false) { + result.skipDeployment = true; + } + break; + } } } diff --git a/workflow-parser/src/model/workflow-template.ts b/workflow-parser/src/model/workflow-template.ts index 019e831..8224438 100644 --- a/workflow-parser/src/model/workflow-template.ts +++ b/workflow-parser/src/model/workflow-template.ts @@ -26,6 +26,7 @@ export type ConcurrencySetting = { export type ActionsEnvironmentReference = { name?: TemplateToken; url?: TemplateToken; + skipDeployment?: boolean; }; export type WorkflowJob = Job | ReusableWorkflowJob; diff --git a/workflow-parser/src/workflow-v1.0.json b/workflow-parser/src/workflow-v1.0.json index 1b7e214..4de1c20 100644 --- a/workflow-parser/src/workflow-v1.0.json +++ b/workflow-parser/src/workflow-v1.0.json @@ -2079,6 +2079,10 @@ "url": { "type": "string-runner-context-no-secrets", "description": "The environment URL, which maps to `environment_url` in the deployments API." + }, + "deployment": { + "type": "boolean", + "description": "Whether to create a deployment record for this environment. Defaults to true." } } } diff --git a/workflow-parser/testdata/reader/job-environment-deployment.yml b/workflow-parser/testdata/reader/job-environment-deployment.yml new file mode 100644 index 0000000..81bd85a --- /dev/null +++ b/workflow-parser/testdata/reader/job-environment-deployment.yml @@ -0,0 +1,91 @@ +include-source: false # Drop file/line/col from output +skip: + - C# +--- +on: push +jobs: + build: + environment: + name: production + deployment: false + runs-on: ubuntu-latest + steps: + - run: echo hi + build2: + environment: + name: staging + deployment: true + runs-on: ubuntu-latest + steps: + - run: echo hi +--- +{ + "jobs": [ + { + "type": "job", + "id": "build", + "name": "build", + "if": { + "type": 3, + "expr": "success()" + }, + "environment": { + "type": 2, + "map": [ + { + "Key": "name", + "Value": "production" + }, + { + "Key": "deployment", + "Value": false + } + ] + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + }, + { + "type": "job", + "id": "build2", + "name": "build2", + "if": { + "type": 3, + "expr": "success()" + }, + "environment": { + "type": 2, + "map": [ + { + "Key": "name", + "Value": "staging" + }, + { + "Key": "deployment", + "Value": true + } + ] + }, + "runs-on": "ubuntu-latest", + "steps": [ + { + "id": "__run", + "if": { + "type": 3, + "expr": "success()" + }, + "run": "echo hi" + } + ] + } + ] +}