Skip to content

Add GCL_VARIABLE_<name> env var support, replace yargs .env("GCL")#1805

Merged
firecow merged 8 commits intomasterfrom
feat/gcl-variable-env
Mar 20, 2026
Merged

Add GCL_VARIABLE_<name> env var support, replace yargs .env("GCL")#1805
firecow merged 8 commits intomasterfrom
feat/gcl-variable-env

Conversation

@firecow
Copy link
Copy Markdown
Owner

@firecow firecow commented Mar 19, 2026

Summary

  • Adds GCL_VARIABLE_<name>=<value> for injecting individual CI/CD variables via env
  • Strips GCL_VARIABLE_* from process.env before yargs parse to avoid strictOptions() conflict
  • Keeps .env("GCL") for standard options (validation, coercion, precedence, unknown-option rejection)
  • CLI --variable flags take precedence over GCL_VARIABLE_* env vars

Example

GCL_VARIABLE_BUILD_FROM_SOURCE=false gitlab-ci-local --list

Test plan

  • Unit tests for stripGclVariableEnvVars (4 tests)
  • Unit tests for injectGclVariableEnvVars (7 tests)
  • Integration test via subprocess with isolated env
  • All variable-related test suites pass

Allows injecting individual CI/CD variables via environment variables
prefixed with GCL_VARIABLE_, e.g. GCL_VARIABLE_MY_VAR=hello.
@firecow firecow self-assigned this Mar 19, 2026
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 3 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="tests/test-cases/gcl-variable-env/integration.test.ts">

<violation number="1" location="tests/test-cases/gcl-variable-env/integration.test.ts:89">
P2: This integration test bypasses the `GCL_VARIABLE_*` code path by passing `variable` directly, so it would not catch a regression in env-var injection.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Sets process.env instead of passing variable array directly to handler,
so the test covers the actual injection code path.
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 1 file (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="tests/test-cases/gcl-variable-env/integration.test.ts">

<violation number="1" location="tests/test-cases/gcl-variable-env/integration.test.ts:84">
P1: This test should not run concurrently while it mutates `process.env`; the shared global env can leak into other tests and cause nondeterministic failures.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

Removes yargs .env("GCL") which blocked GCL_VARIABLE_* env vars via
strictOptions. Env vars are now derived from yargs option metadata, so
option names are defined once. Array options split on semicolons,
naturally supporting GCL_VARIABLE=A=1;B=2 bulk format.

Integration test now uses subprocess with isolated env instead of
mutating process.env.
@firecow firecow changed the title Add GCL_VARIABLE_<name> env var support Add GCL_VARIABLE_<name> env var support, replace yargs .env("GCL") Mar 19, 2026
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 issues found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/argv.ts">

<violation number="1" location="src/argv.ts:46">
P1: Applying `GCL_*` values after `yargs.parse()` bypasses yargs validation and coercion for env-provided options.</violation>

<violation number="2" location="src/argv.ts:68">
P2: This default-value comparison lets `GCL_*` override an explicit CLI flag when the CLI value equals the option's default.</violation>
</file>

<file name="src/index.ts">

<violation number="1" location="src/index.ts:45">
P2: Injecting `GCL_*` values only inside the main handler regresses shell completion, because the `.completion(...)` path never sees those env-backed options.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

firecow added 2 commits March 20, 2026 10:28
…support

- Fix TS2559 by widening injectGclVariableEnvVars parameter type
- Fix TS2551 by using type assertion for yargs internal getOptions()
- Use yargs parsed.defaulted to correctly detect CLI-explicit values,
  ensuring CLI always takes precedence over GCL_ env vars even when
  the CLI value matches the option default
- Inject GCL env vars in completion callback so GCL_CWD etc. work
  during tab completion
- Add 12 unit tests for injectGclEnvVars
Keep yargs .env("GCL") + .strictOptions() for standard options so that
validation, coercion, precedence, and unknown-option rejection all work
as before. Strip GCL_VARIABLE_* entries from process.env before yargs
sees them (avoiding strictOptions conflict), then inject them into
argv.variable in the handler.
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/argv.ts">

<violation number="1" location="src/argv.ts:30">
P2: `GCL_VARIABLE_` (empty suffix) is not stripped from `env`, so yargs env parsing can still see an unexpected `GCL_VARIABLE_*` key.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

firecow added 2 commits March 20, 2026 10:46
…dVars tests

Always delete GCL_VARIABLE_* entries from process.env before yargs
parses, including the bare GCL_VARIABLE_ key, so strictOptions() does
not reject it. Add tests for Argv.ignorePredefinedVars getter.
Copy link
Copy Markdown
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2 issues found across 3 files (changes from recent commits).

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="src/argv.ts">

<violation number="1">
P2: `ignorePredefinedVars` can now be a string at runtime, causing substring-based whitelist checks instead of exact key matching.</violation>
</file>

<file name="src/index.ts">

<violation number="1">
P2: The coerce callback assumes a string, but yargs can pass an array for repeated flags; this can crash with `v.split is not a function`.</violation>
</file>

Reply with feedback, questions, or to request a fix. Tag @cubic-dev-ai to re-run a review.

@sonarqubecloud
Copy link
Copy Markdown

@firecow firecow merged commit 185f386 into master Mar 20, 2026
25 of 26 checks passed
@firecow firecow deleted the feat/gcl-variable-env branch March 20, 2026 11:28
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Mar 24, 2026
This MR contains the following updates:

| Package | Change | [Age](https://docs.renovatebot.com/merge-confidence/) | [Adoption](https://docs.renovatebot.com/merge-confidence/) | [Passing](https://docs.renovatebot.com/merge-confidence/) | [Confidence](https://docs.renovatebot.com/merge-confidence/) |
|---|---|---|---|---|---|
| [npm:gitlab-ci-local](https://github.com/firecow/gitlab-ci-local) | `4.67.2` → `4.70.0` | ![age](https://developer.mend.io/api/mc/badges/age/npm/gitlab-ci-local/4.70.0?slim=true) | ![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/gitlab-ci-local/4.70.0?slim=true) | ![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/gitlab-ci-local/4.67.2/4.70.0?slim=true) | ![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/gitlab-ci-local/4.67.2/4.70.0?slim=true) |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>firecow/gitlab-ci-local (npm:gitlab-ci-local)</summary>

### [`v4.70.0`](https://github.com/firecow/gitlab-ci-local/releases/tag/4.70.0)

[Compare Source](firecow/gitlab-ci-local@4.69.0...4.70.0)

#### What's Changed

- Add `GCL_VARIABLE_<name>` env var support, replace `yargs .env("GCL")` by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1805](firecow/gitlab-ci-local#1805)
- fix: prefix rsync paths with ./ by [@&#8203;ednxzu](https://github.com/ednxzu) in [#&#8203;1801](firecow/gitlab-ci-local#1801)
- chore(deps): update all non-major by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;1802](firecow/gitlab-ci-local#1802)
- chore(deps): lock file maintenance by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;1798](firecow/gitlab-ci-local#1798)

#### New Contributors

- [@&#8203;ednxzu](https://github.com/ednxzu) made their first contribution in [#&#8203;1801](firecow/gitlab-ci-local#1801)

**Full Changelog**: <firecow/gitlab-ci-local@4.69.0...4.70.0>

### [`v4.69.0`](https://github.com/firecow/gitlab-ci-local/releases/tag/4.69.0)

[Compare Source](firecow/gitlab-ci-local@4.68.1...4.69.0)

#### What's Changed

- fix: disable .env autoload in compiled binaries by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1799](firecow/gitlab-ci-local#1799)
- Add `--wait-for-services-timeout` option to CLI by [@&#8203;dernilz](https://github.com/dernilz) in [#&#8203;1796](firecow/gitlab-ci-local#1796)
- ci: add Node.js and Bun version matrix to smoke test by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1797](firecow/gitlab-ci-local#1797)
- chore(deps): update github/codeql-action action to v4.32.6 by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;1793](firecow/gitlab-ci-local#1793)

**Full Changelog**: <firecow/gitlab-ci-local@4.68.1...4.68.2>

### [`v4.68.1`](https://github.com/firecow/gitlab-ci-local/releases/tag/4.68.1)

[Compare Source](firecow/gitlab-ci-local@4.68.0...4.68.1)

#### What's Changed

- chore(deps): update all non-major by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;1792](firecow/gitlab-ci-local#1792)
- fix: disable Bun automatic .env loading by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1794](firecow/gitlab-ci-local#1794)

**Full Changelog**: <firecow/gitlab-ci-local@4.68.0...4.68.1>

### [`v4.68.0`](https://github.com/firecow/gitlab-ci-local/releases/tag/4.68.0)

[Compare Source](firecow/gitlab-ci-local@4.67.2...4.68.0)

#### What's Changed

- chore(deps): lock file maintenance by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;1785](firecow/gitlab-ci-local#1785)
- fix: docker cp fails on read-only directories by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1773](firecow/gitlab-ci-local#1773)
- make services run as container user instead of root by [@&#8203;peterbbeu](https://github.com/peterbbeu) in [#&#8203;1781](firecow/gitlab-ci-local#1781)
- chore(deps): update github/codeql-action action to v4.32.5 by [@&#8203;renovate](https://github.com/renovate)\[bot] in [#&#8203;1786](firecow/gitlab-ci-local#1786)
- Migrate test runner from bun:test to vitest by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1784](firecow/gitlab-ci-local#1784)
- Route parser warnings through WriteStreams instead of console.log by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1788](firecow/gitlab-ci-local#1788)
- Use test.concurrent for independent integration tests by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1769](firecow/gitlab-ci-local#1769)
- Fix Docker volume leak on SIGTERM, SIGHUP, and concurrent cleanup by [@&#8203;cegofrhs](https://github.com/cegofrhs) in [#&#8203;1787](firecow/gitlab-ci-local#1787)
- Add TypeScript type checking to CI by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1789](firecow/gitlab-ci-local#1789)
- Convert remaining tests to concurrent and tune vitest by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1790](firecow/gitlab-ci-local#1790)
- fix: flaky log-padding test assertions by [@&#8203;firecow](https://github.com/firecow) in [#&#8203;1791](firecow/gitlab-ci-local#1791)

#### New Contributors

- [@&#8203;cegofrhs](https://github.com/cegofrhs) made their first contribution in [#&#8203;1787](firecow/gitlab-ci-local#1787)

**Full Changelog**: <firecow/gitlab-ci-local@4.67.2...4.68.0>

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My42MS43IiwidXBkYXRlZEluVmVyIjoiNDMuODYuMCIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90IiwiYXV0b21hdGlvbjpib3QtYXV0aG9yZWQiLCJkZXBlbmRlbmN5LXR5cGU6Om1pbm9yIl19-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants