Skip to content

Publish to branch

Publish to branch #1

name: Publish to branch
on:
workflow_dispatch:
push:
branches:
- master
concurrency: ${{ github.workflow }}-${{ github.ref }}
jobs:
build:
name: Build & Pack
runs-on: ubuntu-latest
outputs:
tarnames: ${{ steps.list_tarnames.outputs.tarnames }}
steps:
- name: Checkout Repo
uses: actions/checkout@v4
- name: Setup Node.js lts/*
uses: actions/setup-node@v4
with:
node-version: lts/*
cache: 'yarn'
- name: Install Dependencies
run: yarn install --frozen-lockfile
- name: Build Project
run: NODE_OPTIONS='--max-old-space-size=4096' yarn build:all
- name: Package Version
id: version
run: |
# yarn changeset version
echo "VERSION=$(node -p 'require(\"./package.json\").version')" >> "$GITHUB_ENV"
- name: Build Packages as Tarballs
id: build
run: |
mkdir -p built-packages
mkdir -p packages/built-packages
for pkg_json in $(find packages -mindepth 2 -name package.json ! -path "*/node_modules/*"); do
pkg_dir=$(dirname "$pkg_json")
pkg_name=$(jq -r .name "$pkg_json") || continue
pkg_version=$(jq -r .version "$pkg_json") || continue
if [[ -n "$pkg_name" && -n "$pkg_version" ]]; then
safe_pkg_name=$(echo "$pkg_name" | sed 's/\//_/g')
echo "Packing $pkg_name ($pkg_dir)"
(cd "$pkg_dir" && yarn pack --filename "../../built-packages/${safe_pkg_name}.tgz") || continue
else
echo "Skipping $pkg_dir (invalid package.json)"
fi
done
rsync -a --remove-source-files packages/built-packages/ built-packages/ && rm -r packages/built-packages
- name: Upload Built Packages as Artifacts
uses: actions/upload-artifact@v4
with:
name: built-packages
path: built-packages/
retention-days: 2
- name: List Tar Filenames
id: list_tarnames
run: |
tarnames=$(find built-packages -name "*.tgz" -exec basename {} .tgz \; | jq -R -s -c 'split("\n")[:-1]')
echo "tarnames=$tarnames" >> $GITHUB_OUTPUT
publish:
name: Publish
needs: build
strategy:
matrix:
tarname: ${{ fromJson(needs.build.outputs.tarnames) }}
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v4
- name: Setup Git
run: |
git config --global --add safe.directory '/github/workspace'
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
- name: Set Branch Name
run: |
tarname="${{ matrix.tarname }}"
targetBranch=$(echo "$tarname" | sed 's/_/\//g')
echo "targetBranch=$targetBranch" >> $GITHUB_ENV
echo "sourceBranch=$(git rev-parse --abbrev-ref HEAD)" >> $GITHUB_ENV
- name: Checkout or Create Orphan Branch
run: |
if git ls-remote --exit-code --heads origin "${{ env.targetBranch }}"; then
echo "Branch ${{ env.targetBranch }} already exists."
git fetch origin "${{ env.targetBranch }}"
git checkout "${{ env.targetBranch }}"
if [ -n "$(git ls-files)" ]; then
git rm -rf .
fi
else
echo "Creating orphan branch ${{ env.targetBranch }}"
git checkout --orphan "${{ env.targetBranch }}"
git rm -rf .
git commit --allow-empty -m "Initial commit"
git push origin "${{ env.targetBranch }}"
fi
- name: Download Built Packages
uses: actions/download-artifact@v4
with:
name: built-packages
- name: Extract Package Contents
run: |
mkdir -p tmp
tar -xzf "${{ matrix.tarname }}.tgz" -C tmp
cp -r tmp/package/* .
rm -rf tmp *.tgz
- name: Commit and Push
run: |
git add .
git commit -m "Publish ${{ env.targetBranch }} package"
git push --force origin "${{ env.targetBranch }}"
git checkout --force "${{ env.sourceBranch }}"