|
33 | 33 | type: 'boolean' |
34 | 34 | default: false |
35 | 35 |
|
| 36 | +concurrency: |
| 37 | + group: '${{ github.workflow }}' |
| 38 | + cancel-in-progress: false |
| 39 | + |
36 | 40 | jobs: |
37 | 41 | release-sdk: |
38 | 42 | runs-on: 'ubuntu-latest' |
|
46 | 50 | packages: 'write' |
47 | 51 | id-token: 'write' |
48 | 52 | issues: 'write' |
| 53 | + pull-requests: 'write' |
49 | 54 | outputs: |
50 | 55 | RELEASE_TAG: '${{ steps.version.outputs.RELEASE_TAG }}' |
51 | 56 |
|
@@ -163,19 +168,19 @@ jobs: |
163 | 168 | echo "BRANCH_NAME=${BRANCH_NAME}" >> "${GITHUB_OUTPUT}" |
164 | 169 |
|
165 | 170 | - name: 'Update package version' |
166 | | - working-directory: 'packages/sdk-typescript' |
167 | 171 | env: |
168 | 172 | RELEASE_VERSION: '${{ steps.version.outputs.RELEASE_VERSION }}' |
169 | 173 | run: |- |
170 | | - npm version "${RELEASE_VERSION}" --no-git-tag-version --allow-same-version |
| 174 | + # Use npm workspaces so the root lockfile is updated consistently. |
| 175 | + npm version -w @qwen-code/sdk "${RELEASE_VERSION}" --no-git-tag-version --allow-same-version |
171 | 176 |
|
172 | 177 | - name: 'Commit and Conditionally Push package version' |
173 | 178 | env: |
174 | 179 | BRANCH_NAME: '${{ steps.release_branch.outputs.BRANCH_NAME }}' |
175 | 180 | IS_DRY_RUN: '${{ steps.vars.outputs.is_dry_run }}' |
176 | 181 | RELEASE_TAG: '${{ steps.version.outputs.RELEASE_TAG }}' |
177 | 182 | run: |- |
178 | | - git add packages/sdk-typescript/package.json |
| 183 | + git add packages/sdk-typescript/package.json package-lock.json |
179 | 184 | if git diff --staged --quiet; then |
180 | 185 | echo "No version changes to commit" |
181 | 186 | else |
@@ -222,6 +227,49 @@ jobs: |
222 | 227 | --notes-start-tag "sdk-typescript-${PREVIOUS_RELEASE_TAG}" \ |
223 | 228 | --generate-notes |
224 | 229 |
|
| 230 | + - name: 'Create PR to merge release branch into main' |
| 231 | + if: |- |
| 232 | + ${{ steps.vars.outputs.is_dry_run == 'false' }} |
| 233 | + id: 'pr' |
| 234 | + env: |
| 235 | + GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' |
| 236 | + RELEASE_BRANCH: '${{ steps.release_branch.outputs.BRANCH_NAME }}' |
| 237 | + RELEASE_TAG: '${{ steps.version.outputs.RELEASE_TAG }}' |
| 238 | + run: |- |
| 239 | + set -euo pipefail |
| 240 | +
|
| 241 | + pr_url="$(gh pr list --head "${RELEASE_BRANCH}" --base main --json url --jq '.[0].url')" |
| 242 | + if [[ -z "${pr_url}" ]]; then |
| 243 | + pr_url="$(gh pr create \ |
| 244 | + --base main \ |
| 245 | + --head "${RELEASE_BRANCH}" \ |
| 246 | + --title "chore(release): sdk-typescript ${RELEASE_TAG}" \ |
| 247 | + --body "Automated release PR for sdk-typescript ${RELEASE_TAG}.")" |
| 248 | + fi |
| 249 | +
|
| 250 | + echo "PR_URL=${pr_url}" >> "${GITHUB_OUTPUT}" |
| 251 | +
|
| 252 | + - name: 'Wait for CI checks to complete' |
| 253 | + if: |- |
| 254 | + ${{ steps.vars.outputs.is_dry_run == 'false' }} |
| 255 | + env: |
| 256 | + GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' |
| 257 | + PR_URL: '${{ steps.pr.outputs.PR_URL }}' |
| 258 | + run: |- |
| 259 | + set -euo pipefail |
| 260 | + echo "Waiting for CI checks to complete..." |
| 261 | + gh pr checks "${PR_URL}" --watch --interval 30 |
| 262 | +
|
| 263 | + - name: 'Enable auto-merge for release PR' |
| 264 | + if: |- |
| 265 | + ${{ steps.vars.outputs.is_dry_run == 'false' }} |
| 266 | + env: |
| 267 | + GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' |
| 268 | + PR_URL: '${{ steps.pr.outputs.PR_URL }}' |
| 269 | + run: |- |
| 270 | + set -euo pipefail |
| 271 | + gh pr merge "${PR_URL}" --merge --auto |
| 272 | +
|
225 | 273 | - name: 'Create Issue on Failure' |
226 | 274 | if: |- |
227 | 275 | ${{ failure() }} |
|
0 commit comments