name: Release (experimental) 📦
on:
push:
branches:
- main
permissions:
id-token: write # Necessary for GitHub Actions to authenticate with external services
actions: write # Necessary to cancel workflow executions
checks: write # Necessary to write reports
pull-requests: write # Necessary to comment on PRs
contents: write # Necessary to create a release
concurrency:
group: ${{ github.workflow }}-${{ github.sha }}
cancel-in-progress: true
jobs:
changed:
name: Get changed files 📂
if: ${{ github.repository == 'lazarv/react-server' }}
runs-on: ubuntu-latest
outputs:
should_skip: ${{ steps.changed-files.outputs.any_changed != 'true' }}
all_changed_files: ${{ steps.changed-files.outputs.all_changed_files }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# Assume PRs are less than 50 commits
fetch-depth: 50
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@v45
with:
files: |
packages/**
release:
name: Release 📦
needs: changed
if: github.repository == 'lazarv/react-server' && needs.changed.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4.0.0
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 24
cache: "pnpm"
registry-url: https://registry.npmjs.org
- name: Install dependencies
run: pnpm install
- name: Generate version
run: |
VERSION="0.0.0-experimental-$(git rev-parse --short HEAD)-$(date +'%Y%m%d')-$(openssl rand -hex 4)"
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Prepare @lazarv/rsc
id: prepare-rsc
if: contains(needs.changed.outputs.all_changed_files, 'packages/rsc')
working-directory: ./packages/rsc
run: |
jq --arg new_version "${{ env.VERSION }}" '.version = $new_version' package.json > tmp.json && mv tmp.json package.json
- name: Publish @lazarv/rsc
id: publish-rsc
if: steps.prepare-rsc.outcome == 'success'
working-directory: ./packages/rsc
run: pnpm publish --provenance --access=public --tag=latest
- name: Update @lazarv/react-server dependency on @lazarv/rsc
if: steps.publish-rsc.outcome == 'success'
working-directory: ./packages/react-server
run: |
jq --arg new_version "${{ env.VERSION }}" '.dependencies["@lazarv/rsc"] = $new_version' package.json > tmp.json && mv tmp.json package.json
- name: Get latest @lazarv/rsc version for @lazarv/react-server
if: contains(needs.changed.outputs.all_changed_files, 'packages/react-server') && steps.publish-rsc.outcome != 'success'
working-directory: ./packages/react-server
run: |
RSC_VERSION=$(npm view @lazarv/rsc version 2>/dev/null || echo "")
if [ -n "$RSC_VERSION" ]; then
jq --arg new_version "$RSC_VERSION" '.dependencies["@lazarv/rsc"] = $new_version' package.json > tmp.json && mv tmp.json package.json
fi
- name: Prepare @lazarv/react-server
id: prepare-react-server
if: contains(needs.changed.outputs.all_changed_files, 'packages/react-server') || steps.publish-rsc.outcome == 'success'
working-directory: ./packages/react-server
run: |
jq --arg new_version "${{ env.VERSION }}" '.version = $new_version' package.json > tmp.json && mv tmp.json package.json
- name: Publish @lazarv/react-server
id: publish-react-server
if: steps.prepare-react-server.outcome == 'success'
working-directory: ./packages/react-server
run: pnpm publish --provenance --access=public --tag=latest
- name: Create release
if: steps.publish-react-server.outcome == 'success' || steps.publish-rsc.outcome == 'success'
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "v${{ env.VERSION }}" --generate-notes
- name: Get latest experimental @lazarv/react-server version
id: get-latest-experimental-react-server-version
if: contains(needs.changed.outputs.all_changed_files, 'packages/create-react-server')
working-directory: ./packages/react-server
run: |
jq --arg new_version $(npm view @lazarv/react-server version) '.version = $new_version' package.json > tmp.json && mv tmp.json package.json
- name: Prepare @lazarv/create-react-server
id: prepare-create-react-server
if: contains(needs.changed.outputs.all_changed_files, 'packages/create-react-server')
working-directory: ./packages/create-react-server
run: |
jq --arg new_version "${{ env.VERSION }}" '.version = $new_version' package.json > tmp.json && mv tmp.json package.json
- name: Publish @lazarv/create-react-server
if: steps.prepare-create-react-server.outcome == 'success'
working-directory: ./packages/create-react-server
run: pnpm publish --provenance --access=public --tag=latest