opsscript-gate 0.9.4__tar.gz → 0.9.6__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/workflow-templates/opsscript-gate.yml +1 -1
  2. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/workflows/deploy-pages.yml +2 -0
  3. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/CHANGELOG.md +18 -0
  4. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/PKG-INFO +15 -11
  5. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/README.md +13 -10
  6. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/README.zh-CN.md +6 -4
  7. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/action.yml +32 -1
  8. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/docs/command-not-found.html +2 -1
  9. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6/docs}/index.html +49 -164
  10. opsscript_gate-0.9.6/docs/installer-smoke-test.html +73 -0
  11. opsscript_gate-0.9.6/docs/installer-smoke-test.md +55 -0
  12. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6/docs}/llms.txt +1 -0
  13. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/docs/sitemap.xml +1 -0
  14. opsscript_gate-0.9.6/examples/github-actions/README.md +11 -0
  15. opsscript_gate-0.9.6/examples/github-actions/installer-smoke.yml +54 -0
  16. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/examples/github-actions/workflow.yml +1 -1
  17. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/pyproject.toml +2 -1
  18. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/__init__.py +1 -1
  19. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/cli.py +69 -4
  20. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/config.py +39 -2
  21. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/models.py +24 -0
  22. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/remediation.py +55 -24
  23. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/reporter.py +20 -4
  24. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/runner.py +217 -61
  25. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/test_action_contract.py +5 -2
  26. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/test_audit_coverage.py +352 -0
  27. opsscript_gate-0.9.6/tests/test_installer_example.py +76 -0
  28. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/test_onboarding.py +3 -1
  29. opsscript_gate-0.9.4/examples/github-actions/README.md +0 -5
  30. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.gitattributes +0 -0
  31. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  32. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/ISSUE_TEMPLATE/distro_request.yml +0 -0
  33. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  34. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/assets/social-preview.png +0 -0
  35. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/pull_request_template.md +0 -0
  36. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/workflow-templates/opsscript-gate.properties.json +0 -0
  37. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/workflows/demo.yml +0 -0
  38. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/workflows/release.yml +0 -0
  39. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.github/workflows/test.yml +0 -0
  40. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/.gitignore +0 -0
  41. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/CITATION.cff +0 -0
  42. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/CONTRIBUTING.md +0 -0
  43. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/LICENSE +0 -0
  44. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/ROADMAP.md +0 -0
  45. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/SECURITY.md +0 -0
  46. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/demo.html +0 -0
  47. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/docs/command-not-found.md +0 -0
  48. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/docs/configuration.md +0 -0
  49. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/docs/gpt-oss.md +0 -0
  50. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/docs/robots.txt +0 -0
  51. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/docs/troubleshooting.md +0 -0
  52. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/examples/alpine-incompatibility/README.md +0 -0
  53. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/examples/alpine-incompatibility/apt_dependency.sh +0 -0
  54. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/examples/basic/README.md +0 -0
  55. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/examples/basic/clean_setup.sh +0 -0
  56. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/examples/interactive-hang/README.md +0 -0
  57. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/examples/interactive-hang/prompt_confirm.sh +0 -0
  58. {opsscript_gate-0.9.4/docs → opsscript_gate-0.9.6}/index.html +0 -0
  59. {opsscript_gate-0.9.4/docs → opsscript_gate-0.9.6}/llms.txt +0 -0
  60. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/src/opsscript_gate/discovery.py +0 -0
  61. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/conftest.py +0 -0
  62. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/fixtures/fail_deps.sh +0 -0
  63. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/fixtures/fail_hang.sh +0 -0
  64. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/fixtures/pass_basic.sh +0 -0
  65. {opsscript_gate-0.9.4 → opsscript_gate-0.9.6}/tests/test_runner.py +0 -0
@@ -25,7 +25,7 @@ jobs:
25
25
  persist-credentials: false
26
26
 
27
27
  - name: Run OpsScript Gate
28
- uses: Mresyzz/opsscript-gate@v0.9.2
28
+ uses: Mresyzz/opsscript-gate@v0.9.4
29
29
  with:
30
30
  shell: auto
31
31
  network: none
@@ -25,6 +25,8 @@ jobs:
25
25
  uses: actions/checkout@v4
26
26
  - name: Setup Pages
27
27
  uses: actions/configure-pages@v5
28
+ - name: Stage downloadable installer workflow
29
+ run: cp examples/github-actions/installer-smoke.yml docs/installer-smoke.yml
28
30
  - name: Upload artifact
29
31
  uses: actions/upload-pages-artifact@v3
30
32
  with:
@@ -1,5 +1,23 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.9.6] - 2026-11-08
4
+
5
+ ### Added
6
+ - Added safe container environment variable injection via CLI `--env` and configuration `"env": {...}`, with strict POSIX variable name validation (`^[A-Za-z_][A-Za-z0-9_]*$`).
7
+ - Added host workspace context read-only mounting via CLI `--workdir` and configuration `"workdir": "..."`, automatically setting `/workspace` as the container working directory while strictly preserving host immutability (`mode: "ro"`).
8
+ - Added `env` and `workdir` inputs to the GitHub Composite Action with transparent argument forwarding.
9
+ - Expanded `COMMON_COMMAND_PACKAGES` to provide cross-distro package remediation for standard operations tools (`find`, `xargs`, `grep`, `sed`, `awk`, `diff`, `patch`, `ssh`, `rsync`, `htop`).
10
+ - Added Windows case-insensitive path collision protection in `_output_overwrites_protected` to prevent accidental overwrites of critical project files (e.g. `README.md`).
11
+
12
+ ## [0.9.5] - 2026-11-08
13
+
14
+ ### Added
15
+ - Extended structured failure diagnostics to handle exit code 126 (`permission_denied` and `exec_format_error`) and exit code 137 (`oom_killed`) with targeted remediation suggestions.
16
+ - Added native distribution family detection for Amazon Linux (`amazonlinux`, `amzn`) and Oracle Linux (`oracle`, `ol:`) to support RHEL-family package recommendations.
17
+ - Added GitHub Composite Action `outputs` for `all-passed` and `report-file`, exporting execution status via `$GITHUB_OUTPUT`.
18
+ - Surfaced package installation recommendations and package names directly in Markdown compatibility tables, failure diagnostic log drawers, and terminal detail outputs.
19
+ - Added convenient counting properties (`passed_count`, `failed_count`, `total_count`) on `RunReport` and `MultiScriptReport`.
20
+
3
21
  ## [0.9.4] - 2026-10-11
4
22
 
5
23
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: opsscript-gate
3
- Version: 0.9.4
3
+ Version: 0.9.6
4
4
  Summary: Cross-distro shell script compatibility and portability checker for Debian, Ubuntu, and Alpine. Runs real containers to diagnose command not found.
5
5
  Project-URL: Homepage, https://mresyzz.github.io/opsscript-gate/
6
6
  Project-URL: Demo, https://mresyzz.github.io/opsscript-gate/
@@ -28,6 +28,7 @@ Requires-Dist: docker>=7.0.0
28
28
  Provides-Extra: test
29
29
  Requires-Dist: markdown-it-py>=3.0.0; extra == 'test'
30
30
  Requires-Dist: pytest>=8.0.0; extra == 'test'
31
+ Requires-Dist: pyyaml>=6.0.0; extra == 'test'
31
32
  Description-Content-Type: text/markdown
32
33
 
33
34
  # OpsScript Gate — cross-distro shell script runtime compatibility checker
@@ -80,7 +81,7 @@ apt-get --version
80
81
  Run it locally with `opsscript-gate run ./install.sh`, or add the following step to CI:
81
82
 
82
83
  ```yaml
83
- - uses: Mresyzz/opsscript-gate@v0.9.2
84
+ - uses: Mresyzz/opsscript-gate@v0.9.6
84
85
  with:
85
86
  script-path: install.sh
86
87
  ```
@@ -89,12 +90,9 @@ The result identifies the failing distribution, exit code, line, missing command
89
90
 
90
91
  ---
91
92
 
92
- ## Current version: v0.9.2 (local candidate)
93
+ ## Current release: v0.9.6
93
94
 
94
- The current release includes a project config file, a dry-run plan, presets, exclusions,
95
- saved reports, changed-script selection for pull requests, and repeat runs for detecting
96
- flaky runtime behavior. The project controls
97
- were introduced in v0.5.0; projects on v0.4.1 and earlier do not include them.
95
+ The current release includes safe environment variable passing (`--env`), host workspace context read-only mounting (`--workdir`), expanded package recommendations for standard Linux tools, structured diagnostic properties in SARIF, and composite action outputs.
98
96
 
99
97
  ```bash
100
98
  opsscript-gate init
@@ -103,6 +101,8 @@ opsscript-gate run --dry-run
103
101
  opsscript-gate run --format json --output reports/compatibility.json
104
102
  # Repeat each distro three times when diagnosing intermittent failures
105
103
  opsscript-gate run ./install.sh --repeat 3
104
+ # Pass environment variables and mount repository workspace read-only
105
+ opsscript-gate run ./install.sh --env APP_ENV=staging --workdir .
106
106
  ```
107
107
 
108
108
  `init` creates `.opsscript-gate.json` and a GitHub Actions workflow without replacing
@@ -119,6 +119,10 @@ image's native package manager before testing. Package setup is opt-in and
119
119
  requires bridge networking. See [configuration and migration](docs/configuration.md) and
120
120
  [why a shell script works on Ubuntu but fails on Alpine](docs/troubleshooting.md).
121
121
 
122
+ Testing an installer? Use the [installation smoke test workflow](docs/installer-smoke-test.md)
123
+ to check the installed binary inside each container. A script's zero exit status
124
+ alone does not prove it installed successfully.
125
+
122
126
  ## Quickstart
123
127
 
124
128
  ### In GitHub Actions
@@ -143,7 +147,7 @@ jobs:
143
147
  - uses: actions/checkout@v7
144
148
  with:
145
149
  persist-credentials: false
146
- - uses: Mresyzz/opsscript-gate@v0.9.2
150
+ - uses: Mresyzz/opsscript-gate@v0.9.6
147
151
  ```
148
152
 
149
153
  This zero-configuration form discovers shell scripts in the repository. Use
@@ -154,7 +158,7 @@ repository has a single installer. For self-hosted model installers, see the
154
158
  Or test a specific script with custom execution modes:
155
159
 
156
160
  ```yaml
157
- - uses: Mresyzz/opsscript-gate@v0.9.2
161
+ - uses: Mresyzz/opsscript-gate@v0.9.6
158
162
  with:
159
163
  script-path: scripts/install.sh
160
164
  shell: auto
@@ -188,7 +192,7 @@ unrelated scripts:
188
192
  with:
189
193
  persist-credentials: false
190
194
  fetch-depth: 0
191
- - uses: Mresyzz/opsscript-gate@v0.9.2
195
+ - uses: Mresyzz/opsscript-gate@v0.9.6
192
196
  with:
193
197
  changed-since: ${{ github.event.pull_request.base.sha }}
194
198
  preset: minimal
@@ -279,7 +283,7 @@ Use `sarif` when the result should appear in GitHub Code Scanning or another
279
283
  SARIF-compatible viewer. Upload it explicitly with the official upload action:
280
284
 
281
285
  ```yaml
282
- - uses: Mresyzz/opsscript-gate@v0.9.2
286
+ - uses: Mresyzz/opsscript-gate@v0.9.6
283
287
  with:
284
288
  script-path: scripts/install.sh
285
289
  format: sarif
@@ -48,7 +48,7 @@ apt-get --version
48
48
  Run it locally with `opsscript-gate run ./install.sh`, or add the following step to CI:
49
49
 
50
50
  ```yaml
51
- - uses: Mresyzz/opsscript-gate@v0.9.2
51
+ - uses: Mresyzz/opsscript-gate@v0.9.6
52
52
  with:
53
53
  script-path: install.sh
54
54
  ```
@@ -57,12 +57,9 @@ The result identifies the failing distribution, exit code, line, missing command
57
57
 
58
58
  ---
59
59
 
60
- ## Current version: v0.9.2 (local candidate)
60
+ ## Current release: v0.9.6
61
61
 
62
- The current release includes a project config file, a dry-run plan, presets, exclusions,
63
- saved reports, changed-script selection for pull requests, and repeat runs for detecting
64
- flaky runtime behavior. The project controls
65
- were introduced in v0.5.0; projects on v0.4.1 and earlier do not include them.
62
+ The current release includes safe environment variable passing (`--env`), host workspace context read-only mounting (`--workdir`), expanded package recommendations for standard Linux tools, structured diagnostic properties in SARIF, and composite action outputs.
66
63
 
67
64
  ```bash
68
65
  opsscript-gate init
@@ -71,6 +68,8 @@ opsscript-gate run --dry-run
71
68
  opsscript-gate run --format json --output reports/compatibility.json
72
69
  # Repeat each distro three times when diagnosing intermittent failures
73
70
  opsscript-gate run ./install.sh --repeat 3
71
+ # Pass environment variables and mount repository workspace read-only
72
+ opsscript-gate run ./install.sh --env APP_ENV=staging --workdir .
74
73
  ```
75
74
 
76
75
  `init` creates `.opsscript-gate.json` and a GitHub Actions workflow without replacing
@@ -87,6 +86,10 @@ image's native package manager before testing. Package setup is opt-in and
87
86
  requires bridge networking. See [configuration and migration](docs/configuration.md) and
88
87
  [why a shell script works on Ubuntu but fails on Alpine](docs/troubleshooting.md).
89
88
 
89
+ Testing an installer? Use the [installation smoke test workflow](docs/installer-smoke-test.md)
90
+ to check the installed binary inside each container. A script's zero exit status
91
+ alone does not prove it installed successfully.
92
+
90
93
  ## Quickstart
91
94
 
92
95
  ### In GitHub Actions
@@ -111,7 +114,7 @@ jobs:
111
114
  - uses: actions/checkout@v7
112
115
  with:
113
116
  persist-credentials: false
114
- - uses: Mresyzz/opsscript-gate@v0.9.2
117
+ - uses: Mresyzz/opsscript-gate@v0.9.6
115
118
  ```
116
119
 
117
120
  This zero-configuration form discovers shell scripts in the repository. Use
@@ -122,7 +125,7 @@ repository has a single installer. For self-hosted model installers, see the
122
125
  Or test a specific script with custom execution modes:
123
126
 
124
127
  ```yaml
125
- - uses: Mresyzz/opsscript-gate@v0.9.2
128
+ - uses: Mresyzz/opsscript-gate@v0.9.6
126
129
  with:
127
130
  script-path: scripts/install.sh
128
131
  shell: auto
@@ -156,7 +159,7 @@ unrelated scripts:
156
159
  with:
157
160
  persist-credentials: false
158
161
  fetch-depth: 0
159
- - uses: Mresyzz/opsscript-gate@v0.9.2
162
+ - uses: Mresyzz/opsscript-gate@v0.9.6
160
163
  with:
161
164
  changed-since: ${{ github.event.pull_request.base.sha }}
162
165
  preset: minimal
@@ -247,7 +250,7 @@ Use `sarif` when the result should appear in GitHub Code Scanning or another
247
250
  SARIF-compatible viewer. Upload it explicitly with the official upload action:
248
251
 
249
252
  ```yaml
250
- - uses: Mresyzz/opsscript-gate@v0.9.2
253
+ - uses: Mresyzz/opsscript-gate@v0.9.6
251
254
  with:
252
255
  script-path: scripts/install.sh
253
256
  format: sarif
@@ -17,9 +17,9 @@ Bash 依赖、包管理器假设和交互式阻塞。它与 ShellCheck 互补。
17
17
 
18
18
  也可以直接打开 [OpsScript Gate 在线演示](https://mresyzz.github.io/opsscript-gate/),先查看 ShellCheck 与运行时验证的差异,再复制 workflow 到自己的仓库。
19
19
 
20
- ## 当前版本 v0.9.2
20
+ ## 当前版本 v0.9.6
21
21
 
22
- v0.9.2 是当前本地候选版本;如果你要从源码验证当前分支,也可以执行:
22
+ v0.9.6 是当前已发布版本;如果你要从源码验证当前分支,也可以执行:
23
23
 
24
24
  ```bash
25
25
  pip install -e .
@@ -33,9 +33,11 @@ opsscript-gate init
33
33
  opsscript-gate doctor
34
34
  opsscript-gate run --dry-run
35
35
  opsscript-gate run --format json --output reports/compatibility.json
36
+ # 传递环境变量并以只读方式挂载本地工作空间
37
+ opsscript-gate run ./install.sh --env APP_ENV=staging --workdir .
36
38
  ```
37
39
 
38
- `init` 生成配置和 GitHub 工作流,不覆盖已有文件。工作流引用 `v0.9.2`。
40
+ `init` 生成配置和 GitHub 工作流,不覆盖已有文件。工作流引用 `v0.9.6`。
39
41
  预览不需要 Docker;真实运行需要 Python 3.10+
40
42
  和可访问的 Linux Docker 引擎。
41
43
  `opsscript-gate doctor` 可以在真实运行前检查 Python 和 Docker。
@@ -74,7 +76,7 @@ Docker daemon 和可选的项目配置。
74
76
  - uses: actions/checkout@v7
75
77
  with:
76
78
  fetch-depth: 0
77
- - uses: Mresyzz/opsscript-gate@v0.9.2
79
+ - uses: Mresyzz/opsscript-gate@v0.9.6
78
80
  with:
79
81
  changed-since: ${{ github.event.pull_request.base.sha }}
80
82
  preset: minimal
@@ -50,6 +50,14 @@ inputs:
50
50
  description: 'Optional comma- or newline-separated packages to install before running (requires network=bridge)'
51
51
  required: false
52
52
  default: ''
53
+ env:
54
+ description: 'Newline-separated list of environment variables to pass into containers (e.g. KEY=VALUE or KEY)'
55
+ required: false
56
+ default: ''
57
+ workdir:
58
+ description: 'Host directory to mount read-only into /workspace as the container working directory'
59
+ required: false
60
+ default: ''
53
61
 
54
62
  config:
55
63
  description: 'Path to project JSON configuration'
@@ -80,6 +88,14 @@ inputs:
80
88
  required: false
81
89
  default: ''
82
90
 
91
+ outputs:
92
+ all-passed:
93
+ description: 'Whether all script compatibility checks passed (true or false)'
94
+ value: ${{ steps.gate.outputs.all-passed }}
95
+ report-file:
96
+ description: 'Path to saved report file if output input was set'
97
+ value: ${{ inputs.output }}
98
+
83
99
  runs:
84
100
  using: 'composite'
85
101
  steps:
@@ -94,6 +110,7 @@ runs:
94
110
  pip install "${{ github.action_path }}"
95
111
 
96
112
  - name: Run compatibility gate
113
+ id: gate
97
114
  shell: bash
98
115
  env:
99
116
  INPUT_SCRIPT_PATH: ${{ inputs.script-path }}
@@ -107,6 +124,8 @@ runs:
107
124
  INPUT_PIDS_LIMIT: ${{ inputs.pids-limit }}
108
125
  INPUT_NETWORK: ${{ inputs.network }}
109
126
  INPUT_PACKAGES: ${{ inputs.packages }}
127
+ INPUT_ENV: ${{ inputs.env }}
128
+ INPUT_WORKDIR: ${{ inputs.workdir }}
110
129
  INPUT_CONFIG: ${{ inputs.config }}
111
130
  INPUT_PRESET: ${{ inputs.preset }}
112
131
  INPUT_EXCLUDE: ${{ inputs.exclude }}
@@ -128,6 +147,7 @@ runs:
128
147
  [ -z "$INPUT_PIDS_LIMIT" ] || ARGS+=(--pids-limit "$INPUT_PIDS_LIMIT")
129
148
  [ -z "$INPUT_NETWORK" ] || ARGS+=(--network "$INPUT_NETWORK")
130
149
  [ -z "$INPUT_PACKAGES" ] || ARGS+=(--packages "$INPUT_PACKAGES")
150
+ [ -z "$INPUT_WORKDIR" ] || ARGS+=(--workdir "$INPUT_WORKDIR")
131
151
  [ -z "$INPUT_MATRIX" ] || ARGS+=(--matrix "$INPUT_MATRIX")
132
152
  [ -z "$INPUT_JOBS" ] || ARGS+=(--jobs "$INPUT_JOBS")
133
153
  [ -z "$INPUT_CONFIG" ] || ARGS+=(--config "$INPUT_CONFIG")
@@ -135,6 +155,10 @@ runs:
135
155
  [ -z "$INPUT_MAX_SCRIPTS" ] || ARGS+=(--max-scripts "$INPUT_MAX_SCRIPTS")
136
156
  [ -z "$INPUT_OUTPUT" ] || ARGS+=(--output "$INPUT_OUTPUT")
137
157
  [ -z "$INPUT_CHANGED_SINCE" ] || ARGS+=(--changed-since "$INPUT_CHANGED_SINCE")
158
+ while IFS= read -r env_var; do
159
+ env_var="${env_var%$'\r'}"
160
+ [ -z "$env_var" ] || ARGS+=("--env" "$env_var")
161
+ done <<< "$INPUT_ENV"
138
162
  while IFS= read -r pattern; do
139
163
  pattern="${pattern%$'\r'}"
140
164
  [ -z "$pattern" ] || ARGS+=("--exclude" "$pattern")
@@ -146,4 +170,11 @@ runs:
146
170
  echo "dry-run must be true or false" >&2
147
171
  exit 1
148
172
  fi
149
- python -m opsscript_gate.cli "${ARGS[@]}"
173
+ GATE_STATUS=0
174
+ python -m opsscript_gate.cli "${ARGS[@]}" || GATE_STATUS=$?
175
+ if [ "$GATE_STATUS" -eq 0 ]; then
176
+ echo "all-passed=true" >> "$GITHUB_OUTPUT"
177
+ else
178
+ echo "all-passed=false" >> "$GITHUB_OUTPUT"
179
+ fi
180
+ exit "$GATE_STATUS"
@@ -134,7 +134,7 @@ jobs:
134
134
  - uses: actions/checkout@v7
135
135
  with:
136
136
  persist-credentials: false
137
- - uses: Mresyzz/opsscript-gate@v0.9.2
137
+ - uses: Mresyzz/opsscript-gate@v0.9.4
138
138
  with:
139
139
  script-path: install.sh
140
140
  shell: auto
@@ -186,6 +186,7 @@ opsscript-gate run ./install.sh</code></pre>
186
186
  <a href="https://github.com/Mresyzz/opsscript-gate/blob/main/docs/troubleshooting.md">troubleshooting</a>,
187
187
  or <a href="https://github.com/Mresyzz/opsscript-gate/blob/main/SECURITY.md">security boundaries</a>.
188
188
  <a href="./">Open the interactive demo</a>.</footer>
189
+ <p>Installer returns zero but the program is missing? <a href="installer-smoke-test.html">Verify the installed binary in the same container.</a></p>
189
190
  </main>
190
191
  </body>
191
192
  </html>