Skip to content

Commit 0e65950

Browse files
authored
Address publish workflow review feedback (#18)
## Summary - skip npm publishing for GitHub prereleases so prerelease releases cannot publish the default latest dist-tag - check whether @appdmg/appdmg and @appdmg/cli exact versions already exist on npm - skip pack, attestation, artifact upload, and publish steps per package when already published, allowing reruns after partial publish failures - document prerelease and rerun behavior ## Verification - YAML parse for publish workflow
1 parent 20d8b8a commit 0e65950

2 files changed

Lines changed: 41 additions & 0 deletions

File tree

.github/workflows/publish.yml

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ permissions:
1313
jobs:
1414
integration:
1515
name: integration node v24 macos-15-intel
16+
if: github.event.release.prerelease == false
1617
runs-on: macos-15-intel
1718

1819
steps:
@@ -29,6 +30,7 @@ jobs:
2930

3031
publish:
3132
name: publish to npmjs
33+
if: github.event.release.prerelease == false
3234
runs-on: ubuntu-latest
3335
needs: integration
3436

@@ -77,7 +79,36 @@ jobs:
7779
- name: verify cli runtime dependency tree
7880
run: npm ls --omit=dev --all --prefix packages/cli
7981

82+
- name: check appdmg npm package version
83+
id: npm_appdmg
84+
run: |
85+
package_name="$(node -p "require('./package.json').name")"
86+
package_version="$(node -p "require('./package.json').version")"
87+
88+
if npm view "${package_name}@${package_version}" version --json >/dev/null 2>&1; then
89+
echo "exists=true" >> "$GITHUB_OUTPUT"
90+
else
91+
echo "exists=false" >> "$GITHUB_OUTPUT"
92+
fi
93+
94+
echo "package=${package_name}@${package_version}" >> "$GITHUB_OUTPUT"
95+
96+
- name: check cli npm package version
97+
id: npm_cli
98+
run: |
99+
package_name="$(node -p "require('./packages/cli/package.json').name")"
100+
package_version="$(node -p "require('./packages/cli/package.json').version")"
101+
102+
if npm view "${package_name}@${package_version}" version --json >/dev/null 2>&1; then
103+
echo "exists=true" >> "$GITHUB_OUTPUT"
104+
else
105+
echo "exists=false" >> "$GITHUB_OUTPUT"
106+
fi
107+
108+
echo "package=${package_name}@${package_version}" >> "$GITHUB_OUTPUT"
109+
80110
- name: pack appdmg package
111+
if: steps.npm_appdmg.outputs.exists == 'false'
81112
id: pack_appdmg
82113
run: |
83114
mkdir -p dist/appdmg
@@ -87,6 +118,7 @@ jobs:
87118
echo "tarball=$tarball" >> "$GITHUB_OUTPUT"
88119
89120
- name: pack cli package
121+
if: steps.npm_cli.outputs.exists == 'false'
90122
id: pack_cli
91123
run: |
92124
mkdir -p dist/cli
@@ -99,24 +131,28 @@ jobs:
99131
echo "tarball=$tarball" >> "$GITHUB_OUTPUT"
100132
101133
- name: attest npm package artifacts
134+
if: steps.npm_appdmg.outputs.exists == 'false' || steps.npm_cli.outputs.exists == 'false'
102135
uses: actions/attest@v4
103136
with:
104137
subject-path: dist/**/*.tgz
105138

106139
- name: upload npm package artifacts
140+
if: steps.npm_appdmg.outputs.exists == 'false' || steps.npm_cli.outputs.exists == 'false'
107141
uses: actions/upload-artifact@v4
108142
with:
109143
name: npm-packages
110144
path: dist/**/*.tgz
111145
if-no-files-found: error
112146

113147
- name: publish appdmg package
148+
if: steps.npm_appdmg.outputs.exists == 'false'
114149
run: npm publish "$TARBALL" --provenance --access public
115150
env:
116151
TARBALL: ${{ steps.pack_appdmg.outputs.tarball }}
117152
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
118153

119154
- name: publish cli package
155+
if: steps.npm_cli.outputs.exists == 'false'
120156
run: npm publish "$TARBALL" --provenance --access public
121157
env:
122158
TARBALL: ${{ steps.pack_cli.outputs.tarball }}

docs/npm-publishing.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,13 @@ Trusted Publishing works.
3131
Each publish workflow:
3232

3333
- runs on a GitHub-hosted runner with `id-token: write`;
34+
- ignores GitHub prereleases so prerelease tags cannot publish the npm `latest`
35+
dist-tag by accident;
3436
- installs with Node.js 24;
3537
- runs tests, audit, and runtime dependency checks;
38+
- checks whether the exact package version already exists on npm so rerunning a
39+
partially successful release can continue with the remaining unpublished
40+
packages;
3641
- creates the exact npm package tarball with `npm pack`;
3742
- creates a GitHub artifact attestation for that `.tgz`;
3843
- uploads the `.tgz` as a workflow artifact;

0 commit comments

Comments
 (0)