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