Compare commits

..
Author SHA1 Message Date
deytenit 5c86a13559 ci(www): separate release and deploy into manual gated workflows
packages/kits - next/required / Setup - Stage (push) Successful in 41s
packages/ssg - next/required / Setup - Stage (push) Successful in 41s
packages/ui - next/required / Setup - Stage (push) Successful in 40s
services/docs - next/required / Setup - Hugo (push) Successful in 4s
packages/stl - next/required / Setup - Stage (push) Successful in 40s
services/static - next/required / Setup - Stage (push) Successful in 40s
services/www - next/required / Setup - Stage (push) Successful in 40s
packages/kits - next/required / Build - Configs & UI (push) Successful in 32s
packages/ssg - next/required / Build - Configs (push) Successful in 19s
packages/stl - next/required / Build - Configs (push) Successful in 19s
packages/ui - next/required / Build - Configs (push) Successful in 25s
services/docs - next/required / Build - Hugo Site (push) Successful in 4s
services/static - next/required / Build - Configs (push) Successful in 23s
services/www - next/required / Build - Configs (push) Successful in 24s
packages/kits - next/required / Lint - Kits (push) Successful in 53s
packages/kits - next/required / Test - Unit (push) Successful in 27s
packages/kits - next/required / Typecheck - Kits (push) Successful in 21s
packages/kits - next/required / Build - Storybook (push) Successful in 31s
packages/kits - next/required / Build - Kits (push) Successful in 24s
packages/ssg - next/required / Lint - SSG (push) Successful in 23s
packages/ssg - next/required / Typecheck - SSG (push) Successful in 19s
packages/ssg - next/required / Build - SSG (push) Successful in 20s
packages/stl - next/required / Lint - STL (push) Successful in 22s
packages/stl - next/required / Typecheck - STL (push) Successful in 19s
packages/stl - next/required / Test - STL (push) Successful in 22s
packages/stl - next/required / Build - STL (push) Successful in 20s
packages/ui - next/required / Lint - UI (push) Successful in 31s
packages/ui - next/required / Typecheck - UI (push) Successful in 21s
packages/ui - next/required / Test - Unit (push) Successful in 28s
packages/ui - next/required / Build - Storybook (push) Successful in 30s
packages/ui - next/required / Build - UI (push) Successful in 23s
services/docs - next/required / Release - Docker Image (push) Successful in 42s
services/static - next/required / Lint - Static (push) Successful in 24s
services/static - next/required / Typecheck - Static (push) Successful in 21s
services/static - next/required / Build - Static Site (push) Successful in 23s
services/www - next/required / Lint - WWW (push) Successful in 27s
services/www - next/required / Typecheck - WWW (push) Successful in 22s
services/www - next/required / Build - Storybook (push) Successful in 29s
services/www - next/required / Test - Unit (push) Successful in 20s
services/www - next/required / Build - WWW Service (push) Successful in 41s
packages/kits - next/required / Test - Storybook (push) Successful in 4m28s
packages/ui - next/required / Test - Storybook (push) Successful in 4m23s
services/docs - next/required / Deploy - Kubernetes (GitOps) (push) Failing after 2s
services/docs - next/required / Verify - Production Rollout (push) Skipped
services/www - next/required / Test - Storybook (push) Successful in 2m8s
services/static - next/required / Deploy - S3 (push) Failing after 21s
services/www - next/required / Build - Docker Image (push) Successful in 1m40s
2026-11-08 12:14:01 +03:00
deytenit 0c2474ba20 ci: add service-scoped calver tagging and automate www deploy
packages/kits - next/required / Setup - Stage (push) Successful in 41s
packages/ssg - next/required / Setup - Stage (push) Successful in 40s
packages/stl - next/required / Setup - Stage (push) Successful in 41s
packages/ui - next/required / Setup - Stage (push) Successful in 41s
services/docs - next/required / Setup - Hugo (push) Successful in 3s
services/static - next/required / Setup - Stage (push) Successful in 40s
services/www - next/required / Setup - Stage (push) Successful in 41s
packages/kits - next/required / Build - Configs & UI (push) Successful in 34s
packages/ssg - next/required / Build - Configs (push) Successful in 19s
packages/stl - next/required / Build - Configs (push) Successful in 19s
packages/ui - next/required / Build - Configs (push) Successful in 24s
services/docs - next/required / Build - Hugo Site (push) Successful in 5s
services/static - next/required / Build - Configs (push) Successful in 23s
services/www - next/required / Build - Configs (push) Successful in 25s
packages/kits - next/required / Lint - Kits (push) Successful in 53s
packages/kits - next/required / Typecheck - Kits (push) Successful in 21s
packages/kits - next/required / Test - Unit (push) Successful in 24s
packages/kits - next/required / Build - Storybook (push) Successful in 30s
packages/kits - next/required / Build - Kits (push) Successful in 24s
packages/ssg - next/required / Lint - SSG (push) Successful in 22s
packages/ssg - next/required / Typecheck - SSG (push) Successful in 19s
packages/ssg - next/required / Build - SSG (push) Successful in 19s
packages/kits - next/required / Test - Storybook (push) Canceled after 0s
packages/stl - next/required / Typecheck - STL (push) Canceled after 0s
packages/stl - next/required / Test - STL (push) Canceled after 0s
packages/stl - next/required / Build - STL (push) Canceled after 0s
packages/ui - next/required / Lint - UI (push) Canceled after 0s
packages/ui - next/required / Typecheck - UI (push) Canceled after 0s
packages/ui - next/required / Test - Unit (push) Canceled after 0s
packages/ui - next/required / Build - Storybook (push) Canceled after 0s
packages/ui - next/required / Test - Storybook (push) Canceled after 0s
packages/ui - next/required / Build - UI (push) Canceled after 0s
services/docs - next/required / Release - Docker Image (push) Canceled after 0s
services/docs - next/required / Deploy - Kubernetes (GitOps) (push) Canceled after 0s
services/docs - next/required / Verify - Production Rollout (push) Canceled after 0s
services/static - next/required / Lint - Static (push) Canceled after 0s
services/static - next/required / Typecheck - Static (push) Canceled after 0s
services/static - next/required / Build - Static Site (push) Canceled after 0s
services/static - next/required / Deploy - S3 (push) Canceled after 0s
packages/stl - next/required / Lint - STL (push) Successful in 21s
services/www - next/required / Lint - WWW (push) Canceled after 0s
services/www - next/required / Typecheck - WWW (push) Canceled after 0s
services/www - next/required / Build - Storybook (push) Canceled after 0s
services/www - next/required / Test - Unit (push) Canceled after 0s
services/www - next/required / Test - Storybook (push) Canceled after 0s
services/www - next/required / Build - WWW Service (push) Canceled after 0s
services/www - next/required / Build - Docker Image (push) Canceled after 0s
services/www - next/required / Deploy - Kubernetes (GitOps) (push) Canceled after 0s
services/www - next/required / Verify - Production Rollout (push) Canceled after 0s
2026-11-08 11:25:21 +03:00
deytenit b4387b0616 chore(release): deploy www sha-4e0bb72 [skip ci] 2026-11-08 11:18:18 +03:00
adam 7f0c50801d chore(release): deploy docs sha-4e0bb72 [skip ci] 2026-11-08 11:18:18 +03:00
deytenit 3893281fa1 ci: migrate workflows and automation to Gitea Actions 2026-11-08 11:18:14 +03:00
adam-at-deytenit 22a9351de7 chore(release): deploy www sha-84772ff [skip ci] 2026-11-08 11:17:56 +03:00
adam-at-deytenit 257c3edd85 chore(release): deploy docs sha-84772ff [skip ci] 2026-11-08 11:17:56 +03:00
deytenit a45659b3cc fix(analytics): serve umami via /trace/trace.js and add privacy policy with opt-out switch (#71) 2026-11-08 11:17:56 +03:00
adam-at-deytenit 86d353ec2d chore(release): deploy www sha-9200529 [skip ci] 2026-11-08 11:17:56 +03:00
adam-at-deytenit 71f06a3d68 chore(release): deploy docs sha-9200529 [skip ci] 2026-11-08 11:17:56 +03:00
deytenit 8ce34c75f3 feat: migrate static S3 storage to Cloudflare R2 and add multi-locale SSG support (#70)
## Summary

- **Cloudflare R2 Migration**:
- Migrated `static.ermnvldmr.com` asset storage to Cloudflare R2 bucket
`com-ermnvldmr-static` (location `WEUR`).
- Added support for `COM_ERMNVLDMR_STATIC_PUBLIC_URL` fallback in
`@ermnvldmr/cli` to properly format public asset URLs for non-dotted
bucket names.
- Relocated public CA cert to
`/dev/ssl/certs/ErmnvldmrDevelopmentRootCA.pem` and updated
`REMOTE_ROOT_CA_URL` references in `@ermnvldmr/rsbuild-config` and
`ensure-dev-certs.mjs`.
- Configured R2 CORS policies using wildcards
(`https://*.ermnvldmr.com`, `https://ermnvldmr.com`,
`https://localhost.ermnvldmr.com*`, `http://localhost*`,
`https://direct.yandex.ru`, `https://*.direct.yandex.ru`,
`https://localhost.yandex.ru*`).
  - Enforced minimum TLS 1.2 on zone `ermnvldmr.com`.
- Updated encrypted `.env.dev` and GitHub secrets in both
`deytenit/ermnvldmr.com` and `deytenit/apex.ermnvldmr.com`.

- **Multi-locale SSG Support**:
- Added `NormalModuleReplacementPlugin` to SSR runner in
`@ermnvldmr/ssg` for automatic `.en.mdx` -> `.${locale}.mdx`
substitution during Russian builds.
- Added page metadata extraction (`getPageOptions`) in `@ermnvldmr/ssg`
for pre-rendered `<title>` and `<meta name="description">` tags.
- Added unit test suite for `createPage` and updated `services/www`
build scripts (`build:all`, `build:en`, `build:ru`, `dev:en`, `dev:ru`).
2026-11-08 11:17:51 +03:00
adam-at-deytenit 688c3a4b97 chore(release): deploy docs sha-0e77ea1 [skip ci] 2026-11-08 11:17:42 +03:00
deytenit cff22c88dd docs(apex): clarify public operations and configuration (#69) 2026-11-08 11:17:35 +03:00
57 changed files with 17223 additions and 3738 deletions

No files matched your search

+1
View File
@@ -0,0 +1 @@
[git.ermnvldmr.com]:22222,[45.150.33.239]:22222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBXcvf3Lds3AKfGHGh00IWR9tSRbBBqrV/CC6JBGmcrD
@@ -0,0 +1,70 @@
name: ci - next/build-golden-image
'on':
workflow_dispatch: null
concurrency:
group: ci-golden-image
cancel-in-progress: false
permissions:
contents: read
jobs:
validate-scripts:
name: Validate - Provisioner Scripts
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Validate Shell Script Syntax
run: bash -n ci/packer/scripts/*.sh
build-image:
name: Build - Golden Image
needs: validate-scripts
runs-on: apex-debian13
outputs:
image_name: ${{ steps.vars.outputs.image_name }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Calculate Image Name
id: vars
run: 'SHORT_SHA="$(echo ${{ github.sha }} | cut -c1-7)"
IMAGE_NAME="com-ermnvldmr-debian-12-k3s-amd64-${SHORT_SHA}.qcow2"
echo "image_name=${IMAGE_NAME}" >> "$GITHUB_OUTPUT"
'
- name: Install Build Tools
run: 'sudo apt-get update
sudo apt-get install -y qemu-utils
'
- name: Build Debian K3s Golden Image
run: bash ci/scripts/build-golden-image.sh
- name: Prepare and Upload Image Artifact
uses: actions/upload-artifact@v4
with:
name: golden-image
path: output-qemu/com-ermnvldmr-debian-12-k3s-amd64.qcow2
retention-days: 30
upload-s3:
name: Upload - S3 Storage
needs: build-image
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download Image Artifact
uses: actions/download-artifact@v4
with:
name: golden-image
path: output-qemu
- name: Upload to Static S3 (/dev/images/)
run: bash ci/scripts/upload-golden-image.sh "${IMAGE_NAME}"
env:
AWS_ACCESS_KEY_ID: ${{ secrets.STATIC_AWS_ACCESS_KEY_ID || secrets.COM_ERMNVLDMR_STATIC_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.STATIC_AWS_SECRET_ACCESS_KEY || secrets.COM_ERMNVLDMR_STATIC_AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.STATIC_AWS_REGION || secrets.COM_ERMNVLDMR_STATIC_S3_REGION || 'auto' }}
S3_ENDPOINT: ${{ secrets.STATIC_S3_ENDPOINT_URL || secrets.COM_ERMNVLDMR_STATIC_S3_ENDPOINT_URL }}
S3_BUCKET: ${{ secrets.STATIC_S3_BUCKET || secrets.COM_ERMNVLDMR_STATIC_S3_BUCKET }}
IMAGE_NAME: ${{ needs.build-image.outputs.image_name }}
@@ -0,0 +1,332 @@
name: packages/kits - next/required
'on':
push:
branches:
- next
paths:
- packages/kits/**
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/packages-kits-next-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-next-kits-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs & UI
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Build UI
run: pnpm --filter @ermnvldmr/ui build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 30
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 30
- name: Upload UI dist
uses: actions/upload-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
retention-days: 30
lint-kits:
name: Lint - Kits
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Lint Kits package
run: pnpm --filter @ermnvldmr/kits lint
typecheck-kits:
name: Typecheck - Kits
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Typecheck Kits package
run: pnpm --filter @ermnvldmr/kits typecheck
test-kits:
name: Test - Unit
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Test Kits package
run: pnpm --filter @ermnvldmr/kits test:coverage
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits Storybook
run: pnpm --filter @ermnvldmr/kits build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
retention-days: 30
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/kits exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
- name: Test Storybook
run: pnpm --filter @ermnvldmr/kits test:storybook:ci
build-kits:
name: Build - Kits
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits package
run: pnpm --filter @ermnvldmr/kits build
@@ -0,0 +1,332 @@
name: packages/kits - pr/required
'on':
pull_request:
branches:
- next
paths:
- packages/kits/**
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/packages-kits-pr-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-pr-kits-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs & UI
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Build UI
run: pnpm --filter @ermnvldmr/ui build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 30
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 30
- name: Upload UI dist
uses: actions/upload-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
retention-days: 30
lint-kits:
name: Lint - Kits
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Lint Kits package
run: pnpm --filter @ermnvldmr/kits lint
typecheck-kits:
name: Typecheck - Kits
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Typecheck Kits package
run: pnpm --filter @ermnvldmr/kits typecheck
test-kits:
name: Test - Unit
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Test Kits package
run: pnpm --filter @ermnvldmr/kits test:coverage
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits Storybook
run: pnpm --filter @ermnvldmr/kits build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
retention-days: 30
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/kits exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
- name: Test Storybook
run: pnpm --filter @ermnvldmr/kits test:storybook:ci
build-kits:
name: Build - Kits
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits package
run: pnpm --filter @ermnvldmr/kits build
@@ -0,0 +1,133 @@
name: packages/ssg - next/required
'on':
push:
branches:
- next
paths:
- packages/ssg/**
- .gitea/workflows/packages-ssg-next-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-ssg-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 30
lint-ssg:
name: Lint - SSG
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Lint SSG package
run: pnpm --filter @ermnvldmr/ssg lint
typecheck-ssg:
name: Typecheck - SSG
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Typecheck SSG package
run: pnpm --filter @ermnvldmr/ssg typecheck
build-ssg:
name: Build - SSG
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Build SSG package
run: pnpm --filter @ermnvldmr/ssg build
@@ -0,0 +1,133 @@
name: packages/ssg - pr/required
'on':
pull_request:
branches:
- next
paths:
- packages/ssg/**
- .gitea/workflows/packages-ssg-pr-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-pr-ssg-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 30
lint-ssg:
name: Lint - SSG
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Lint SSG package
run: pnpm --filter @ermnvldmr/ssg lint
typecheck-ssg:
name: Typecheck - SSG
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Typecheck SSG package
run: pnpm --filter @ermnvldmr/ssg typecheck
build-ssg:
name: Build - SSG
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Build SSG package
run: pnpm --filter @ermnvldmr/ssg build
@@ -0,0 +1,156 @@
name: packages/stl - next/required
'on':
push:
branches:
- next
paths:
- packages/stl/**
- .gitea/workflows/packages-stl-next-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-stl-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 30
lint-stl:
name: Lint - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Lint STL package
run: pnpm --filter @ermnvldmr/stl lint
typecheck-stl:
name: Typecheck - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Typecheck STL package
run: pnpm --filter @ermnvldmr/stl typecheck
test-stl:
name: Test - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Test STL package
run: pnpm --filter @ermnvldmr/stl test:coverage
build-stl:
name: Build - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Build STL package
run: pnpm --filter @ermnvldmr/stl build
@@ -0,0 +1,157 @@
name: packages/stl - pr/required
'on':
pull_request:
branches:
- next
paths:
- packages/stl/**
- .gitea/workflows/packages-stl-pr-required.yml
- pnpm-lock.yaml
- ci/scripts/**
workflow_dispatch: {}
concurrency:
group: ci-pr-stl-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 30
lint-stl:
name: Lint - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Lint STL package
run: pnpm --filter @ermnvldmr/stl lint
typecheck-stl:
name: Typecheck - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Typecheck STL package
run: pnpm --filter @ermnvldmr/stl typecheck
test-stl:
name: Test - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Test STL package
run: pnpm --filter @ermnvldmr/stl test:coverage
build-stl:
name: Build - STL
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Build STL package
run: pnpm --filter @ermnvldmr/stl build
@@ -0,0 +1,284 @@
name: packages/ui - next/required
'on':
push:
branches:
- next
paths:
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/packages-ui-next-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-ui-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
retention-days: 30
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
retention-days: 30
lint-ui:
name: Lint - UI
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Lint UI package
run: pnpm --filter @ermnvldmr/ui lint
typecheck-ui:
name: Typecheck - UI
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Typecheck UI package
run: pnpm --filter @ermnvldmr/ui typecheck
test-ui:
name: Test - Unit
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Test UI package
run: pnpm --filter @ermnvldmr/ui test:coverage
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Build UI Storybook
run: pnpm --filter @ermnvldmr/ui build-storybook
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/ui exec playwright install --with-deps chromium
- name: Build UI Storybook
run: pnpm --filter @ermnvldmr/ui build-storybook
- name: Test Storybook
run: pnpm --filter @ermnvldmr/ui test:storybook:ci
build-ui:
name: Build - UI
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Build UI package
run: pnpm --filter @ermnvldmr/ui build
@@ -0,0 +1,293 @@
name: packages/ui - pr/required
'on':
pull_request:
branches:
- next
paths:
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/packages-ui-pr-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-pr-ui-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 30
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 30
lint-ui:
name: Lint - UI
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Lint UI package
run: pnpm --filter @ermnvldmr/ui lint
typecheck-ui:
name: Typecheck - UI
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Typecheck UI package
run: pnpm --filter @ermnvldmr/ui typecheck
test-ui:
name: Test - Unit
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Test UI package
run: pnpm --filter @ermnvldmr/ui test:coverage
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Build UI Storybook
run: pnpm --filter @ermnvldmr/ui build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: ui-storybook-static-${{ github.run_id }}
path: packages/ui/storybook-static/
retention-days: 30
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/ui exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: ui-storybook-static-${{ github.run_id }}
path: packages/ui/storybook-static/
- name: Test Storybook
run: pnpm --filter @ermnvldmr/ui test:storybook:ci
build-ui:
name: Build - UI
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Build UI package
run: pnpm --filter @ermnvldmr/ui build
@@ -0,0 +1,144 @@
name: services/docs - next/required
'on':
push:
branches:
- next
paths:
- services/docs/**
- .gitea/workflows/services-docs-next-required.yml
- ci/docker/docs/**
- ci/config/nginx/**
- ci/scripts/**
workflow_dispatch:
concurrency:
group: ci-docs-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-hugo:
name: Setup - Hugo
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Hugo
run: hugo version | grep extended
build-hugo:
name: Build - Hugo Site
needs: setup-hugo
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Hugo
run: hugo version | grep extended
- name: Build Hugo site
working-directory: services/docs
run: hugo --gc --minify
release-docker:
name: Release - Docker Image
needs: build-hugo
runs-on: apex-debian13
permissions:
contents: read
packages: write
outputs:
short_sha: ${{ steps.vars.outputs.short_sha }}
version: ${{ steps.vars.outputs.version }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Log in to Gitea Container Registry
run: python3 ci/scripts/docker.py login
env:
REGISTRY: git.ermnvldmr.com
REGISTRY_USER: ${{ github.repository_owner }}
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
- name: Compute version and metadata
id: vars
run: |
SHORT_SHA="sha-$(echo ${{ github.sha }} | cut -c1-7)"
VERSION=$(bash ci/scripts/calver-release.sh docs)
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Create and push release tag
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
run: bash ci/scripts/calver-release.sh tag docs "${{ github.sha }}" "${{ steps.vars.outputs.version }}"
env:
GIT_WRITE_KEY: ${{ secrets.DOCS_DEPLOY_KEY }}
- name: Extract Docker metadata
id: meta
run: python3 ci/scripts/docker.py metadata
env:
IMAGES: git.ermnvldmr.com/${{ github.repository }}/docs
TAG_RULES: |
type=raw,value=latest
type=raw,value=${{ steps.vars.outputs.version }}
type=sha,format=short
SOURCE_SHA: ${{ github.sha }}
- name: Build and push Docker image
run: python3 ci/scripts/docker.py build
env:
TAGS: ${{ steps.meta.outputs.tags }}
LABELS: ${{ steps.meta.outputs.labels }}
BUILD_ARGS: |
COMMIT_SHA=${{ steps.vars.outputs.short_sha }}
VERSION=${{ steps.vars.outputs.version }}
DOCKERFILE: ci/docker/docs/Dockerfile
PLATFORMS: ''
PUSH: 'true'
CONTEXT: .
SOURCE_SHA: ${{ github.sha }}
RUN_ID: ${{ github.run_id }}
deploy:
name: Deploy - Kubernetes (GitOps)
needs: release-docker
runs-on: apex-debian13
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: next
- name: Setup Kustomize
run: test "$(kustomize version)" = v5.3.0
- name: Deploy via GitOps
run: |
DOCS_TAG="${{ needs.release-docker.outputs.version }}"
bash ci/scripts/deploy-gitops.sh docs "${DOCS_TAG}"
env:
GIT_WRITE_KEY: ${{ secrets.DOCS_DEPLOY_KEY }}
verify-rollout:
name: Verify - Production Rollout
needs:
- release-docker
- deploy
runs-on: apex-debian13
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: next
- name: Await production rollout
run: |
DOCS_TAG="${{ needs.release-docker.outputs.version }}"
bash ci/scripts/await-rollout.sh docs "${DOCS_TAG}"
@@ -0,0 +1,40 @@
name: services/docs - pr/required
'on':
pull_request:
branches:
- next
paths:
- services/docs/**
- .gitea/workflows/services-docs-pr-required.yml
- ci/scripts/**
concurrency:
group: ci-pr-docs-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-hugo:
name: Setup - Hugo
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Hugo
run: hugo version | grep extended
build-hugo:
name: Build - Hugo Site
needs: setup-hugo
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Setup Hugo
run: hugo version | grep extended
- name: Build Hugo site
working-directory: services/docs
run: hugo --gc --minify
@@ -0,0 +1,195 @@
name: services/static - next/required
'on':
push:
branches:
- next
paths:
- services/static/**
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/services-static-next-required.yml
- ci/scripts/**
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-static-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
retention-days: 30
lint-static:
name: Lint - Static
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Lint static service
run: pnpm --filter @ermnvldmr/static lint
typecheck-static:
name: Typecheck - Static
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Typecheck static service
run: pnpm --filter @ermnvldmr/static typecheck
build-static:
name: Build - Static Site
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Build static service
run: pnpm --filter @ermnvldmr/static build
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: static-dist
path: services/static/dist/
retention-days: 30
deploy-s3:
name: Deploy - S3
needs:
- lint-static
- typecheck-static
- build-static
runs-on: apex-debian13
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: static-dist
path: services/static/dist/
- name: Deploy to S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.STATIC_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.STATIC_AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.STATIC_AWS_REGION }}
S3_BUCKET: ${{ secrets.STATIC_S3_BUCKET }}
AWS_REGION: ${{ secrets.STATIC_AWS_REGION }}
S3_ENDPOINT_URL: ${{ secrets.STATIC_S3_ENDPOINT_URL }}
run: 'chmod +x ci/scripts/deploy-static.sh
./ci/scripts/deploy-static.sh
'
@@ -0,0 +1,166 @@
name: services/static - pr/required
'on':
pull_request:
branches:
- next
paths:
- services/static/**
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/services-static-pr-required.yml
- ci/scripts/**
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-pr-static-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 30
lint-static:
name: Lint - Static
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Lint static service
run: pnpm --filter @ermnvldmr/static lint
typecheck-static:
name: Typecheck - Static
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Typecheck static service
run: pnpm --filter @ermnvldmr/static typecheck
build-static:
name: Build - Static Site
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Build static service
run: pnpm --filter @ermnvldmr/static build
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: static-dist-${{ github.run_id }}
path: services/static/dist/
retention-days: 30
@@ -0,0 +1,88 @@
name: services/www - manual deploy
'on':
workflow_dispatch:
inputs:
tested_sha:
description: Full tested source commit (leave blank for latest)
required: false
type: string
default: ''
tested_digest:
description: OCI sha256 digest from the successful build (leave blank for latest)
required: false
type: string
default: ''
build_run_id:
description: Successful WWW build run ID (leave blank for latest)
required: false
type: string
default: ''
release_tag:
description: Previously approved release tag (leave blank for latest)
required: false
type: string
default: ''
release_run_id:
description: Approved release run ID (leave blank for latest)
required: false
type: string
default: ''
permissions:
contents: write
actions: read
jobs:
deploy:
name: Deploy - Kubernetes (GitOps)
runs-on: apex-debian13
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/next' && github.actor == 'deytenit'
outputs:
short_sha: ${{ steps.provenance.outputs.short_sha }}
tested_digest: ${{ steps.provenance.outputs.tested_digest }}
release_tag: ${{ steps.provenance.outputs.release_tag }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: next
- name: Authenticate local registry
run: python3 ci/scripts/docker.py login
env:
REGISTRY: git.ermnvldmr.com
REGISTRY_USER: ${{ github.repository_owner }}
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
- name: Verify successful build and approved release
id: provenance
run: python3 ci/scripts/provenance.py
env:
IS_DEPLOY: 'true'
TESTED_SHA: ${{ inputs.tested_sha }}
TESTED_DIGEST: ${{ inputs.tested_digest }}
BUILD_RUN_ID: ${{ inputs.build_run_id }}
RELEASE_RUN_ID: ${{ inputs.release_run_id }}
RELEASE_TAG: ${{ inputs.release_tag }}
PROVENANCE_TOKEN: ${{ github.token }}
- name: Setup Kustomize
run: test "$(kustomize version)" = v5.3.0
- name: Deploy via GitOps
run: |
RELEASE_TAG="${{ steps.provenance.outputs.release_tag }}"
TESTED_DIGEST="${{ steps.provenance.outputs.tested_digest }}"
TESTED_SHA="${{ steps.provenance.outputs.tested_sha }}"
echo "Deploying www digest $TESTED_DIGEST ($RELEASE_TAG)..."
bash ci/scripts/deploy-gitops.sh www "$TESTED_DIGEST"
env:
GIT_WRITE_KEY: ${{ secrets.WWW_DEPLOY_KEY }}
verify-rollout:
name: Verify - Production Rollout
needs: deploy
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: next
- name: Await production rollout
run: |
bash ci/scripts/await-rollout.sh www "${{ needs.deploy.outputs.short_sha }}"
@@ -0,0 +1,377 @@
name: services/www - next/required
'on':
push:
branches:
- next
paths:
- services/www/**
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/services-www-next-required.yml
- ci/docker/www/**
- ci/config/nginx/**
- ci/scripts/**
- pnpm-lock.yaml
- ci/scripts/**
workflow_dispatch: null
concurrency:
group: ci-www-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
retention-days: 30
- name: Build i18n package
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
retention-days: 30
lint-www:
name: Lint - WWW
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Lint WWW service
run: pnpm --filter @ermnvldmr/www lint
typecheck-www:
name: Typecheck - WWW
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Typecheck WWW service
run: pnpm --filter @ermnvldmr/www typecheck
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Build WWW Storybook
run: pnpm --filter @ermnvldmr/www build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: storybook-static
path: services/www/storybook-static/
retention-days: 30
test-www:
name: Test - Unit
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Test WWW service
run: pnpm --filter @ermnvldmr/www test:coverage
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/www exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: storybook-static
path: services/www/storybook-static/
- name: Serve Storybook and run tests with coverage
run: pnpm --filter @ermnvldmr/www test:storybook:ci
build-www:
name: Build - WWW Service
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Build WWW service (all locales)
run: pnpm --filter @ermnvldmr/www build:all
env:
RSDOCTOR: 'true'
- name: Upload Rsdoctor report
uses: actions/upload-artifact@v4
with:
name: rsdoctor-report
path: services/www/rsdoctor/
retention-days: 30
build-docker:
name: Build - Docker Image
needs:
- lint-www
- typecheck-www
- test-www
- test-storybook
- build-www
runs-on: apex-debian13
permissions:
contents: read
packages: write
outputs:
short_sha: ${{ steps.vars.outputs.short_sha }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Calculate Short SHA
id: vars
run: |
SHORT_SHA="sha-$(echo ${{ github.sha }} | cut -c1-7)"
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
- name: Log in to Gitea Container Registry
run: python3 ci/scripts/docker.py login
env:
REGISTRY: git.ermnvldmr.com
REGISTRY_USER: ${{ github.repository_owner }}
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
- name: Extract Docker metadata
id: meta
run: python3 ci/scripts/docker.py metadata
env:
IMAGES: git.ermnvldmr.com/${{ github.repository }}/www
TAG_RULES: |
type=sha,format=short
SOURCE_SHA: ${{ github.sha }}
- name: Build and push Docker image
run: python3 ci/scripts/docker.py build
env:
TAGS: ${{ steps.meta.outputs.tags }}
LABELS: ${{ steps.meta.outputs.labels }}
BUILD_ARGS: |
COMMIT_SHA=${{ steps.vars.outputs.short_sha }}
VERSION=${{ steps.vars.outputs.short_sha }}
DOCKERFILE: ci/docker/www/Dockerfile
PLATFORMS: ''
PUSH: 'true'
CONTEXT: .
SOURCE_SHA: ${{ github.sha }}
RUN_ID: ${{ github.run_id }}
id: image
- name: Record tested digest provenance
env:
IMAGE_DIGEST: ${{ steps.image.outputs.digest }}
run: |
mkdir -p .ci
python3 - <<'PROVENANCE'
import json, os
from pathlib import Path
Path('.ci/www-provenance.json').write_text(json.dumps({
'sha': os.environ['GITHUB_SHA'],
'digest': os.environ['IMAGE_DIGEST'],
'run_id': os.environ['GITHUB_RUN_ID'],
'repository': os.environ['GITHUB_REPOSITORY']
}))
PROVENANCE
- uses: actions/upload-artifact@v4
with:
name: www-provenance
path: .ci/www-provenance.json
retention-days: 30
@@ -0,0 +1,302 @@
name: services/www - pr/required
'on':
pull_request:
branches:
- next
paths:
- services/www/**
- packages/ui/**
- packages/stl/**
- packages/i18n/**
- .gitea/workflows/services-www-pr-required.yml
- pnpm-lock.yaml
- ci/scripts/**
concurrency:
group: ci-pr-www-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: apex-debian13
outputs: {}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Pack dependency cache
run: python3 ci/scripts/cache.py pack
- uses: actions/upload-artifact@v4
with:
name: ${{ steps.dependency-cache.outputs.key }}
path: .ci/pnpm-store.tar
retention-days: 7
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 30
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 30
- name: Build i18n package
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 30
lint-www:
name: Lint - WWW
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Lint WWW service
run: pnpm --filter @ermnvldmr/www lint
typecheck-www:
name: Typecheck - WWW
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Typecheck WWW service
run: pnpm --filter @ermnvldmr/www typecheck
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Build WWW Storybook
run: pnpm --filter @ermnvldmr/www build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: www-storybook-static-${{ github.run_id }}
path: services/www/storybook-static/
retention-days: 30
test-www:
name: Test - Unit
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Test WWW service
run: pnpm --filter @ermnvldmr/www test:coverage
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/www exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: www-storybook-static-${{ github.run_id }}
path: services/www/storybook-static/
- name: Serve Storybook and run tests with coverage
run: pnpm --filter @ermnvldmr/www test:storybook:ci
build-www:
name: Build - WWW Service
needs: build-configs
runs-on: apex-debian13
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Setup environment
run: bash ci/scripts/setup-env.sh 9.12.3 20
- name: Restore repository dependency cache
id: dependency-cache
run: python3 ci/scripts/cache.py restore
env:
CACHE_TOKEN: ${{ github.token }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Build WWW service (all locales)
run: pnpm --filter @ermnvldmr/www build:all
env:
RSDOCTOR: 'true'
- name: Upload Rsdoctor report
uses: actions/upload-artifact@v4
with:
name: rsdoctor-report-${{ github.run_id }}
path: services/www/rsdoctor/
retention-days: 30
@@ -0,0 +1,91 @@
name: services/www - manual release
'on':
workflow_dispatch:
inputs:
tested_sha:
description: Full tested source commit (leave blank for latest)
required: false
type: string
default: ''
tested_digest:
description: OCI sha256 digest (leave blank for latest)
required: false
type: string
default: ''
build_run_id:
description: Successful WWW build run ID (leave blank for latest)
required: false
type: string
default: ''
permissions:
contents: write
packages: write
actions: read
jobs:
release:
name: Release - Tag and Promote
runs-on: apex-debian13
if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/next' && github.actor == 'deytenit'
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Authenticate local registry
run: python3 ci/scripts/docker.py login
env:
REGISTRY: git.ermnvldmr.com
REGISTRY_USER: ${{ github.repository_owner }}
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
- name: Verify successful build and immutable digest
id: provenance
run: python3 ci/scripts/provenance.py
env:
TESTED_SHA: ${{ inputs.tested_sha }}
TESTED_DIGEST: ${{ inputs.tested_digest }}
BUILD_RUN_ID: ${{ inputs.build_run_id }}
PROVENANCE_TOKEN: ${{ github.token }}
- name: Promote tested digest and create release tag
env:
TESTED_SHA: ${{ steps.provenance.outputs.tested_sha }}
TESTED_DIGEST: ${{ steps.provenance.outputs.tested_digest }}
BUILD_RUN_ID: ${{ steps.provenance.outputs.build_run_id }}
PROVENANCE_TOKEN: ${{ github.token }}
GIT_WRITE_KEY: ${{ secrets.WWW_DEPLOY_KEY }}
run: |
set -euo pipefail
VERSION=$(bash ci/scripts/calver-release.sh www)
TAG_NAME="services/www-$VERSION"
echo "Tagging Git commit $TESTED_SHA with $TAG_NAME..."
bash ci/scripts/calver-release.sh tag www "$TESTED_SHA" "$VERSION"
echo "Promoting Docker image to $VERSION and latest..."
docker buildx imagetools create --prefer-index=false \
"git.ermnvldmr.com/${{ github.repository }}/www@$TESTED_DIGEST" \
--tag "git.ermnvldmr.com/${{ github.repository }}/www:$VERSION" \
--tag "git.ermnvldmr.com/${{ github.repository }}/www:latest"
test "$(docker buildx imagetools inspect "git.ermnvldmr.com/${{ github.repository }}/www:$VERSION" --format '{{.Manifest.Digest}}')" = "$TESTED_DIGEST"
export VERSION TAG_NAME
mkdir -p .ci
python3 - <<'RELEASE_PROVENANCE'
import json, os
from pathlib import Path
Path('.ci/www-release.json').write_text(json.dumps({
'sha': os.environ['TESTED_SHA'],
'digest': os.environ['TESTED_DIGEST'],
'run_id': os.environ['BUILD_RUN_ID'],
'repository': os.environ['GITHUB_REPOSITORY'],
'release_tag': os.environ['TAG_NAME'],
'version': os.environ['VERSION']
}))
RELEASE_PROVENANCE
- uses: actions/upload-artifact@v4
with:
name: www-release-provenance
path: .ci/www-release.json
retention-days: 30
@@ -1,134 +0,0 @@
name: ci - next/build-golden-image
on:
workflow_dispatch:
concurrency:
group: ci-golden-image
cancel-in-progress: false
permissions:
contents: read
jobs:
validate-scripts:
name: Validate - Provisioner Scripts
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Validate Shell Script Syntax
run: bash -n ci/packer/scripts/*.sh
build-image:
name: Build - Golden Image
needs: validate-scripts
runs-on: ubuntu-latest
outputs:
image_name: ${{ steps.vars.outputs.image_name }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Calculate Image Name
id: vars
run: |
SHORT_SHA="$(echo ${{ github.sha }} | cut -c1-7)"
IMAGE_NAME="com-ermnvldmr-debian-12-k3s-amd64-${SHORT_SHA}.qcow2"
echo "image_name=${IMAGE_NAME}" >> "$GITHUB_OUTPUT"
- name: Install Build Tools
run: |
sudo apt-get update
sudo apt-get install -y qemu-utils
- name: Build Debian K3s Golden Image
run: |
mkdir -p output-qemu
echo "Downloading official Debian 12 cloud image..."
curl -fsSL -o base.qcow2 https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
echo "Expanding disk image to 10G..."
qemu-img resize base.qcow2 10G
echo "Connecting disk image via NBD..."
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 base.qcow2
sleep 1
sudo partx -u /dev/nbd0 || true
echo "Mounting disk filesystem..."
sudo mkdir -p /mnt/target
sudo mount /dev/nbd0p1 /mnt/target
echo "Mounting host virtual filesystems and configuring DNS..."
sudo rm -f /mnt/target/etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /mnt/target/etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee -a /mnt/target/etc/resolv.conf
sudo mount --bind /dev /mnt/target/dev
sudo mount --bind /dev/pts /mnt/target/dev/pts
sudo mount --bind /proc /mnt/target/proc
sudo mount --bind /sys /mnt/target/sys
echo "Copying provisioner scripts..."
sudo mkdir -p /mnt/target/tmp/scripts
sudo cp ci/packer/scripts/*.sh /mnt/target/tmp/scripts/
sudo chmod +x /mnt/target/tmp/scripts/*.sh
echo "Running provisioner scripts in chroot..."
sudo chroot /mnt/target /bin/bash /tmp/scripts/01-base-system.sh
sudo chroot /mnt/target /bin/bash /tmp/scripts/02-install-k3s.sh
sudo chroot /mnt/target /bin/bash /tmp/scripts/03-cleanup.sh
sudo rm -rf /mnt/target/tmp/scripts
echo "Unmounting filesystems..."
sudo umount /mnt/target/sys
sudo umount /mnt/target/proc
sudo umount /mnt/target/dev/pts
sudo umount /mnt/target/dev
sudo umount /mnt/target
sudo qemu-nbd --disconnect /dev/nbd0
echo "Compressing and optimizing qcow2 with 2M cluster size..."
qemu-img convert -f qcow2 -O qcow2 -o cluster_size=2M -c base.qcow2 output-qemu/com-ermnvldmr-debian-12-k3s-amd64.qcow2
echo "Golden image built successfully."
- name: Prepare and Upload Image Artifact
uses: actions/upload-artifact@v4
with:
name: golden-image
path: output-qemu/com-ermnvldmr-debian-12-k3s-amd64.qcow2
retention-days: 1
upload-s3:
name: Upload - S3 Storage
needs: build-image
runs-on: ubuntu-latest
steps:
- name: Download Image Artifact
uses: actions/download-artifact@v4
with:
name: golden-image
path: output-qemu
- name: Upload to Static S3 (/dev/images/)
env:
AWS_ACCESS_KEY_ID: ${{ secrets.STATIC_AWS_ACCESS_KEY_ID || secrets.COM_ERMNVLDMR_STATIC_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.STATIC_AWS_SECRET_ACCESS_KEY || secrets.COM_ERMNVLDMR_STATIC_AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.STATIC_AWS_REGION || secrets.COM_ERMNVLDMR_STATIC_S3_REGION || 'auto' }}
S3_ENDPOINT: ${{ secrets.STATIC_S3_ENDPOINT_URL || secrets.COM_ERMNVLDMR_STATIC_S3_ENDPOINT_URL }}
S3_BUCKET: ${{ secrets.STATIC_S3_BUCKET || secrets.COM_ERMNVLDMR_STATIC_S3_BUCKET }}
IMAGE_NAME: ${{ needs.build-image.outputs.image_name }}
run: |
mv output-qemu/com-ermnvldmr-debian-12-k3s-amd64.qcow2 "output-qemu/${IMAGE_NAME}"
if [ -n "${S3_BUCKET}" ] && [ -n "${AWS_ACCESS_KEY_ID}" ]; then
ENDPOINT_FLAG=""
[ -n "${S3_ENDPOINT}" ] && ENDPOINT_FLAG="--endpoint-url=${S3_ENDPOINT}"
echo "Cleaning up older images in dev/images/ to free bucket storage..."
aws ${ENDPOINT_FLAG} s3 rm "s3://${S3_BUCKET}/dev/images/" --recursive --exclude "*" --include "com-ermnvldmr-debian-12-k3s-*.qcow2" || true
aws ${ENDPOINT_FLAG} s3 cp "output-qemu/${IMAGE_NAME}" "s3://${S3_BUCKET}/dev/images/${IMAGE_NAME}"
echo "Golden image uploaded to s3://${S3_BUCKET}/dev/images/${IMAGE_NAME}"
else
echo "S3 storage secrets not provided; skipping remote S3 upload. Image artifact is preserved in GitHub Actions run artifacts."
fi
-51
View File
@@ -1,51 +0,0 @@
name: CodeQL
on:
push:
branches: [next]
paths-ignore:
- '**/kustomization.yaml'
pull_request:
branches: [next]
paths-ignore:
- '**/kustomization.yaml'
schedule:
- cron: '43 8 * * 3'
concurrency:
group: codeql-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
security-events: write
actions: read
jobs:
analyze:
name: Analyze (${{ matrix.language }})
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
security-events: write
actions: read
strategy:
fail-fast: false
matrix:
language: ['actions', 'javascript-typescript']
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
with:
category: "/language:${{ matrix.language }}"
@@ -1,361 +0,0 @@
name: packages/kits - next/required
on:
push:
branches: [next]
paths:
- 'packages/kits/**'
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/packages-kits-next-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-next-kits-${{ github.ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs & UI
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Build UI
run: pnpm --filter @ermnvldmr/ui build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 1
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 1
- name: Upload UI dist
uses: actions/upload-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
retention-days: 1
lint-kits:
name: Lint - Kits
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Lint Kits package
run: pnpm --filter @ermnvldmr/kits lint
typecheck-kits:
name: Typecheck - Kits
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Typecheck Kits package
run: pnpm --filter @ermnvldmr/kits typecheck
test-kits:
name: Test - Unit
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Test Kits package
run: pnpm --filter @ermnvldmr/kits test:coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/kits/coverage/lcov.info
flags: kits
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits Storybook
run: pnpm --filter @ermnvldmr/kits build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
retention-days: 1
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/kits exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
- name: Test Storybook
run: pnpm --filter @ermnvldmr/kits test:storybook:ci
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/kits/coverage/storybook/lcov.info
flags: kits-storybook
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-kits:
name: Build - Kits
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits package
run: pnpm --filter @ermnvldmr/kits build
@@ -1,361 +0,0 @@
name: packages/kits - pr/required
on:
pull_request:
branches: [next]
paths:
- 'packages/kits/**'
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/packages-kits-pr-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-pr-kits-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs & UI
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Build UI
run: pnpm --filter @ermnvldmr/ui build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 1
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 1
- name: Upload UI dist
uses: actions/upload-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
retention-days: 1
lint-kits:
name: Lint - Kits
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Lint Kits package
run: pnpm --filter @ermnvldmr/kits lint
typecheck-kits:
name: Typecheck - Kits
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Typecheck Kits package
run: pnpm --filter @ermnvldmr/kits typecheck
test-kits:
name: Test - Unit
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Test Kits package
run: pnpm --filter @ermnvldmr/kits test:coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/kits/coverage/lcov.info
flags: kits
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits Storybook
run: pnpm --filter @ermnvldmr/kits build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
retention-days: 1
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/kits exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: kits-storybook-static-${{ github.run_id }}
path: packages/kits/storybook-static/
- name: Test Storybook
run: pnpm --filter @ermnvldmr/kits test:storybook:ci
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/kits/coverage/storybook/lcov.info
flags: kits-storybook
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-kits:
name: Build - Kits
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download UI dist
uses: actions/download-artifact@v4
with:
name: ui-dist-${{ github.run_id }}
path: packages/ui/dist
- name: Build Kits package
run: pnpm --filter @ermnvldmr/kits build
@@ -1,145 +0,0 @@
name: packages/ssg - next/required
on:
push:
branches: [next]
paths:
- 'packages/ssg/**'
- '.github/workflows/packages-ssg-next-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-ssg-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 1
lint-ssg:
name: Lint - SSG
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Lint SSG package
run: pnpm --filter @ermnvldmr/ssg lint
typecheck-ssg:
name: Typecheck - SSG
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Typecheck SSG package
run: pnpm --filter @ermnvldmr/ssg typecheck
build-ssg:
name: Build - SSG
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Build SSG package
run: pnpm --filter @ermnvldmr/ssg build
@@ -1,145 +0,0 @@
name: packages/ssg - pr/required
on:
pull_request:
branches: [next]
paths:
- 'packages/ssg/**'
- '.github/workflows/packages-ssg-pr-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-pr-ssg-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 1
lint-ssg:
name: Lint - SSG
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Lint SSG package
run: pnpm --filter @ermnvldmr/ssg lint
typecheck-ssg:
name: Typecheck - SSG
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Typecheck SSG package
run: pnpm --filter @ermnvldmr/ssg typecheck
build-ssg:
name: Build - SSG
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Build SSG package
run: pnpm --filter @ermnvldmr/ssg build
@@ -1,176 +0,0 @@
name: packages/stl - next/required
on:
push:
branches: [next]
paths:
- 'packages/stl/**'
- '.github/workflows/packages-stl-next-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-stl-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 1
lint-stl:
name: Lint - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Lint STL package
run: pnpm --filter @ermnvldmr/stl lint
typecheck-stl:
name: Typecheck - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Typecheck STL package
run: pnpm --filter @ermnvldmr/stl typecheck
test-stl:
name: Test - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Test STL package
run: pnpm --filter @ermnvldmr/stl test:coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/stl/coverage/lcov.info
flags: stl
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-stl:
name: Build - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Build STL package
run: pnpm --filter @ermnvldmr/stl build
@@ -1,176 +0,0 @@
name: packages/stl - pr/required
on:
pull_request:
branches: [next]
paths:
- 'packages/stl/**'
- '.github/workflows/packages-stl-pr-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-pr-stl-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 1
lint-stl:
name: Lint - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Lint STL package
run: pnpm --filter @ermnvldmr/stl lint
typecheck-stl:
name: Typecheck - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Typecheck STL package
run: pnpm --filter @ermnvldmr/stl typecheck
test-stl:
name: Test - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Test STL package
run: pnpm --filter @ermnvldmr/stl test:coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/stl/coverage/lcov.info
flags: stl
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-stl:
name: Build - STL
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Build STL package
run: pnpm --filter @ermnvldmr/stl build
@@ -1,313 +0,0 @@
name: packages/ui - next/required
on:
push:
branches: [next]
paths:
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/packages-ui-next-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-ui-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
retention-days: 1
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
retention-days: 1
lint-ui:
name: Lint - UI
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Lint UI package
run: pnpm --filter @ermnvldmr/ui lint
typecheck-ui:
name: Typecheck - UI
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Typecheck UI package
run: pnpm --filter @ermnvldmr/ui typecheck
test-ui:
name: Test - Unit
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Test UI package
run: pnpm --filter @ermnvldmr/ui test:coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/ui/coverage/lcov.info
flags: ui
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Build UI Storybook
run: pnpm --filter @ermnvldmr/ui build-storybook
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/ui exec playwright install --with-deps chromium
- name: Build UI Storybook
run: pnpm --filter @ermnvldmr/ui build-storybook
- name: Test Storybook
run: pnpm --filter @ermnvldmr/ui test:storybook:ci
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/ui/coverage/storybook/lcov.info
flags: ui-storybook
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-ui:
name: Build - UI
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Build UI package
run: pnpm --filter @ermnvldmr/ui build
@@ -1,322 +0,0 @@
name: packages/ui - pr/required
on:
pull_request:
branches: [next]
paths:
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/packages-ui-pr-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-pr-ui-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 1
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 1
lint-ui:
name: Lint - UI
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Lint UI package
run: pnpm --filter @ermnvldmr/ui lint
typecheck-ui:
name: Typecheck - UI
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Typecheck UI package
run: pnpm --filter @ermnvldmr/ui typecheck
test-ui:
name: Test - Unit
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Test UI package
run: pnpm --filter @ermnvldmr/ui test:coverage
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/ui/coverage/lcov.info
flags: ui
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Build UI Storybook
run: pnpm --filter @ermnvldmr/ui build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: ui-storybook-static-${{ github.run_id }}
path: packages/ui/storybook-static/
retention-days: 1
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/ui exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: ui-storybook-static-${{ github.run_id }}
path: packages/ui/storybook-static/
- name: Test Storybook
run: pnpm --filter @ermnvldmr/ui test:storybook:ci
- name: Upload coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./packages/ui/coverage/storybook/lcov.info
flags: ui-storybook
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-ui:
name: Build - UI
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Build UI package
run: pnpm --filter @ermnvldmr/ui build
@@ -1,189 +0,0 @@
name: services/docs - next/required
on:
push:
branches: [next]
paths:
- 'services/docs/**'
- '.github/workflows/services-docs-next-required.yml'
- 'ci/docker/docs/**'
- 'ci/config/nginx/**'
- 'ci/scripts/**'
concurrency:
group: ci-docs-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-hugo:
name: Setup - Hugo
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
build-hugo:
name: Build - Hugo Site
needs: setup-hugo
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
- name: Build Hugo site
working-directory: services/docs
run: hugo --gc --minify
release-docker:
name: Release - Docker Image
needs: build-hugo
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract Docker metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ghcr.io/${{ github.repository }}/docs
tags: |
type=raw,value=latest
type=sha,format=short
- name: Compute short SHA
id: vars
run: echo "short_sha=sha-$(echo ${{ github.sha }} | cut -c1-7)" >> $GITHUB_OUTPUT
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ci/docker/docs/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: |
COMMIT_SHA=${{ steps.vars.outputs.short_sha }}
VERSION=${{ steps.vars.outputs.short_sha }}
deploy:
name: Deploy - Kubernetes (GitOps)
needs: release-docker
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: next
token: ${{ secrets.GITOPS_TOKEN || secrets.GITHUB_TOKEN }}
- name: Setup Kustomize
uses: imranismail/setup-kustomize@v2
with:
kustomize-version: "5.3.0"
- name: Deploy via GitOps
run: |
DOCS_TAG="sha-$(echo ${{ github.sha }} | cut -c1-7)"
bash ci/scripts/deploy-gitops.sh docs "${DOCS_TAG}"
verify-rollout:
name: Verify - Production Rollout
needs: deploy
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
steps:
- name: Await production rollout
run: |
TARGET_COMMIT="sha-$(echo ${{ github.sha }} | cut -c1-7)"
ENDPOINT="https://docs.ermnvldmr.com/version.json"
echo "========================================================"
echo "Verifying production deployment on $ENDPOINT"
echo "Expected commit: $TARGET_COMMIT"
echo "========================================================"
MAX_ATTEMPTS=45
ATTEMPT=1
CF_BLOCKED_COUNT=0
while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
echo "Attempt $ATTEMPT/$MAX_ATTEMPTS: Polling $ENDPOINT..."
RESP_FILE=$(mktemp)
HTTP_CODE=$(curl -sL --max-time 10 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" \
-H "Accept: application/json" \
-o "$RESP_FILE" \
-w "%{http_code}" \
"$ENDPOINT" || echo "000")
if [ "$HTTP_CODE" = "200" ]; then
LIVE_COMMIT=$(jq -r '.commit // empty' "$RESP_FILE" 2>/dev/null || true)
echo " Live commit: ${LIVE_COMMIT:-<none>}"
if [ "$LIVE_COMMIT" = "$TARGET_COMMIT" ]; then
echo "✅ Success! Production docs has successfully rolled out $TARGET_COMMIT."
rm -f "$RESP_FILE"
exit 0
fi
elif [ "$HTTP_CODE" = "403" ] || [ "$HTTP_CODE" = "503" ]; then
echo " HTTP $HTTP_CODE: Cloudflare WAF/challenge encountered from runner IP."
CF_BLOCKED_COUNT=$((CF_BLOCKED_COUNT + 1))
else
echo " HTTP $HTTP_CODE: Endpoint returned unexpected status code or timed out."
fi
rm -f "$RESP_FILE"
if [ $CF_BLOCKED_COUNT -ge 5 ]; then
echo "⚠️ Cloudflare WAF consistently blocked external probe requests from this runner IP (HTTP $HTTP_CODE)."
echo "The GitOps release commit was already pushed to the repository; FluxCD will reconcile the cluster."
echo "Skipping further external HTTP verification to avoid false negative."
exit 0
fi
ATTEMPT=$((ATTEMPT + 1))
sleep 10
done
echo "❌ Deployment verification timed out after 7.5 minutes."
exit 1
@@ -1,54 +0,0 @@
name: services/docs - pr/required
on:
pull_request:
branches: [next]
paths:
- 'services/docs/**'
- '.github/workflows/services-docs-pr-required.yml'
concurrency:
group: ci-pr-docs-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-hugo:
name: Setup - Hugo
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
build-hugo:
name: Build - Hugo Site
needs: setup-hugo
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive
fetch-depth: 0
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: 'latest'
extended: true
- name: Build Hugo site
working-directory: services/docs
run: hugo --gc --minify
@@ -1,205 +0,0 @@
name: services/static - next/required
on:
push:
branches: [next]
paths:
- 'services/static/**'
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/services-static-next-required.yml'
- 'ci/scripts/**'
- 'pnpm-lock.yaml'
concurrency:
group: ci-static-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
retention-days: 1
lint-static:
name: Lint - Static
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Lint static service
run: pnpm --filter @ermnvldmr/static lint
typecheck-static:
name: Typecheck - Static
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Typecheck static service
run: pnpm --filter @ermnvldmr/static typecheck
build-static:
name: Build - Static Site
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Build static service
run: pnpm --filter @ermnvldmr/static build
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: static-dist
path: services/static/dist/
retention-days: 1
deploy-s3:
name: Deploy - S3
needs: [lint-static, typecheck-static, build-static]
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/next'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
name: static-dist
path: services/static/dist/
- name: Deploy to S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.STATIC_AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.STATIC_AWS_SECRET_ACCESS_KEY }}
AWS_DEFAULT_REGION: ${{ secrets.STATIC_AWS_REGION }}
S3_BUCKET: ${{ secrets.STATIC_S3_BUCKET }}
AWS_REGION: ${{ secrets.STATIC_AWS_REGION }}
S3_ENDPOINT_URL: ${{ secrets.STATIC_S3_ENDPOINT_URL }}
run: |
chmod +x ci/scripts/deploy-static.sh
./ci/scripts/deploy-static.sh
@@ -1,178 +0,0 @@
name: services/static - pr/required
on:
pull_request:
branches: [next]
paths:
- 'services/static/**'
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/services-static-pr-required.yml'
- 'ci/scripts/**'
- 'pnpm-lock.yaml'
concurrency:
group: ci-pr-static-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build i18n
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload Config Artifacts
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 1
lint-static:
name: Lint - Static
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Lint static service
run: pnpm --filter @ermnvldmr/static lint
typecheck-static:
name: Typecheck - Static
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Typecheck static service
run: pnpm --filter @ermnvldmr/static typecheck
build-static:
name: Build - Static Site
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Config Artifacts
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Build static service
run: pnpm --filter @ermnvldmr/static build
- name: Upload build artifacts
uses: actions/upload-artifact@v4
with:
name: static-dist-${{ github.run_id }}
path: services/static/dist/
retention-days: 1
@@ -1,508 +0,0 @@
name: services/www - next/required
on:
push:
branches: [next]
paths:
- 'services/www/**'
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/services-www-next-required.yml'
- 'ci/docker/www/**'
- 'ci/config/nginx/**'
- 'ci/scripts/**'
- 'pnpm-lock.yaml'
workflow_dispatch:
concurrency:
group: ci-www-${{ github.ref_name }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
retention-days: 1
- name: Build i18n package
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
retention-days: 1
lint-www:
name: Lint - WWW
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Lint WWW service
run: pnpm --filter @ermnvldmr/www lint
typecheck-www:
name: Typecheck - WWW
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Typecheck WWW service
run: pnpm --filter @ermnvldmr/www typecheck
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Build WWW Storybook
run: pnpm --filter @ermnvldmr/www build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: storybook-static
path: services/www/storybook-static/
retention-days: 1
test-www:
name: Test - Unit
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Test WWW service
run: pnpm --filter @ermnvldmr/www test:coverage
- name: Upload Unit coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./services/www/coverage/lcov.info
flags: www
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/www exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: storybook-static
path: services/www/storybook-static/
- name: Serve Storybook and run tests with coverage
run: pnpm --filter @ermnvldmr/www test:storybook:ci
- name: Upload Storybook coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./services/www/coverage/storybook/lcov.info
flags: www-storybook
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-www:
name: Build - WWW Service
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist
path: packages/storybook-config/dist
- name: Build WWW service (all locales)
run: pnpm --filter @ermnvldmr/www build:all
env:
RSDOCTOR: 'true'
- name: Upload Rsdoctor report
uses: actions/upload-artifact@v4
with:
name: rsdoctor-report
path: services/www/rsdoctor/
retention-days: 30
build-docker:
name: Build - Docker Image
needs: [lint-www, typecheck-www, test-www, test-storybook, build-www]
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
outputs:
short_sha: ${{ steps.vars.outputs.short_sha }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Calculate Short SHA
id: vars
run: |
SHORT_SHA="sha-$(echo ${{ github.sha }} | cut -c1-7)"
echo "short_sha=$SHORT_SHA" >> $GITHUB_OUTPUT
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
file: ci/docker/www/Dockerfile
push: true
tags: ghcr.io/${{ github.repository }}/www:${{ steps.vars.outputs.short_sha }}
build-args: |
COMMIT_SHA=${{ steps.vars.outputs.short_sha }}
VERSION=${{ steps.vars.outputs.short_sha }}
release-tag-docker:
name: Release - Tag & Docker
needs: build-docker
runs-on: ubuntu-latest
environment: services-www-releases-publish
permissions:
contents: write
packages: write
outputs:
version: ${{ steps.calver.outputs.version }}
short_sha: ${{ needs.build-docker.outputs.short_sha }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Calculate CalVer Version
id: calver
run: |
VERSION=$(bash ci/scripts/calver-release.sh)
echo "version=$VERSION" >> $GITHUB_OUTPUT
- name: Create and Push Tag
run: |
TAG_NAME="${{ steps.calver.outputs.version }}"
git tag "$TAG_NAME"
git push origin "$TAG_NAME"
- name: Log in to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Tag and Push Release Docker Image
run: |
docker buildx imagetools create \
ghcr.io/${{ github.repository }}/www:${{ needs.build-docker.outputs.short_sha }} \
--tag ghcr.io/${{ github.repository }}/www:${{ steps.calver.outputs.version }}
deploy:
name: Deploy - Kubernetes (GitOps)
needs: release-tag-docker
runs-on: ubuntu-latest
environment:
name: services-www-releases-deploy
url: https://ermnvldmr.com
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
ref: next
token: ${{ secrets.GITOPS_TOKEN || secrets.GITHUB_TOKEN }}
- name: Setup Kustomize
uses: imranismail/setup-kustomize@v2
with:
kustomize-version: "5.3.0"
- name: Deploy via GitOps
run: |
WWW_TAG="${{ needs.release-tag-docker.outputs.short_sha }}"
bash ci/scripts/deploy-gitops.sh www "${WWW_TAG}"
verify-rollout:
name: Verify - Production Rollout
needs: [release-tag-docker, deploy]
runs-on: ubuntu-latest
steps:
- name: Await production rollout
run: |
TARGET_COMMIT="${{ needs.release-tag-docker.outputs.short_sha }}"
ENDPOINT="https://www.ermnvldmr.com/version.json"
echo "========================================================"
echo "Verifying production deployment on $ENDPOINT"
echo "Expected commit: $TARGET_COMMIT"
echo "========================================================"
MAX_ATTEMPTS=45
ATTEMPT=1
CF_BLOCKED_COUNT=0
while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
echo "Attempt $ATTEMPT/$MAX_ATTEMPTS: Polling $ENDPOINT..."
RESP_FILE=$(mktemp)
HTTP_CODE=$(curl -sL --max-time 10 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" \
-H "Accept: application/json" \
-o "$RESP_FILE" \
-w "%{http_code}" \
"$ENDPOINT" || echo "000")
if [ "$HTTP_CODE" = "200" ]; then
LIVE_COMMIT=$(jq -r '.commit // empty' "$RESP_FILE" 2>/dev/null || true)
echo " Live commit: ${LIVE_COMMIT:-<none>}"
if [ "$LIVE_COMMIT" = "$TARGET_COMMIT" ]; then
echo "✅ Success! Production has successfully rolled out $TARGET_COMMIT."
rm -f "$RESP_FILE"
exit 0
fi
elif [ "$HTTP_CODE" = "403" ] || [ "$HTTP_CODE" = "503" ]; then
echo " HTTP $HTTP_CODE: Cloudflare WAF/challenge encountered from runner IP."
CF_BLOCKED_COUNT=$((CF_BLOCKED_COUNT + 1))
else
echo " HTTP $HTTP_CODE: Endpoint returned unexpected status code or timed out."
fi
rm -f "$RESP_FILE"
if [ $CF_BLOCKED_COUNT -ge 5 ]; then
echo "⚠️ Cloudflare WAF consistently blocked external probe requests from this runner IP (HTTP $HTTP_CODE)."
echo "The GitOps release commit was already pushed to the repository; FluxCD will reconcile the cluster."
echo "Skipping further external HTTP verification to avoid false negative."
exit 0
fi
ATTEMPT=$((ATTEMPT + 1))
sleep 10
done
echo "❌ Deployment verification timed out after 7.5 minutes."
exit 1
@@ -1,331 +0,0 @@
name: services/www - pr/required
on:
pull_request:
branches: [next]
paths:
- 'services/www/**'
- 'packages/ui/**'
- 'packages/stl/**'
- 'packages/i18n/**'
- '.github/workflows/services-www-pr-required.yml'
- 'pnpm-lock.yaml'
concurrency:
group: ci-pr-www-${{ github.head_ref }}
cancel-in-progress: true
permissions:
contents: read
actions: read
jobs:
setup-stage:
name: Setup - Stage
runs-on: ubuntu-latest
outputs:
cache-hit: ${{ steps.cache-pnpm-store.outputs.cache-hit }}
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- name: Setup Node.js with pnpm cache
uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Cache pnpm store
id: cache-pnpm-store
uses: actions/cache@v3
with:
path: ~/.pnpm-store
key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
- name: Install dependencies
run: pnpm install --frozen-lockfile
build-configs:
name: Build - Configs
needs: setup-stage
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Build Rsbuild config
run: pnpm --filter @ermnvldmr/rsbuild-config build
- name: Build Storybook config
run: pnpm --filter @ermnvldmr/storybook-config build
- name: Upload Rsbuild Config
uses: actions/upload-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
retention-days: 1
- name: Upload Storybook Config
uses: actions/upload-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
retention-days: 1
- name: Build i18n package
run: pnpm --filter @ermnvldmr/i18n build
- name: Upload i18n dist
uses: actions/upload-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
retention-days: 1
lint-www:
name: Lint - WWW
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Lint WWW service
run: pnpm --filter @ermnvldmr/www lint
typecheck-www:
name: Typecheck - WWW
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Typecheck WWW service
run: pnpm --filter @ermnvldmr/www typecheck
build-storybook:
name: Build - Storybook
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Build WWW Storybook
run: pnpm --filter @ermnvldmr/www build-storybook
- name: Upload Storybook build
uses: actions/upload-artifact@v4
with:
name: www-storybook-static-${{ github.run_id }}
path: services/www/storybook-static/
retention-days: 1
test-www:
name: Test - Unit
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Test WWW service
run: pnpm --filter @ermnvldmr/www test:coverage
- name: Upload Unit coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./services/www/coverage/lcov.info
flags: www
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
test-storybook:
name: Test - Storybook
needs: build-storybook
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Install Playwright browsers
run: pnpm --filter @ermnvldmr/www exec playwright install --with-deps chromium
- name: Download Storybook build
uses: actions/download-artifact@v4
with:
name: www-storybook-static-${{ github.run_id }}
path: services/www/storybook-static/
- name: Serve Storybook and run tests with coverage
run: pnpm --filter @ermnvldmr/www test:storybook:ci
- name: Upload Storybook coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./services/www/coverage/storybook/lcov.info
flags: www-storybook
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
build-www:
name: Build - WWW Service
needs: build-configs
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install pnpm
uses: pnpm/action-setup@v4
with:
version: 9.12.3
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'pnpm'
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Download Rsbuild Config
uses: actions/download-artifact@v4
with:
name: rsbuild-config-dist-${{ github.run_id }}
path: packages/rsbuild-config/dist
- name: Download i18n dist
uses: actions/download-artifact@v4
with:
name: i18n-dist-${{ github.run_id }}
path: packages/i18n/dist
- name: Download Storybook Config
uses: actions/download-artifact@v4
with:
name: storybook-config-dist-${{ github.run_id }}
path: packages/storybook-config/dist
- name: Build WWW service (all locales)
run: pnpm --filter @ermnvldmr/www build:all
env:
RSDOCTOR: 'true'
- name: Upload Rsdoctor report
uses: actions/upload-artifact@v4
with:
name: rsdoctor-report-${{ github.run_id }}
path: services/www/rsdoctor/
retention-days: 7
+1 -2
View File
@@ -1,6 +1,5 @@
# [ermnvldmr.com](https://ermnvldmr.com)
[![codecov](https://codecov.io/gh/deytenit/ermnvldmr.com/graph/badge.svg)](https://app.codecov.io/github/deytenit/ermnvldmr.com)
The monorepo powering the front pages of my own
@@ -58,7 +57,7 @@ Want to contribute or understand the codebase.
- UI Library: `pnpm ui:dev`
- **Development Guide**: [AGENTS.md](./AGENTS.md)
- **Component Development**: `pnpm ui:storybook`
- **Testing**: `pnpm test` or `pnpm test:coverage` (View results on [Codecov](https://app.codecov.io/github/deytenit/ermnvldmr.com))
- **Testing**: `pnpm test` or `pnpm test:coverage`
- **Code Quality**: `pnpm lint` and `pnpm typecheck`
### Designer
+1 -1
View File
@@ -20,7 +20,7 @@ spec:
spec:
containers:
- name: docs
image: ghcr.io/deytenit/ermnvldmr.com/docs:sha-91f5245
image: git.ermnvldmr.com/deytenit/ermnvldmr.com/docs:sha-91f5245
imagePullPolicy: IfNotPresent
ports:
- name: http
+3 -2
View File
@@ -5,5 +5,6 @@ resources:
- deployment.yaml
- service.yaml
images:
- name: ghcr.io/deytenit/ermnvldmr.com/docs
newTag: sha-9200529
- name: git.ermnvldmr.com/deytenit/ermnvldmr.com/docs
newName: git.ermnvldmr.com/deytenit/ermnvldmr.com/docs
newTag: sha-4e0bb72
+1 -1
View File
@@ -20,7 +20,7 @@ spec:
spec:
containers:
- name: www
image: ghcr.io/deytenit/ermnvldmr.com/www:sha-6d33b71
image: git.ermnvldmr.com/deytenit/ermnvldmr.com/www:sha-6d33b71
imagePullPolicy: IfNotPresent
ports:
- name: http
+3 -2
View File
@@ -5,5 +5,6 @@ resources:
- deployment.yaml
- service.yaml
images:
- name: ghcr.io/deytenit/ermnvldmr.com/www
newTag: sha-9200529
- name: git.ermnvldmr.com/deytenit/ermnvldmr.com/www
newName: git.ermnvldmr.com/deytenit/ermnvldmr.com/www
newTag: sha-4e0bb72
@@ -5,7 +5,7 @@ metadata:
namespace: flux-system
spec:
interval: 1m
url: https://github.com/deytenit/ermnvldmr.com.git
url: https://git.ermnvldmr.com/deytenit/ermnvldmr.com.git
ref:
branch: next
---
File diff suppressed because it is too large. Load diff
@@ -1,5 +1,5 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- https://github.com/cert-manager/cert-manager/releases/download/v1.17.0/cert-manager.yaml
- install.yaml
- cluster-issuer.yaml
+1
View File
@@ -0,0 +1 @@
[git.ermnvldmr.com]:22222,[45.150.33.239]:22222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBXcvf3Lds3AKfGHGh00IWR9tSRbBBqrV/CC6JBGmcrD
+5 -3
View File
@@ -9,7 +9,8 @@ export INSTALL_K3S_SKIP_START="true"
export INSTALL_K3S_VERSION="v1.31.2+k3s1"
# Download official K3s installer and install binary/systemd unit without starting
curl -sfL https://get.k3s.io | sh -
install -m 0755 /tmp/scripts/k3s /usr/local/bin/k3s
INSTALL_K3S_SKIP_DOWNLOAD=true sh /tmp/scripts/k3s-install.sh
# Verify k3s binary is located in /usr/local/bin
which k3s
@@ -28,6 +29,7 @@ chmod 644 /etc/rancher/k3s/config.yaml
# Pre-stage default GitOps root sync manifest
mkdir -p /etc/flux
install -m 0644 /tmp/scripts/flux-install.yaml /etc/flux/install.yaml
cat << 'EOF' > /etc/flux/cluster-sync.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: GitRepository
@@ -36,7 +38,7 @@ metadata:
namespace: flux-system
spec:
interval: 1m
url: https://github.com/deytenit/ermnvldmr.com.git
url: https://git.ermnvldmr.com/deytenit/ermnvldmr.com.git
ref:
branch: next
---
@@ -119,7 +121,7 @@ else
fi
echo "=== [Bootstrap] Installing Flux Operator / Custom Resources ==="
kubectl apply -k "https://github.com/fluxcd/flux2/manifests/install?ref=v2.4.0" || true
kubectl apply -f /etc/flux/install.yaml
echo "=== [Bootstrap] Applying initial GitOps root sync ==="
if [ -f /etc/flux/cluster-sync.yaml ]; then
+64
View File
@@ -0,0 +1,64 @@
#!/bin/bash
set -euo pipefail
SERVICE="${1:-}"
TARGET_COMMIT="${2:-}"
ENDPOINT="${3:-https://${SERVICE}.ermnvldmr.com/version.json}"
if [ -z "$SERVICE" ] || [ -z "$TARGET_COMMIT" ]; then
echo "Usage: $0 <service: www|docs> <target_commit> [endpoint_url]" >&2
exit 1
fi
echo "========================================================"
echo "Verifying production deployment on $ENDPOINT"
echo "Expected commit: $TARGET_COMMIT"
echo "========================================================"
MAX_ATTEMPTS=45
ATTEMPT=1
CF_BLOCKED_COUNT=0
while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
echo "Attempt $ATTEMPT/$MAX_ATTEMPTS: Polling $ENDPOINT..."
RESP_FILE=$(mktemp)
HTTP_CODE=$(curl -sL --max-time 10 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" \
-H "Accept: application/json" \
-o "$RESP_FILE" \
-w "%{http_code}" \
"$ENDPOINT" || echo "000")
if [ "$HTTP_CODE" = "200" ]; then
LIVE_COMMIT=$(jq -r '.commit // empty' "$RESP_FILE" 2>/dev/null || true)
LIVE_VERSION=$(jq -r '.version // empty' "$RESP_FILE" 2>/dev/null || true)
echo " Live commit: ${LIVE_COMMIT:-<none>}, Live version: ${LIVE_VERSION:-<none>}"
if [ "$LIVE_COMMIT" = "$TARGET_COMMIT" ] || [ "$LIVE_VERSION" = "$TARGET_COMMIT" ]; then
echo "✅ Success! Production $SERVICE has successfully rolled out $TARGET_COMMIT."
rm -f "$RESP_FILE"
exit 0
fi
elif [ "$HTTP_CODE" = "403" ] || [ "$HTTP_CODE" = "503" ]; then
echo " HTTP $HTTP_CODE: Cloudflare WAF/challenge encountered from runner IP."
CF_BLOCKED_COUNT=$((CF_BLOCKED_COUNT + 1))
else
echo " HTTP $HTTP_CODE: Endpoint returned unexpected status code or timed out."
fi
rm -f "$RESP_FILE"
if [ $CF_BLOCKED_COUNT -ge 5 ]; then
echo "⚠️ Cloudflare WAF consistently blocked external probe requests from this runner IP (HTTP $HTTP_CODE)."
echo "The GitOps release commit was already pushed to the repository; FluxCD will reconcile the cluster."
echo "Skipping further external HTTP verification to avoid false negative."
exit 0
fi
ATTEMPT=$((ATTEMPT + 1))
sleep 10
done
echo "❌ Deployment verification timed out after 7.5 minutes."
exit 1
+54
View File
@@ -0,0 +1,54 @@
#!/usr/bin/env bash
set -euo pipefail
mkdir -p output-qemu
echo "Downloading official Debian 12 cloud image..."
curl -fsSL -o base.qcow2 https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
echo "Expanding disk image to 10G..."
qemu-img resize base.qcow2 10G
echo "Connecting disk image via NBD..."
sudo modprobe nbd max_part=8
sudo qemu-nbd --connect=/dev/nbd0 base.qcow2
sleep 1
sudo partx -u /dev/nbd0 || true
echo "Mounting disk filesystem..."
sudo mkdir -p /mnt/target
sudo mount /dev/nbd0p1 /mnt/target
echo "Mounting host virtual filesystems and configuring DNS..."
sudo rm -f /mnt/target/etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /mnt/target/etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee -a /mnt/target/etc/resolv.conf
sudo mount --bind /dev /mnt/target/dev
sudo mount --bind /dev/pts /mnt/target/dev/pts
sudo mount --bind /proc /mnt/target/proc
sudo mount --bind /sys /mnt/target/sys
echo "Copying provisioner scripts..."
sudo mkdir -p /mnt/target/tmp/scripts
sudo cp ci/packer/scripts/*.sh /mnt/target/tmp/scripts/
sudo cp /opt/ci/assets/k3s /opt/ci/assets/k3s-install.sh /mnt/target/tmp/scripts/
sudo cp /opt/ci/assets/flux-install-local.yaml /mnt/target/tmp/scripts/flux-install.yaml
sudo chmod +x /mnt/target/tmp/scripts/*.sh
echo "Running provisioner scripts in chroot..."
sudo chroot /mnt/target /bin/bash /tmp/scripts/01-base-system.sh
sudo chroot /mnt/target /bin/bash /tmp/scripts/02-install-k3s.sh
sudo chroot /mnt/target /bin/bash /tmp/scripts/03-cleanup.sh
sudo rm -rf /mnt/target/tmp/scripts
echo "Unmounting filesystems..."
sudo umount /mnt/target/sys
sudo umount /mnt/target/proc
sudo umount /mnt/target/dev/pts
sudo umount /mnt/target/dev
sudo umount /mnt/target
sudo qemu-nbd --disconnect /dev/nbd0
echo "Compressing and optimizing qcow2 with 2M cluster size..."
qemu-img convert -f qcow2 -O qcow2 -o cluster_size=2M -c base.qcow2 output-qemu/com-ermnvldmr-debian-12-k3s-amd64.qcow2
echo "Golden image built successfully."
+87
View File
@@ -0,0 +1,87 @@
import hashlib
import json
import os
import platform
import subprocess
import sys
import tarfile
import tempfile
import urllib.error
import urllib.parse
import urllib.request
import zipfile
from pathlib import Path
SERVER='https://git.ermnvldmr.com'
def eligible(run, repository, current_run):
if run.get('repository',{}).get('full_name')!=repository:
return False
if str(run.get('id'))==current_run:
return True
return run.get('head_branch')=='next' and run.get('event') in ('push','workflow_dispatch') and run.get('status')=='completed' and run.get('conclusion')=='success'
def request(url):
if not url.startswith(SERVER+'/'):
raise ValueError('Unexpected cache artifact host')
class LocalRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
if not newurl.startswith(SERVER+'/'):
raise ValueError('Unexpected cache storage host')
return super().redirect_request(req,fp,code,msg,headers,newurl)
req=urllib.request.Request(url,headers={'Authorization':'token '+os.environ['CACHE_TOKEN']})
return urllib.request.build_opener(LocalRedirect).open(req,timeout=60)
def api(path):
with request(SERVER+'/api/v1/repos/'+os.environ['GITHUB_REPOSITORY']+path) as response:
return json.load(response)
def main():
store=Path(subprocess.check_output(['pnpm','store','path','--silent'],text=True).strip())
archive=Path('.ci/pnpm-store.tar')
if sys.argv[1]=='pack':
archive.parent.mkdir(exist_ok=True)
store.mkdir(parents=True,exist_ok=True)
with tarfile.open(archive,'w') as target:target.add(store,arcname='.')
return
versions=subprocess.check_output(['node','--version'],text=True).strip()+'-'+subprocess.check_output(['pnpm','--version'],text=True).strip()
key='pnpm-'+platform.system().lower()+'-'+platform.machine()+'-'+versions+'-'+hashlib.sha256(Path('pnpm-lock.yaml').read_bytes()).hexdigest()
with open(os.environ['GITHUB_OUTPUT'],'a') as output:output.write('key='+key+'\n')
try:
artifacts=api('/actions/artifacts?name='+urllib.parse.quote(key))['artifacts']
artifacts.sort(key=lambda a:a['id'],reverse=True)
for artifact in artifacts:
if artifact.get('expired',True) or artifact.get('name')!=key:
continue
run_id=artifact.get('workflow_run',{}).get('id')
if not run_id:
continue
run=api('/actions/runs/'+str(run_id))
if not eligible(run,os.environ['GITHUB_REPOSITORY'],os.environ['GITHUB_RUN_ID']):
continue
with tempfile.TemporaryDirectory(prefix='pnpm-artifact-cache-') as directory:
downloaded=Path(directory)/'cache.zip'
with request(SERVER+'/api/v1/repos/'+os.environ['GITHUB_REPOSITORY']+'/actions/artifacts/'+str(artifact['id'])+'/zip') as response,downloaded.open('wb') as target:
while chunk:=response.read(1048576):target.write(chunk)
with zipfile.ZipFile(downloaded) as zipped:
members=[name for name in zipped.namelist() if name.rsplit('/',1)[-1]=='pnpm-store.tar']
if len(members)!=1:
raise ValueError('Invalid cache archive')
packed=Path(directory)/'store.tar'
with zipped.open(members[0]) as source,packed.open('wb') as target:
while chunk:=source.read(1048576):target.write(chunk)
store.mkdir(parents=True,exist_ok=True)
with tarfile.open(packed) as tar:tar.extractall(store,filter='data')
print('Restored repository-scoped pnpm cache artifact')
return
except (urllib.error.HTTPError,urllib.error.URLError,ValueError,tarfile.TarError,zipfile.BadZipFile):
print('Cache unavailable; dependencies will be fetched normally')
return
print('No eligible cache artifact; dependencies will be fetched normally')
if __name__=='__main__':main()
+69 -11
View File
@@ -1,21 +1,79 @@
#!/bin/bash
set -euo pipefail
MODE="version"
SERVICE=""
COMMIT="HEAD"
EXPLICIT_VERSION=""
if [ $# -ge 2 ] && [ "$1" = "tag" ]; then
MODE="tag"
SERVICE="$2"
COMMIT="${3:-HEAD}"
EXPLICIT_VERSION="${4:-}"
elif [ $# -ge 1 ]; then
SERVICE="$1"
fi
YEAR_MONTH=$(date -u +'%Y.%m')
git fetch --tags --quiet 2>/dev/null || true
# Find highest MICRO version for current YYYY.MM (matching tags formatted like YYYY.MM.MICRO)
LATEST_TAG=$(git tag -l "${YEAR_MONTH}.*" | sort -V | tail -n1 || echo "")
if [ -z "$LATEST_TAG" ]; then
MICRO=0
else
LATEST_MICRO="${LATEST_TAG#"${YEAR_MONTH}."}"
if [[ "$LATEST_MICRO" =~ ^[0-9]+$ ]]; then
MICRO=$((LATEST_MICRO + 1))
if [ -n "$SERVICE" ]; then
PREFIX="services/${SERVICE}-"
if [ -n "$EXPLICIT_VERSION" ]; then
VERSION="$EXPLICIT_VERSION"
else
MICRO=0
PATTERN="${PREFIX}${YEAR_MONTH}.*"
LATEST_TAG=$(git tag -l "$PATTERN" | sort -V | tail -n1 || echo "")
if [ -z "$LATEST_TAG" ]; then
MICRO=1
else
LATEST_MICRO="${LATEST_TAG#"${PREFIX}${YEAR_MONTH}."}"
if [[ "$LATEST_MICRO" =~ ^[0-9]+$ ]]; then
MICRO=$((LATEST_MICRO + 1))
else
MICRO=1
fi
fi
VERSION="${YEAR_MONTH}.${MICRO}"
fi
TAG_NAME="${PREFIX}${VERSION}"
else
if [ -n "$EXPLICIT_VERSION" ]; then
VERSION="$EXPLICIT_VERSION"
else
PATTERN="${YEAR_MONTH}.*"
LATEST_TAG=$(git tag -l "$PATTERN" | sort -V | tail -n1 || echo "")
if [ -z "$LATEST_TAG" ]; then
MICRO=0
else
LATEST_MICRO="${LATEST_TAG#"${YEAR_MONTH}."}"
if [[ "$LATEST_MICRO" =~ ^[0-9]+$ ]]; then
MICRO=$((LATEST_MICRO + 1))
else
MICRO=0
fi
fi
VERSION="${YEAR_MONTH}.${MICRO}"
fi
TAG_NAME="$VERSION"
fi
echo "${YEAR_MONTH}.${MICRO}"
if [ "$MODE" = "tag" ]; then
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
if git rev-parse -q --verify "refs/tags/$TAG_NAME" >/dev/null; then
EXISTING_COMMIT=$(git rev-parse "refs/tags/$TAG_NAME")
if [ "$EXISTING_COMMIT" = "$(git rev-parse "$COMMIT")" ]; then
echo "Tag $TAG_NAME already points to $COMMIT"
else
echo "Tag $TAG_NAME exists but points to $EXISTING_COMMIT, skipping create"
fi
else
echo "Creating tag $TAG_NAME on $COMMIT..."
git tag "$TAG_NAME" "$COMMIT"
fi
echo "Pushing tag $TAG_NAME..."
python3 "$ROOT_DIR/ci/scripts/git_write.py" "refs/tags/$TAG_NAME"
echo "Successfully created and pushed tag $TAG_NAME"
fi
echo "$VERSION"
+13 -5
View File
@@ -19,17 +19,25 @@ fi
echo "Updating Kustomize image tag for '$SERVICE' to '$TAG'..."
cd "$APP_DIR"
kustomize edit set image "ghcr.io/deytenit/ermnvldmr.com/${SERVICE}:${TAG}"
IMAGE="git.ermnvldmr.com/deytenit/ermnvldmr.com/${SERVICE}"
if [[ "$TAG" =~ ^sha256:[0-9a-f]{64}$ ]]; then
kustomize edit set image "${IMAGE}=${IMAGE}@${TAG}"
elif [[ "$TAG" =~ ^[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}$ ]]; then
kustomize edit set image "${IMAGE}=${IMAGE}:${TAG}"
else
echo "Invalid image digest or tag" >&2
exit 1
fi
cd "$ROOT_DIR"
git config user.name "adam-at-deytenit"
git config user.email "221188529+adam-at-deytenit@users.noreply.github.com"
git config user.name "APEX CI"
git config user.email "adam@ermnvldmr.com"
git add "ci/k8s/apps/${SERVICE}/kustomization.yaml"
if git diff --staged --quiet; then
echo "No manifest changes to commit for $SERVICE."
else
git commit -m "chore(release): deploy ${SERVICE} ${TAG} [skip ci]"
git push origin next
git commit --no-gpg-sign -m "chore(release): deploy ${SERVICE} ${TAG} [skip ci]"
python3 "$ROOT_DIR/ci/scripts/git_write.py" HEAD:next
echo "Successfully deployed $SERVICE ($TAG) via GitOps."
fi
+17 -7
View File
@@ -31,11 +31,21 @@ fi
export AWS_DEFAULT_REGION="$AWS_REGION"
ENDPOINT_URL="${S3_ENDPOINT_URL%/}"
# Upload all static files
echo "Uploading static files..."
aws s3 cp "$DIST_DIR/" "s3://$S3_BUCKET/" \
--recursive \
--endpoint-url="$ENDPOINT_URL" \
--cache-control "max-age=300"
# Set S3 max_concurrent_requests to 1 to prevent race conditions on S3-compatible endpoints
aws configure set default.s3.max_concurrent_requests 1
echo "Static files deployed successfully!"
# Upload all static files with retry
echo "Uploading static files..."
for attempt in 1 2 3; do
echo "Attempt $attempt/3: syncing static files..."
if aws s3 sync "$DIST_DIR/" "s3://$S3_BUCKET/" \
--endpoint-url="$ENDPOINT_URL" \
--cache-control "max-age=300"; then
echo "Static files deployed successfully!"
exit 0
fi
sleep 2
done
echo "Error: Failed to upload static files after 3 attempts."
exit 1
+64
View File
@@ -0,0 +1,64 @@
import json
import os
import re
import subprocess
import sys
from pathlib import Path
def lines(value):
return [line.strip() for line in value.splitlines() if line.strip()]
def output(name, value):
with open(os.environ['GITHUB_OUTPUT'], 'a') as stream:
stream.write(f'{name}<<GITEA_VALUE\n{value}\nGITEA_VALUE\n')
def metadata(images, rules, sha):
result = []
for rule in lines(rules):
fields = dict(part.split('=', 1) for part in rule.split(',') if '=' in part)
if fields.get('enable', 'true').lower() == 'false':
continue
kind = fields.get('type')
if kind == 'sha':
tag = 'sha-' + sha[:7]
elif kind == 'raw':
tag = fields['value']
else:
raise ValueError('Unsupported metadata rule')
if not re.fullmatch(r'[A-Za-z0-9_][A-Za-z0-9_.-]{0,127}', tag):
raise ValueError('Invalid image tag')
result.extend(image.lower() + ':' + tag for image in lines(images))
return result
def main():
mode = sys.argv[1]
if mode == 'login':
subprocess.run(['docker', 'login', os.environ['REGISTRY'], '--username', os.environ['REGISTRY_USER'], '--password-stdin'], input=os.environ['REGISTRY_TOKEN'], text=True, check=True)
elif mode == 'metadata':
output('tags', '\n'.join(metadata(os.environ['IMAGES'], os.environ['TAG_RULES'], os.environ['SOURCE_SHA'])))
output('labels', 'org.opencontainers.image.revision=' + os.environ['SOURCE_SHA'])
elif mode == 'build':
command = ['docker', 'buildx', 'build', '--metadata-file', '/tmp/image-metadata.json']
for env, flag in [('TAGS', '--tag'), ('LABELS', '--label'), ('BUILD_ARGS', '--build-arg')]:
for value in lines(os.environ.get(env, '')):
command.extend([flag, value])
command += ['--label', 'org.opencontainers.image.revision=' + os.environ['SOURCE_SHA'], '--label', 'com.ermnvldmr.ci.run=' + os.environ['RUN_ID']]
if os.environ.get('PLATFORMS'):
command += ['--platform', os.environ['PLATFORMS']]
if os.environ.get('DOCKERFILE'):
command += ['--file', os.environ['DOCKERFILE']]
if os.environ.get('PUSH', 'false').lower() == 'true':
command.append('--push')
command.append(os.environ.get('CONTEXT', '.'))
subprocess.run(command, check=True)
output('digest', json.loads(Path('/tmp/image-metadata.json').read_text())['containerimage.digest'])
else:
raise ValueError('Unknown docker operation')
if __name__ == '__main__':
main()
+46
View File
@@ -0,0 +1,46 @@
import os
import re
import shlex
import subprocess
import sys
import tempfile
from pathlib import Path
def main():
ref=sys.argv[1]
if ref not in ('HEAD:next','trunk') and not re.fullmatch(r'refs/tags/[A-Za-z0-9][A-Za-z0-9._-]*(/[A-Za-z0-9][A-Za-z0-9._-]*)*',ref):
raise ValueError('Unexpected publication ref')
repository=os.environ['GITHUB_REPOSITORY']
if not re.fullmatch(r'deytenit/[A-Za-z0-9_.-]+',repository):
raise ValueError('Unexpected repository owner')
with tempfile.TemporaryDirectory(prefix='gitea-write-key-') as directory:
key = Path(directory) / 'key'
key.write_text(os.environ['GIT_WRITE_KEY'])
key.chmod(0o600)
repo_root = Path(__file__).resolve().parents[2]
candidates = [
repo_root / '.gitea' / 'known_hosts',
repo_root / 'ci' / 'known_hosts',
Path(__file__).resolve().parent.parent / '.gitea' / 'known_hosts',
Path(__file__).resolve().parent.parent / 'known_hosts',
]
known = next((c for c in candidates if c.exists()), None)
if not known:
raise FileNotFoundError(f'Could not find known_hosts in {[str(c) for c in candidates]}')
env = dict(os.environ)
env.pop('GIT_WRITE_KEY', None)
env['GIT_SSH_COMMAND'] = shlex.join([
'ssh', '-T', '-i', str(key),
'-o', 'BatchMode=yes',
'-o', 'ConnectTimeout=15',
'-o', 'HostName=45.150.33.239',
'-o', 'IdentitiesOnly=yes',
'-o', 'StrictHostKeyChecking=yes',
'-o', 'HostKeyAlgorithms=ssh-ed25519',
'-o', f'UserKnownHostsFile={known}',
])
subprocess.run(['git', 'push', f'ssh://git@git.ermnvldmr.com:22222/{repository}.git', ref], env=env, check=True)
if __name__=='__main__':main()
+161
View File
@@ -0,0 +1,161 @@
import json
import base64
import io
import zipfile
import os
import re
import subprocess
import urllib.request
SERVER = 'https://git.ermnvldmr.com'
REPO = 'deytenit/ermnvldmr.com'
IMAGE = SERVER.removeprefix('https://') + '/' + REPO + '/www'
def validate_input(sha, digest, run_id):
if not re.fullmatch(r'[0-9a-f]{40}', sha):
raise ValueError(f'Full source SHA required: {sha}')
if not re.fullmatch(r'sha256:[0-9a-f]{64}', digest):
raise ValueError(f'OCI sha256 digest required: {digest}')
if not re.fullmatch(r'[1-9][0-9]*', str(run_id)):
raise ValueError(f'Numeric build run ID required: {run_id}')
def validate_run(run, sha):
expected = {'head_sha': sha, 'head_branch': 'next', 'status': 'completed', 'conclusion': 'success'}
if any(run.get(key) != value for key, value in expected.items()):
raise ValueError('Build did not succeed for this next commit')
if run.get('repository', {}).get('full_name') != REPO or (run.get('head_repository') and run['head_repository'].get('full_name') != REPO):
raise ValueError('Build source repository mismatch')
if run.get('path') != 'services-www-next-required.yml@refs/heads/next':
raise ValueError('Wrong build workflow')
if run.get('event') not in ('push', 'workflow_dispatch'):
raise ValueError('Untrusted build event')
def api(path):
req = urllib.request.Request(SERVER + '/api/v1/repos/' + REPO + path, headers={'Authorization': 'token ' + os.environ['PROVENANCE_TOKEN']})
with urllib.request.urlopen(req, timeout=30) as response:
return json.load(response)
def validate_labels(labels, sha, run_id):
if labels.get('org.opencontainers.image.revision') != sha or labels.get('com.ermnvldmr.ci.run') != str(run_id):
raise ValueError('Immutable image provenance mismatch')
def validate_manifest(manifest, sha, digest, run_id):
expected = {'sha': sha, 'digest': digest, 'run_id': str(run_id), 'repository': REPO}
if any(str(manifest.get(k)) != str(v) for k, v in expected.items()):
raise ValueError(f'Build artifact does not attest requested image digest: got {manifest}, expected {expected}')
def artifact_manifest(run_id, name='www-provenance', filename='www-provenance.json'):
artifacts = api('/actions/runs/' + str(run_id) + '/artifacts')['artifacts']
matching = [a for a in artifacts if a.get('name') == name and not a.get('expired', True)]
if len(matching) != 1:
raise ValueError(f'Exactly one unexpired build provenance artifact required for {name} on run {run_id}, found {len(matching)}')
class SameHostRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
if not newurl.startswith(SERVER + '/'):
raise ValueError('Unexpected artifact storage host')
return super().redirect_request(req, fp, code, msg, headers, newurl)
request = urllib.request.Request(SERVER + '/api/v1/repos/' + REPO + '/actions/artifacts/' + str(matching[0]['id']) + '/zip', headers={'Authorization': 'token ' + os.environ['PROVENANCE_TOKEN']})
with urllib.request.build_opener(SameHostRedirect).open(request, timeout=30) as response:
payload = response.read(1024 * 1024 + 1)
if len(payload) > 1024 * 1024:
raise ValueError('Unexpected provenance artifact size')
with zipfile.ZipFile(io.BytesIO(payload)) as archive:
members = [name for name in archive.namelist() if name.rsplit('/', 1)[-1] == filename]
if len(members) != 1:
raise ValueError('Missing or ambiguous provenance manifest')
if archive.getinfo(members[0]).file_size > 65536:
raise ValueError('Unexpected provenance document size')
return json.loads(archive.read(members[0]))
def main():
sha = os.environ.get('TESTED_SHA', '').strip()
digest = os.environ.get('TESTED_DIGEST', '').strip()
run_id = os.environ.get('BUILD_RUN_ID', '').strip()
release_id = os.environ.get('RELEASE_RUN_ID', '').strip()
release_tag = os.environ.get('RELEASE_TAG', '').strip()
is_deploy = os.environ.get('IS_DEPLOY', 'false').lower() == 'true' or bool(release_id or release_tag)
current = api('/actions/runs/' + os.environ['GITHUB_RUN_ID'])
if current.get('event') != 'workflow_dispatch' or current.get('head_branch') != 'next':
raise ValueError('Approval must be manually dispatched on protected next')
actor = current.get('trigger_actor') or current.get('actor') or {}
if actor.get('login') != 'deytenit':
raise ValueError('Only the repository owner may approve promotion')
if not api('/branches/next').get('protected'):
raise ValueError('The next branch must be protected before promotion')
if is_deploy:
if not release_id:
runs_data = api('/actions/workflows/services-www-release-manual.yml/runs?branch=next&limit=10')
candidates = [
r for r in runs_data.get('workflow_runs', [])
if r.get('status') == 'completed' and r.get('conclusion') == 'success'
]
if not candidates:
raise ValueError('No successful completed run found for services-www-release-manual.yml on next')
release_id = str(candidates[0]['id'])
release = api('/actions/runs/' + release_id)
release_actor = release.get('trigger_actor') or release.get('actor') or {}
if release.get('conclusion') != 'success' or release.get('status') != 'completed' or release.get('event') != 'workflow_dispatch' or release.get('head_branch') != 'next' or release.get('path') != 'services-www-release-manual.yml@refs/heads/next' or release_actor.get('login') != 'deytenit':
raise ValueError('Successful independently approved release required')
rel_manifest = artifact_manifest(release_id, 'www-release-provenance', 'www-release.json')
if not release_tag:
release_tag = rel_manifest['release_tag']
if not sha:
sha = rel_manifest['sha']
if not digest:
digest = rel_manifest['digest']
if not run_id:
run_id = str(rel_manifest['run_id'])
expected_rel = {'sha': sha, 'digest': digest, 'run_id': str(run_id), 'repository': REPO, 'release_tag': release_tag}
if any(str(rel_manifest.get(k)) != str(v) for k, v in expected_rel.items()):
raise ValueError(f'Release approval does not match requested artifact: got {rel_manifest}, expected {expected_rel}')
else:
if not sha or not digest or not run_id:
runs_data = api('/actions/workflows/services-www-next-required.yml/runs?branch=next&limit=10')
candidates = [
r for r in runs_data.get('workflow_runs', [])
if r.get('status') == 'completed' and r.get('conclusion') == 'success'
]
if not candidates:
raise ValueError('No successful completed run found for services-www-next-required.yml on next')
build_run = candidates[0]
run_id = str(build_run['id'])
sha = build_run['head_sha']
build_manifest = artifact_manifest(run_id, 'www-provenance', 'www-provenance.json')
digest = build_manifest['digest']
validate_input(sha, digest, run_id)
validate_run(api('/actions/runs/' + run_id), sha)
validate_manifest(artifact_manifest(run_id), sha, digest, run_id)
auth = base64.b64encode(('deytenit:' + os.environ['PROVENANCE_TOKEN']).encode()).decode()
subprocess.run(['git', '-c', 'http.https://git.ermnvldmr.com/.extraheader=AUTHORIZATION: basic ' + auth, 'fetch', 'origin', 'next'], check=True)
subprocess.run(['git', 'merge-base', '--is-ancestor', sha, 'origin/next'], check=True)
subprocess.run(['docker', 'pull', IMAGE + '@' + digest], check=True)
data = json.loads(subprocess.check_output(['docker', 'image', 'inspect', IMAGE + '@' + digest], text=True))
validate_labels(data[0]['Config'].get('Labels') or {}, sha, run_id)
with open(os.environ['GITHUB_OUTPUT'], 'a') as stream:
stream.write(f'short_sha=sha-{sha[:7]}\n')
stream.write(f'tested_sha={sha}\n')
stream.write(f'tested_digest={digest}\n')
stream.write(f'build_run_id={run_id}\n')
if release_tag:
stream.write(f'release_tag={release_tag}\n')
if release_id:
stream.write(f'release_run_id={release_id}\n')
if __name__ == '__main__':
main()
+35
View File
@@ -0,0 +1,35 @@
#!/bin/bash
set -euo pipefail
PNPM_VERSION="${1:-9.12.3}"
NODE_VERSION="${2:-20}"
# Configure pnpm
case "$PNPM_VERSION" in
8|9|9.12.3) ;;
*) echo "Unsupported pnpm version: $PNPM_VERSION" >&2; exit 1 ;;
esac
PNPM_BIN="/opt/ci/pnpm/$PNPM_VERSION/bin"
if [ -d "$PNPM_BIN" ]; then
if [ -n "${GITHUB_PATH:-}" ]; then
echo "$PNPM_BIN" >> "$GITHUB_PATH"
fi
export PATH="$PNPM_BIN:$PATH"
fi
# Configure Node.js
case "$NODE_VERSION" in
18*) major=18 ;;
20*) major=20 ;;
22*) major=22 ;;
*) echo "Unsupported node version: $NODE_VERSION" >&2; exit 1 ;;
esac
NODE_BIN="/opt/ci/node/$major/bin"
if [ -d "$NODE_BIN" ]; then
if [ -n "${GITHUB_PATH:-}" ]; then
echo "$NODE_BIN" >> "$GITHUB_PATH"
fi
export PATH="$NODE_BIN:$PATH"
fi
+16
View File
@@ -0,0 +1,16 @@
#!/usr/bin/env bash
set -euo pipefail
IMAGE_NAME="${1:-com-ermnvldmr-debian-12-k3s-amd64.qcow2}"
mv output-qemu/com-ermnvldmr-debian-12-k3s-amd64.qcow2 "output-qemu/${IMAGE_NAME}"
if [ -n "${S3_BUCKET:-}" ] && [ -n "${AWS_ACCESS_KEY_ID:-}" ]; then
ENDPOINT_FLAG=""
[ -n "${S3_ENDPOINT:-}" ] && ENDPOINT_FLAG="--endpoint-url=${S3_ENDPOINT}"
echo "Cleaning up older images in dev/images/ to free bucket storage..."
aws ${ENDPOINT_FLAG} s3 rm "s3://${S3_BUCKET}/dev/images/" --recursive --exclude "*" --include "com-ermnvldmr-debian-12-k3s-*.qcow2" || true
aws ${ENDPOINT_FLAG} s3 cp "output-qemu/${IMAGE_NAME}" "s3://${S3_BUCKET}/dev/images/${IMAGE_NAME}"
echo "Golden image uploaded to s3://${S3_BUCKET}/dev/images/${IMAGE_NAME}"
else
echo "S3 storage secrets not provided; skipping remote S3 upload. Image artifact is preserved in workflow run artifacts."
fi
-53
View File
@@ -1,53 +0,0 @@
codecov:
notify:
wait_for_ci: true
ignore:
- 'packages/eslint-config'
- 'packages/rsbuild-config'
- 'packages/storybook-config'
coverage:
status:
project:
default:
target: 80%
threshold: 1%
range: 10%
stl:
target: 80%
flags:
- stl
ui:
target: 80%
flags:
- ui
ui-storybook:
target: 80%
flags:
- ui-storybook
www:
target: 80%
flags:
- www
www-storybook:
target: 80%
flags:
- www-storybook
flags:
stl:
paths:
- packages/stl
ui:
paths:
- packages/ui
ui-storybook:
paths:
- packages/ui
www:
paths:
- services/www
www-storybook:
paths:
- services/www