124 lines
4.9 KiB
YAML
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
|