Skip to content

Commit a8fef0b

Browse files
jencarlucciCopilot
andcommitted
Merge OpenAPI PRs via the merge API instead of pushing to main
Replace the local git merge + direct push to the protected default branch with `gh pr merge` on each of the two latest PRs. Merging a PR is the compliant path through the "require a pull request" branch rule, so the job no longer needs a protected-branch push or any ruleset/branch-protection bypass — OPENAPI_MERGE_TOKEN only needs pull-requests:write + contents:write. The synchronous merge call can gateway-timeout (502/504) on these ~250K-line diffs, so merge_pr retries and polls the PR's merged state after each failure (the merge usually completes server-side despite the timeout). Drops the actions/checkout-with-token step. Recompiled the lock with gh aw. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: dcc1f083-b349-4398-ae7e-e2b90b1924b7
1 parent 0d12b68 commit a8fef0b

2 files changed

Lines changed: 72 additions & 56 deletions

File tree

.github/workflows/openapi-pr-reviewer.lock.yml

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"b6c2caf626a31ee17846d663483346b74ff421e65c20f3d4713e57fa3a5c5938","body_hash":"754e3baebfa788bc34791e9abcecf9ff11c1fbd66001673477acce8bb80db1a7","compiler_version":"v0.79.6","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
2-
# gh-aw-manifest: {"version":1,"secrets":["CHATTERBOX_TOKEN","CHATTERBOX_URL","COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAPI_MERGE_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"93cb6efe18208431cddfb8368fd83d5badbf9bfd","version":"v5"},{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"5c2fe865bb4dc46e1450f6ee0d0541d759aea73a","version":"v0.79.6"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2","digest":"sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2","digest":"sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2","digest":"sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.25","digest":"sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa"},{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]}
1+
# gh-aw-metadata: {"schema_version":"v4","frontmatter_hash":"9cc11dc458df1edec3a42d9cca931bb313fbd3f00f032a7022c2f746c1d12dbf","body_hash":"754e3baebfa788bc34791e9abcecf9ff11c1fbd66001673477acce8bb80db1a7","compiler_version":"v0.79.6","strict":true,"agent_id":"copilot","engine_versions":{"copilot":"1.0.60"}}
2+
# gh-aw-manifest: {"version":1,"secrets":["CHATTERBOX_TOKEN","CHATTERBOX_URL","COPILOT_GITHUB_TOKEN","GH_AW_GITHUB_MCP_SERVER_TOKEN","GH_AW_GITHUB_TOKEN","GITHUB_TOKEN","OPENAPI_MERGE_TOKEN"],"actions":[{"repo":"actions/checkout","sha":"df4cb1c069e1874edd31b4311f1884172cec0e10","version":"v6.0.3"},{"repo":"actions/download-artifact","sha":"3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c","version":"v8.0.1"},{"repo":"actions/github-script","sha":"3a2844b7e9c422d3c10d287c895573f7108da1b3","version":"v9.0.0"},{"repo":"actions/setup-node","sha":"48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e","version":"v6.4.0"},{"repo":"actions/upload-artifact","sha":"043fb46d1a93c77aae656e7c1c64a875d1fc6a0a","version":"v7.0.1"},{"repo":"github/gh-aw-actions/setup","sha":"5c2fe865bb4dc46e1450f6ee0d0541d759aea73a","version":"v0.79.6"}],"containers":[{"image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2","digest":"sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6","pinned_image":"ghcr.io/github/gh-aw-firewall/agent:0.27.2@sha256:f88e5b17b6b7a600117bc121114d6ce2155c88c983c0c939c5df884f730fa1d6"},{"image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2","digest":"sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4","pinned_image":"ghcr.io/github/gh-aw-firewall/api-proxy:0.27.2@sha256:ee39841d980878ebbb87592903b06d31a1af500c71525c9616f7e8e2a27041a4"},{"image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2","digest":"sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591","pinned_image":"ghcr.io/github/gh-aw-firewall/squid:0.27.2@sha256:2e3a717e5f19a654cd9a2263beb52012b56bcb68562ec5ae2e42f9d156b49591"},{"image":"ghcr.io/github/gh-aw-mcpg:v0.3.25","digest":"sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa","pinned_image":"ghcr.io/github/gh-aw-mcpg:v0.3.25@sha256:c10331ad17668ef89f38f5e356678788a40b0cd5fef96e8f92e1d9c1de47cbaa"},{"image":"ghcr.io/github/github-mcp-server:v1.1.2","digest":"sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c","pinned_image":"ghcr.io/github/github-mcp-server:v1.1.2@sha256:30197479d8036c7811892bc07e06f9a05c9ef3cdd79bc59f256d50647f95788c"}]}
33
# ___ _ _
44
# / _ \ | | (_)
55
# | |_| | __ _ ___ _ __ | |_ _ ___
@@ -34,7 +34,6 @@
3434
# - OPENAPI_MERGE_TOKEN
3535
#
3636
# Custom actions used:
37-
# - actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
3837
# - actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
3938
# - actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
4039
# - actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
@@ -477,9 +476,9 @@ jobs:
477476
mkdir -p "${RUNNER_TEMP}/gh-aw/safeoutputs"
478477
mkdir -p /tmp/gh-aw/safeoutputs
479478
mkdir -p /tmp/gh-aw/mcp-logs/safeoutputs
480-
cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_9f1f6edab7d72a41_EOF'
481-
{"create_report_incomplete_issue":{},"merge-openapi-prs":{"description":"Merge the latest OpenAPI 3.0 and 3.1 description PRs into the default branch, close the older superseded PRs, and notify Slack. Call this ONLY when no breaking changes were found. Provide the two latest PR numbers and the list of older PR numbers.\n","inputs":{"older_prs":{"default":null,"description":"Comma-separated PR numbers of older superseded PRs to close (may be empty).","required":false,"type":"string"},"pr_30":{"default":null,"description":"PR number of the latest 'Update OpenAPI 3.0 Descriptions' PR.","required":true,"type":"number"},"pr_31":{"default":null,"description":"PR number of the latest 'Update OpenAPI 3.1 Descriptions' PR.","required":true,"type":"number"},"summary":{"default":null,"description":"One-line summary of the merged changes for the Slack notification.","required":true,"type":"string"}},"output":"OpenAPI PRs merged, older PRs closed, Slack notified."},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"post-to-chatterbox":{"description":"Post a message to the #api-platform Slack channel via chatterbox. Message must be 200 characters or less. Supports Slack markdown (*bold*, _italic_, `code`, \u003curl|text\u003e). Requires the CHATTERBOX_URL and CHATTERBOX_TOKEN secrets to be configured.\n","inputs":{"message":{"default":null,"description":"The message to post (max 200 characters, Slack markdown).","required":true,"type":"string"}},"output":"Message posted to chatterbox."},"report_incomplete":{}}
482-
GH_AW_SAFE_OUTPUTS_CONFIG_9f1f6edab7d72a41_EOF
479+
cat > "${RUNNER_TEMP}/gh-aw/safeoutputs/config.json" << 'GH_AW_SAFE_OUTPUTS_CONFIG_b02c1f8e9d0c4506_EOF'
480+
{"create_report_incomplete_issue":{},"merge-openapi-prs":{"description":"Merge the latest OpenAPI 3.0 and 3.1 description PRs into the default branch, close the older superseded PRs, and notify chatterbox. Call this ONLY when no breaking changes were found. Provide the two latest PR numbers and the list of older PR numbers.\n","inputs":{"older_prs":{"default":null,"description":"Comma-separated PR numbers of older superseded PRs to close (may be empty).","required":false,"type":"string"},"pr_30":{"default":null,"description":"PR number of the latest 'Update OpenAPI 3.0 Descriptions' PR.","required":true,"type":"number"},"pr_31":{"default":null,"description":"PR number of the latest 'Update OpenAPI 3.1 Descriptions' PR.","required":true,"type":"number"},"summary":{"default":null,"description":"One-line summary of the merged changes for the chatterbox notification.","required":true,"type":"string"}},"output":"OpenAPI PRs merged, older PRs closed, chatterbox notified."},"missing_data":{},"missing_tool":{},"noop":{"max":1,"report-as-issue":"true"},"post-to-chatterbox":{"description":"Post a message to the #api-platform Slack channel via chatterbox. Message must be 200 characters or less. Supports Slack markdown (*bold*, _italic_, `code`, \u003curl|text\u003e). Requires the CHATTERBOX_URL and CHATTERBOX_TOKEN secrets to be configured.\n","inputs":{"message":{"default":null,"description":"The message to post (max 200 characters, Slack markdown).","required":true,"type":"string"}},"output":"Message posted to chatterbox."},"report_incomplete":{}}
481+
GH_AW_SAFE_OUTPUTS_CONFIG_b02c1f8e9d0c4506_EOF
483482
- name: Generate Safe Outputs Tools
484483
env:
485484
GH_AW_TOOLS_META_JSON: |
@@ -488,7 +487,7 @@ jobs:
488487
"repo_params": {},
489488
"dynamic_tools": [
490489
{
491-
"description": "Merge the latest OpenAPI 3.0 and 3.1 description PRs into the default branch, close the older superseded PRs, and notify Slack. Call this ONLY when no breaking changes were found. Provide the two latest PR numbers and the list of older PR numbers.\n",
490+
"description": "Merge the latest OpenAPI 3.0 and 3.1 description PRs into the default branch, close the older superseded PRs, and notify chatterbox. Call this ONLY when no breaking changes were found. Provide the two latest PR numbers and the list of older PR numbers.\n",
492491
"inputSchema": {
493492
"additionalProperties": false,
494493
"properties": {
@@ -505,7 +504,7 @@ jobs:
505504
"type": "number"
506505
},
507506
"summary": {
508-
"description": "One-line summary of the merged changes for the Slack notification.",
507+
"description": "One-line summary of the merged changes for the chatterbox notification.",
509508
"type": "string"
510509
}
511510
},
@@ -1475,35 +1474,40 @@ jobs:
14751474
core.setOutput('pr_31', String(item.pr_31));
14761475
core.setOutput('older_prs', item.older_prs || '');
14771476
core.setOutput('summary', item.summary || '');
1478-
- name: Checkout default branch
1479-
uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5
1480-
env:
1481-
CHATTERBOX_TOKEN: ${{ secrets.CHATTERBOX_TOKEN }}
1482-
CHATTERBOX_URL: ${{ secrets.CHATTERBOX_URL }}
1483-
GH_AW_AGENT_OUTPUT: ${{ runner.temp }}/gh-aw/safe-jobs/agent_output.json
1484-
MERGE_TOKEN: ${{ secrets.OPENAPI_MERGE_TOKEN }}
1485-
with:
1486-
fetch-depth: 0
1487-
token: ${{ env.MERGE_TOKEN }}
1488-
- name: Merge PRs locally and push
1477+
- name: Merge the two latest PRs via the merge API
14891478
if: ${{ env.GH_AW_SAFE_OUTPUTS_STAGED != 'true' }}
14901479
run: |
14911480
set -euo pipefail
1492-
git config user.name "github-actions[bot]"
1493-
git config user.email "github-actions[bot]@users.noreply.github.com"
1494-
DEFAULT_BRANCH="${GITHUB_REF_NAME}"
1495-
git checkout "$DEFAULT_BRANCH"
1496-
# Fetch the two PR heads (bot branches live in this repo, so pull/N/head works).
1497-
git fetch origin "pull/${PR_30}/head:pr-${PR_30}"
1498-
git fetch origin "pull/${PR_31}/head:pr-${PR_31}"
1499-
# Merge 3.0 first, then 3.1, to avoid conflicts (they touch disjoint paths).
1500-
git merge --no-ff "pr-${PR_30}" -m "Merge OpenAPI 3.0 descriptions (#${PR_30})"
1501-
git merge --no-ff "pr-${PR_31}" -m "Merge OpenAPI 3.1 descriptions (#${PR_31})"
1502-
git push origin "$DEFAULT_BRANCH"
1481+
# Merge each PR through the GitHub merge API (a merge commit, like the old --no-ff).
1482+
# These diffs are huge (~64 files / 250K lines), so the synchronous merge call can
1483+
# gateway-timeout (502/504) even though the merge completes server-side. Retry, and
1484+
# after each failure poll the PR's merged state before giving up.
1485+
merge_pr() {
1486+
local n="$1" label="$2"
1487+
echo "Merging #$n ($label)..."
1488+
for attempt in 1 2 3 4 5; do
1489+
if [ "$(gh pr view "$n" --repo "$GITHUB_REPOSITORY" --json merged -q .merged)" = "true" ]; then
1490+
echo "#$n already merged."; return 0
1491+
fi
1492+
if gh pr merge "$n" --repo "$GITHUB_REPOSITORY" --merge; then
1493+
echo "#$n merged."; return 0
1494+
fi
1495+
echo "Merge attempt $attempt for #$n failed (likely a gateway timeout on a large diff); waiting to see if it completed server-side..."
1496+
sleep 30
1497+
if [ "$(gh pr view "$n" --repo "$GITHUB_REPOSITORY" --json merged -q .merged)" = "true" ]; then
1498+
echo "#$n merged (completed server-side after timeout)."; return 0
1499+
fi
1500+
done
1501+
echo "ERROR: failed to merge #$n after retries." >&2; return 1
1502+
}
1503+
# Merge 3.0 first, then 3.1 (they touch disjoint paths, so no conflicts).
1504+
merge_pr "$PR_30" "OpenAPI 3.0"
1505+
merge_pr "$PR_31" "OpenAPI 3.1"
15031506
env:
15041507
CHATTERBOX_TOKEN: ${{ secrets.CHATTERBOX_TOKEN }}
15051508
CHATTERBOX_URL: ${{ secrets.CHATTERBOX_URL }}
15061509
GH_AW_AGENT_OUTPUT: ${{ runner.temp }}/gh-aw/safe-jobs/agent_output.json
1510+
GH_TOKEN: ${{ env.MERGE_TOKEN }}
15071511
MERGE_TOKEN: ${{ secrets.OPENAPI_MERGE_TOKEN }}
15081512
PR_30: ${{ steps.req.outputs.pr_30 }}
15091513
PR_31: ${{ steps.req.outputs.pr_31 }}

.github/workflows/openapi-pr-reviewer.md

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,18 @@ safe-outputs:
103103
}
104104
105105
# ---- Merge + close + notify ------------------------------------------------------
106-
# The agent calls this ONCE when there are NO breaking changes. It performs the
107-
# privileged local-git merge (the merge API times out on these diffs), closes the
108-
# older superseded PRs, and posts the merged-PR list to Slack — all in one gated job
109-
# so the "merged" notification only fires on real success.
106+
# The agent calls this ONCE when there are NO breaking changes. It merges the two latest
107+
# PRs via the GitHub merge API (merging a PR satisfies the "require a pull request" branch
108+
# rule, so no protected-branch push/bypass is needed), closes the older superseded PRs,
109+
# and posts the merged-PR list to chatterbox — all in one gated job so the "merged"
110+
# notification only fires on real success.
110111
merge-openapi-prs:
111112
description: >
112113
Merge the latest OpenAPI 3.0 and 3.1 description PRs into the default branch, close
113-
the older superseded PRs, and notify Slack. Call this ONLY when no breaking changes
114+
the older superseded PRs, and notify chatterbox. Call this ONLY when no breaking changes
114115
were found. Provide the two latest PR numbers and the list of older PR numbers.
115116
runs-on: ubuntu-latest
116-
output: "OpenAPI PRs merged, older PRs closed, Slack notified."
117+
output: "OpenAPI PRs merged, older PRs closed, chatterbox notified."
117118
permissions:
118119
contents: write
119120
pull-requests: write
@@ -131,12 +132,13 @@ safe-outputs:
131132
required: false
132133
type: string
133134
summary:
134-
description: "One-line summary of the merged changes for the Slack notification."
135+
description: "One-line summary of the merged changes for the chatterbox notification."
135136
required: true
136137
type: string
137138
env:
138-
# Dedicated PAT (or GitHub App token) that can push to the protected default branch.
139-
# The default GITHUB_TOKEN cannot bypass required status checks; see PR description.
139+
# Token used to merge the PRs and close the older ones. Merging a PR is the compliant
140+
# path through the "require a pull request" branch rule, so this only needs
141+
# `pull-requests: write` + `contents: write` — no protected-branch push/bypass.
140142
MERGE_TOKEN: "${{ secrets.OPENAPI_MERGE_TOKEN }}"
141143
CHATTERBOX_URL: "${{ secrets.CHATTERBOX_URL }}"
142144
CHATTERBOX_TOKEN: "${{ secrets.CHATTERBOX_TOKEN }}"
@@ -155,29 +157,39 @@ safe-outputs:
155157
core.setOutput('pr_31', String(item.pr_31));
156158
core.setOutput('older_prs', item.older_prs || '');
157159
core.setOutput('summary', item.summary || '');
158-
- name: Checkout default branch
159-
uses: actions/checkout@v5
160-
with:
161-
fetch-depth: 0
162-
token: ${{ env.MERGE_TOKEN }}
163-
- name: Merge PRs locally and push
160+
- name: Merge the two latest PRs via the merge API
164161
if: ${{ env.GH_AW_SAFE_OUTPUTS_STAGED != 'true' }}
165162
env:
163+
GH_TOKEN: ${{ env.MERGE_TOKEN }}
166164
PR_30: ${{ steps.req.outputs.pr_30 }}
167165
PR_31: ${{ steps.req.outputs.pr_31 }}
168166
run: |
169167
set -euo pipefail
170-
git config user.name "github-actions[bot]"
171-
git config user.email "github-actions[bot]@users.noreply.github.com"
172-
DEFAULT_BRANCH="${GITHUB_REF_NAME}"
173-
git checkout "$DEFAULT_BRANCH"
174-
# Fetch the two PR heads (bot branches live in this repo, so pull/N/head works).
175-
git fetch origin "pull/${PR_30}/head:pr-${PR_30}"
176-
git fetch origin "pull/${PR_31}/head:pr-${PR_31}"
177-
# Merge 3.0 first, then 3.1, to avoid conflicts (they touch disjoint paths).
178-
git merge --no-ff "pr-${PR_30}" -m "Merge OpenAPI 3.0 descriptions (#${PR_30})"
179-
git merge --no-ff "pr-${PR_31}" -m "Merge OpenAPI 3.1 descriptions (#${PR_31})"
180-
git push origin "$DEFAULT_BRANCH"
168+
# Merge each PR through the GitHub merge API (a merge commit, like the old --no-ff).
169+
# These diffs are huge (~64 files / 250K lines), so the synchronous merge call can
170+
# gateway-timeout (502/504) even though the merge completes server-side. Retry, and
171+
# after each failure poll the PR's merged state before giving up.
172+
merge_pr() {
173+
local n="$1" label="$2"
174+
echo "Merging #$n ($label)..."
175+
for attempt in 1 2 3 4 5; do
176+
if [ "$(gh pr view "$n" --repo "$GITHUB_REPOSITORY" --json merged -q .merged)" = "true" ]; then
177+
echo "#$n already merged."; return 0
178+
fi
179+
if gh pr merge "$n" --repo "$GITHUB_REPOSITORY" --merge; then
180+
echo "#$n merged."; return 0
181+
fi
182+
echo "Merge attempt $attempt for #$n failed (likely a gateway timeout on a large diff); waiting to see if it completed server-side..."
183+
sleep 30
184+
if [ "$(gh pr view "$n" --repo "$GITHUB_REPOSITORY" --json merged -q .merged)" = "true" ]; then
185+
echo "#$n merged (completed server-side after timeout)."; return 0
186+
fi
187+
done
188+
echo "ERROR: failed to merge #$n after retries." >&2; return 1
189+
}
190+
# Merge 3.0 first, then 3.1 (they touch disjoint paths, so no conflicts).
191+
merge_pr "$PR_30" "OpenAPI 3.0"
192+
merge_pr "$PR_31" "OpenAPI 3.1"
181193
- name: Preview merge (staged)
182194
if: ${{ env.GH_AW_SAFE_OUTPUTS_STAGED == 'true' }}
183195
env:

0 commit comments

Comments
 (0)