Files
2026-07-13 13:18:05 +08:00

124 lines
4.9 KiB
YAML

on: workflow_dispatch
name: publish
env:
NODE_VERSION: 24
jobs:
publish:
runs-on: ubuntu-latest
permissions:
actions: read
contents: write
environment:
name: publish
deployment: false
if: github.ref == 'refs/heads/master'
steps:
- name: Checkout
uses: actions/checkout@v7
with:
submodules: recursive
lfs: true
- name: Setup node
uses: actions/setup-node@v6
with:
node-version: ${{ env.NODE_VERSION }}
- name: Check splat-transform publish status
id: splat-transform
run: |
package_name="$(node -p "require('./packages/splat-transform/package.json').name")"
package_version="$(node -p "require('./packages/splat-transform/package.json').version")"
if npm view "${package_name}@${package_version}" version --registry=https://registry.npmjs.org --silent >/dev/null 2>&1; then
echo "${package_name}@${package_version} already exists on npm."
echo "needs_publish=false" >> "$GITHUB_OUTPUT"
else
echo "${package_name}@${package_version} is not published yet."
echo "needs_publish=true" >> "$GITHUB_OUTPUT"
fi
- name: Resolve latest native build
if: steps.splat-transform.outputs.needs_publish == 'true'
id: native-build
env:
GH_TOKEN: ${{ github.token }}
run: |
run_id="$(gh api --method GET "/repos/${{ github.repository }}/actions/workflows/build-native.yaml/runs" -f branch=master -f status=success -f per_page=1 --jq '.workflow_runs[0].id // empty')"
if [ -z "$run_id" ]; then
echo "No successful build-native workflow run found on master." >&2
exit 1
fi
echo "run_id=$run_id" >> "$GITHUB_OUTPUT"
- name: Download native packages
if: steps.splat-transform.outputs.needs_publish == 'true'
uses: actions/download-artifact@v7
with:
pattern: splat-transform-*
path: packages/splat-transform-native
merge-multiple: false
repository: ${{ github.repository }}
run-id: ${{ steps.native-build.outputs.run_id }}
github-token: ${{ github.token }}
- name: Publish packages
id: publish-packages
env:
NPM_TOKEN: ${{secrets.NPM_TOKEN}}
run: |
set -o pipefail
publish_log="$(mktemp)"
chmod a+x ./ci/publish.sh
./ci/publish.sh | tee "$publish_log"
if grep -q '^published:$' "$publish_log"; then
echo "has_published=true" >> "$GITHUB_OUTPUT"
else
echo "has_published=false" >> "$GITHUB_OUTPUT"
fi
- name: Create GitHub releases
if: steps.publish-packages.outputs.has_published == 'true'
env:
GH_TOKEN: ${{ github.token }}
run: |
git config user.name "github-actions[bot]"
git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
releases=(
"packages/splat-transform|splat-transform|false"
"packages/renderer|aholo-viewer|true"
)
for release in "${releases[@]}"; do
IFS='|' read -r package_dir tag_prefix make_latest <<< "$release"
package_name="$(node -p "require('./${package_dir}/package.json').name")"
package_version="$(node -p "require('./${package_dir}/package.json').version")"
tag_name="${tag_prefix}@${package_version}"
release_name="${tag_prefix} ${package_version}"
if gh release view "$tag_name" --repo "${{ github.repository }}" >/dev/null 2>&1; then
echo "GitHub release ${tag_name} already exists."
continue
fi
echo "Creating GitHub release ${tag_name} for ${package_name}@${package_version}."
release_notes_file="$(mktemp)"
node scripts/read-package-changelog.mjs "$package_name" "$package_version" > "$release_notes_file"
if git ls-remote --exit-code --tags origin "refs/tags/${tag_name}" >/dev/null 2>&1; then
git fetch --force --depth=1 origin "refs/tags/${tag_name}:refs/tags/${tag_name}"
if ! git cat-file -e "${tag_name}^{tag}" 2>/dev/null; then
echo "Tag ${tag_name} already exists but is not an annotated tag." >&2
exit 1
fi
echo "Annotated tag ${tag_name} already exists."
else
git tag -a "$tag_name" "$GITHUB_SHA" -m "$tag_name"
git push origin "refs/tags/${tag_name}"
fi
gh api --method POST "/repos/${{ github.repository }}/releases" \
-f tag_name="$tag_name" \
-f target_commitish="$GITHUB_SHA" \
-f name="$release_name" \
-F body=@"$release_notes_file" \
-f make_latest="$make_latest" >/dev/null
done