From 93c808f7c44dea153cfdedc95f7082ce53c2dd6c Mon Sep 17 00:00:00 2001 From: Phil Ostler <244198+philostler@users.noreply.github.com> Date: Fri, 15 Mar 2024 10:31:10 +0000 Subject: [PATCH] build: add structured release process --- .github/workflows/build.yml | 28 ++++++++++++ .github/workflows/deploy.yml | 40 +++++++++++++++++ .github/workflows/format.yml | 15 +++++++ .github/workflows/lint.yml | 15 +++++++ .github/workflows/main-push.yml | 57 ------------------------- .github/workflows/pull-request.yml | 16 +++++++ .github/workflows/push-main.yml | 47 ++++++++++++++++++++ .github/workflows/upload-to-release.yml | 30 +++++++++++++ .github/workflows/www/setup/action.yml | 22 ++++++++++ packages/www/.prettierignore | 2 + packages/www/package.json | 2 +- release-please-config.json | 9 ++++ release-please-manifest.json | 3 ++ 13 files changed, 228 insertions(+), 58 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/format.yml create mode 100644 .github/workflows/lint.yml delete mode 100644 .github/workflows/main-push.yml create mode 100644 .github/workflows/pull-request.yml create mode 100644 .github/workflows/push-main.yml create mode 100644 .github/workflows/upload-to-release.yml create mode 100644 .github/workflows/www/setup/action.yml create mode 100644 release-please-config.json create mode 100644 release-please-manifest.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..d59badb --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,28 @@ +name: Build +on: + workflow_call: + inputs: + upload-artifact: + default: false + description: Whether to upload the build artifact + required: false + type: boolean +jobs: + www: + name: www + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup + uses: ./.github/workflows/www/setup + - name: Build + # Linting has already been validated so skip to improve build speed + run: yarn build --no-lint + working-directory: packages/www + - name: Upload artifact + uses: actions/upload-artifact@v4 + if: inputs.upload-artifact + with: + name: www + path: packages/www/out diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..53ec306 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,40 @@ +name: Deploy +on: + workflow_dispatch: + inputs: + component: + description: Component + options: + - www + required: true + type: choice + version: + description: Version + required: true + type: string +permissions: + id-token: write + pages: write +jobs: + deploy: + name: Deploy + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - uses: robinraju/release-downloader@v1.9 + name: Download release + with: + extract: true + fileName: ${{ inputs.component }}-${{ inputs.version }}.zip + tag: ${{ inputs.component }}-${{ inputs.version }} + - name: List Files + run: ls -R + - name: Upload + uses: actions/upload-pages-artifact@v3 + with: + path: ${{ inputs.component }}-${{ inputs.version }} + - name: Deploy + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/format.yml b/.github/workflows/format.yml new file mode 100644 index 0000000..9aa4425 --- /dev/null +++ b/.github/workflows/format.yml @@ -0,0 +1,15 @@ +name: Format +on: + workflow_call: +jobs: + www: + name: www + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup + uses: ./.github/workflows/www/setup + - name: Check formatting + run: yarn format:check + working-directory: packages/www diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000..46cfcb0 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,15 @@ +name: Lint +on: + workflow_call: +jobs: + www: + name: www + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup + uses: ./.github/workflows/www/setup + - name: Check linting + run: yarn lint:check + working-directory: packages/www diff --git a/.github/workflows/main-push.yml b/.github/workflows/main-push.yml deleted file mode 100644 index 28abcdd..0000000 --- a/.github/workflows/main-push.yml +++ /dev/null @@ -1,57 +0,0 @@ -name: main Push -on: - push: - branches: main -permissions: - contents: read - id-token: write - pages: write -concurrency: - cancel-in-progress: false - group: "pages" -jobs: - build: - name: Build - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Setup - uses: actions/setup-node@v4 - with: - cache-dependency-path: packages/www/yarn.lock - cache: yarn - node-version: 20.11.1 - - name: Cache - uses: actions/cache@v4 - with: - path: packages/www/.next/cache - key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} - restore-keys: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}- - - name: Dependencies - run: yarn install - working-directory: packages/www - - name: Format - run: yarn format:check - working-directory: packages/www - - name: Lint - run: yarn lint:check - working-directory: packages/www - - name: Build - run: yarn build - working-directory: packages/www - - name: Upload - uses: actions/upload-pages-artifact@v3 - with: - path: packages/www/out - deploy: - name: Deploy - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-latest - needs: build - steps: - - name: Deploy - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 0000000..701e606 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,16 @@ +name: Pull Request +on: + pull_request: + branches: + - "!release-please*/*" +jobs: + format: + name: Format + uses: ./.github/workflows/format.yml + lint: + name: Lint + uses: ./.github/workflows/lint.yml + build: + name: Build + needs: [format, lint] + uses: ./.github/workflows/build.yml diff --git a/.github/workflows/push-main.yml b/.github/workflows/push-main.yml new file mode 100644 index 0000000..82ee62d --- /dev/null +++ b/.github/workflows/push-main.yml @@ -0,0 +1,47 @@ +name: Push main +on: + push: + branches: main +permissions: + contents: write + pull-requests: write +jobs: + release: + name: Release + runs-on: ubuntu-latest + outputs: + releases_created: ${{ steps.release.outputs.releases_created }} + tag_name: ${{ steps.release.outputs['packages/www--tag_name'] }} + version: ${{ steps.release.outputs['packages/www--major'] }}.${{ steps.release.outputs['packages/www--minor'] }}.${{ steps.release.outputs['packages/www--patch'] }} + steps: + - uses: google-github-actions/release-please-action@v4 + id: release + with: + config-file: release-please-config.json + manifest-file: release-please-manifest.json + token: ${{ secrets.RELEASE_PLEASE_TOKEN }} + format: + name: Format + needs: release + if: needs.release.outputs.releases_created == 'true' + uses: ./.github/workflows/format.yml + lint: + name: Lint + needs: release + if: needs.release.outputs.releases_created == 'true' + uses: ./.github/workflows/lint.yml + build: + name: Build + needs: [release, format, lint] + if: needs.release.outputs.releases_created == 'true' + uses: ./.github/workflows/build.yml + with: + upload-artifact: true + upload-to-release: + name: Upload to release + needs: [release, build] + if: needs.release.outputs.releases_created == 'true' + uses: ./.github/workflows/upload-to-release.yml + with: + tag_name: ${{ needs.release.outputs.tag_name }} + version: ${{ needs.release.outputs.version }} diff --git a/.github/workflows/upload-to-release.yml b/.github/workflows/upload-to-release.yml new file mode 100644 index 0000000..f9ded93 --- /dev/null +++ b/.github/workflows/upload-to-release.yml @@ -0,0 +1,30 @@ +name: Upload to Release +on: + workflow_call: + inputs: + tag_name: + description: Tag name to upload to + required: true + type: string + version: + description: Version number + required: true + type: string +jobs: + www: + name: www + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: www + path: www + - name: Archive + run: zip -r www-${{ inputs.version }}.zip www + - name: Upload to release + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh release upload ${{ inputs.tag_name }} www-${{ inputs.version }}.zip diff --git a/.github/workflows/www/setup/action.yml b/.github/workflows/www/setup/action.yml new file mode 100644 index 0000000..305d82d --- /dev/null +++ b/.github/workflows/www/setup/action.yml @@ -0,0 +1,22 @@ +name: Setup +runs: + using: composite + steps: + - name: Setup Node.js environment + uses: actions/setup-node@v4 + with: + cache: yarn + cache-dependency-path: packages/www/yarn.lock + node-version-file: packages/www/package.json + - name: Restore Next.js build cache + uses: actions/cache@v4 + with: + path: packages/www/.next/cache + # Generate a new cache whenever packages or source files change + key: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} + # If source files changed but packages didn't, rebuild from a prior cache + restore-keys: ${{ runner.os }}-nextjs-${{ hashFiles('**/yarn.lock') }}- + - name: Install dependencies + run: yarn install + shell: bash + working-directory: packages/www diff --git a/packages/www/.prettierignore b/packages/www/.prettierignore index a680367..81c0689 100644 --- a/packages/www/.prettierignore +++ b/packages/www/.prettierignore @@ -1 +1,3 @@ .next + +CHANGELOG.md diff --git a/packages/www/package.json b/packages/www/package.json index 87f1d20..f69eee5 100644 --- a/packages/www/package.json +++ b/packages/www/package.json @@ -1,5 +1,5 @@ { - "name": "www.philostler.com", + "name": "@philostler.com/www", "version": "1.0.0", "private": true, "scripts": { diff --git a/release-please-config.json b/release-please-config.json new file mode 100644 index 0000000..8c801d5 --- /dev/null +++ b/release-please-config.json @@ -0,0 +1,9 @@ +{ + "include-v-in-tag": false, + "packages": { + "packages/www": { + "package-name": "www" + } + }, + "pull-request-header": ":rocket: In the Next Release..." +} diff --git a/release-please-manifest.json b/release-please-manifest.json new file mode 100644 index 0000000..10d5ebc --- /dev/null +++ b/release-please-manifest.json @@ -0,0 +1,3 @@ +{ + "packages/www": "1.0.0" +}