ci: group cloud, desktop, mobile in one release workflow (#12802)
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced new workflows for preparing releases, cloud deployment, and coordinated multi-platform releases with manual approval for stable Docker images. - Added a reusable action to output app version, Git hash, and build type for consistent release metadata. - **Refactor** - Simplified and unified input handling across workflows, requiring explicit version and build metadata inputs. - Updated release workflows (desktop, mobile, cloud) to use direct inputs instead of deriving values internally. - **Chores** - Removed several legacy and redundant workflows, including automatic deployment, release, label checking, auto-assign, and Helm chart publishing. - Deleted jobs and workflows related to self-hosted image builds, mobile app test builds, and previous deployment processes. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
5
.github/actions/deploy/action.yml
vendored
5
.github/actions/deploy/action.yml
vendored
@@ -1,9 +1,6 @@
|
|||||||
name: 'Deploy to Cluster'
|
name: 'Deploy to Cluster'
|
||||||
description: 'Deploy AFFiNE Cloud to cluster'
|
description: 'Deploy AFFiNE Cloud to cluster'
|
||||||
inputs:
|
inputs:
|
||||||
build-type:
|
|
||||||
description: 'Align with App build type, canary|beta|stable|internal'
|
|
||||||
default: 'canary'
|
|
||||||
gcp-project-number:
|
gcp-project-number:
|
||||||
description: 'GCP project number'
|
description: 'GCP project number'
|
||||||
required: true
|
required: true
|
||||||
@@ -36,5 +33,3 @@ runs:
|
|||||||
- name: Deploy
|
- name: Deploy
|
||||||
shell: bash
|
shell: bash
|
||||||
run: node ./.github/actions/deploy/deploy.mjs
|
run: node ./.github/actions/deploy/deploy.mjs
|
||||||
env:
|
|
||||||
BUILD_TYPE: '${{ inputs.build-type }}'
|
|
||||||
|
|||||||
42
.github/actions/prepare-release/action.yml
vendored
Normal file
42
.github/actions/prepare-release/action.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
name: Prepare Release
|
||||||
|
description: 'Prepare Release'
|
||||||
|
outputs:
|
||||||
|
APP_VERSION:
|
||||||
|
description: 'App Version'
|
||||||
|
value: ${{ steps.get-version.outputs.APP_VERSION }}
|
||||||
|
GIT_SHORT_HASH:
|
||||||
|
description: 'Git Short Hash'
|
||||||
|
value: ${{ steps.get-version.outputs.GIT_SHORT_HASH }}
|
||||||
|
BUILD_TYPE:
|
||||||
|
description: 'Build Type'
|
||||||
|
value: ${{ steps.get-version.outputs.BUILD_TYPE }}
|
||||||
|
runs:
|
||||||
|
using: 'composite'
|
||||||
|
steps:
|
||||||
|
- name: Get Version
|
||||||
|
id: get-version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
GIT_SHORT_HASH=$(git rev-parse --short HEAD)
|
||||||
|
if [ "${{ github.ref_type }}" == "tag" ]; then
|
||||||
|
APP_VERSION=$(echo "${{ github.ref_name }}" | sed 's/^v//')
|
||||||
|
else
|
||||||
|
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
||||||
|
APP_VERSION=$PACKAGE_VERSION-canary.$GIT_SHORT_HASH
|
||||||
|
fi
|
||||||
|
if [[ "$APP_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
||||||
|
BUILD_TYPE=stable
|
||||||
|
elif [[ "$APP_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+-beta\.[0-9]+$ ]]; then
|
||||||
|
BUILD_TYPE=beta
|
||||||
|
elif [[ "$APP_VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+-canary\.[0-9a-f]+$ ]]; then
|
||||||
|
BUILD_TYPE=canary
|
||||||
|
else
|
||||||
|
echo "Error: unsupported version string: $APP_VERSION" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo $APP_VERSION
|
||||||
|
echo $GIT_SHORT_HASH
|
||||||
|
echo $BUILD_TYPE
|
||||||
|
echo "APP_VERSION=$APP_VERSION" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "GIT_SHORT_HASH=$GIT_SHORT_HASH" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "BUILD_TYPE=$BUILD_TYPE" >> "$GITHUB_OUTPUT"
|
||||||
20
.github/actions/setup-version/action.yml
vendored
20
.github/actions/setup-version/action.yml
vendored
@@ -1,24 +1,12 @@
|
|||||||
name: Setup Version
|
name: Setup Version
|
||||||
description: 'Setup Version'
|
description: 'Setup Version'
|
||||||
outputs:
|
inputs:
|
||||||
APP_VERSION:
|
app-version:
|
||||||
description: 'App Version'
|
description: 'App Version'
|
||||||
value: ${{ steps.version.outputs.APP_VERSION }}
|
required: true
|
||||||
runs:
|
runs:
|
||||||
using: 'composite'
|
using: 'composite'
|
||||||
steps:
|
steps:
|
||||||
- name: 'Write Version'
|
- name: 'Write Version'
|
||||||
id: version
|
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: ./scripts/set-version.sh ${{ inputs.app-version }}
|
||||||
if [ "${{ github.ref_type }}" == "tag" ]; then
|
|
||||||
APP_VERSION=$(echo "${{ github.ref_name }}" | sed 's/^v//')
|
|
||||||
else
|
|
||||||
PACKAGE_VERSION=$(node -p "require('./package.json').version")
|
|
||||||
TIME_VERSION=$(date +%Y%m%d%H%M)
|
|
||||||
GIT_SHORT_HASH=$(git rev-parse --short HEAD)
|
|
||||||
APP_VERSION=$PACKAGE_VERSION-nightly-$GIT_SHORT_HASH
|
|
||||||
fi
|
|
||||||
echo $APP_VERSION
|
|
||||||
echo "APP_VERSION=$APP_VERSION" >> "$GITHUB_OUTPUT"
|
|
||||||
./scripts/set-version.sh $APP_VERSION
|
|
||||||
|
|||||||
56
.github/workflows/build-images.yml
vendored
56
.github/workflows/build-images.yml
vendored
@@ -3,7 +3,13 @@ name: Build Images
|
|||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
flavor:
|
build-type:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
app-version:
|
||||||
|
type: string
|
||||||
|
required: true
|
||||||
|
git-short-hash:
|
||||||
type: string
|
type: string
|
||||||
required: true
|
required: true
|
||||||
|
|
||||||
@@ -16,12 +22,13 @@ jobs:
|
|||||||
build-web:
|
build-web:
|
||||||
name: Build @affine/web
|
name: Build @affine/web
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: ${{ github.event.inputs.flavor }}
|
environment: ${{ inputs.build-type }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
- name: Build Core
|
- name: Build Core
|
||||||
@@ -30,11 +37,11 @@ jobs:
|
|||||||
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
||||||
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
||||||
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
||||||
BUILD_TYPE: ${{ github.event.inputs.flavor }}
|
BUILD_TYPE: ${{ inputs.build-type }}
|
||||||
CAPTCHA_SITE_KEY: ${{ secrets.CAPTCHA_SITE_KEY }}
|
CAPTCHA_SITE_KEY: ${{ secrets.CAPTCHA_SITE_KEY }}
|
||||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||||
SENTRY_PROJECT: 'affine-web'
|
SENTRY_PROJECT: 'affine-web'
|
||||||
SENTRY_RELEASE: ${{ steps.version.outputs.APP_VERSION }}
|
SENTRY_RELEASE: ${{ inputs.app-version }}
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
PERFSEE_TOKEN: ${{ secrets.PERFSEE_TOKEN }}
|
PERFSEE_TOKEN: ${{ secrets.PERFSEE_TOKEN }}
|
||||||
@@ -49,12 +56,13 @@ jobs:
|
|||||||
build-admin:
|
build-admin:
|
||||||
name: Build @affine/admin
|
name: Build @affine/admin
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: ${{ github.event.inputs.flavor }}
|
environment: ${{ inputs.build-type }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
- name: Build Admin
|
- name: Build Admin
|
||||||
@@ -63,7 +71,7 @@ jobs:
|
|||||||
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
||||||
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
||||||
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
||||||
BUILD_TYPE: ${{ github.event.inputs.flavor }}
|
BUILD_TYPE: ${{ inputs.build-type }}
|
||||||
CAPTCHA_SITE_KEY: ${{ secrets.CAPTCHA_SITE_KEY }}
|
CAPTCHA_SITE_KEY: ${{ secrets.CAPTCHA_SITE_KEY }}
|
||||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||||
SENTRY_PROJECT: 'affine-admin'
|
SENTRY_PROJECT: 'affine-admin'
|
||||||
@@ -81,12 +89,13 @@ jobs:
|
|||||||
build-mobile:
|
build-mobile:
|
||||||
name: Build @affine/mobile
|
name: Build @affine/mobile
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: ${{ github.event.inputs.flavor }}
|
environment: ${{ inputs.build-type }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
- name: Build Mobile
|
- name: Build Mobile
|
||||||
@@ -95,7 +104,7 @@ jobs:
|
|||||||
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
R2_ACCOUNT_ID: ${{ secrets.R2_ACCOUNT_ID }}
|
||||||
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
R2_ACCESS_KEY_ID: ${{ secrets.R2_ACCESS_KEY_ID }}
|
||||||
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
R2_SECRET_ACCESS_KEY: ${{ secrets.R2_SECRET_ACCESS_KEY }}
|
||||||
BUILD_TYPE: ${{ github.event.inputs.flavor }}
|
BUILD_TYPE: ${{ inputs.build-type }}
|
||||||
CAPTCHA_SITE_KEY: ${{ secrets.CAPTCHA_SITE_KEY }}
|
CAPTCHA_SITE_KEY: ${{ secrets.CAPTCHA_SITE_KEY }}
|
||||||
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
SENTRY_ORG: ${{ secrets.SENTRY_ORG }}
|
||||||
SENTRY_PROJECT: 'affine-mobile'
|
SENTRY_PROJECT: 'affine-mobile'
|
||||||
@@ -113,7 +122,7 @@ jobs:
|
|||||||
build-server-native:
|
build-server-native:
|
||||||
name: Build Server native - ${{ matrix.targets.name }}
|
name: Build Server native - ${{ matrix.targets.name }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: ${{ github.event.inputs.flavor }}
|
environment: ${{ inputs.build-type }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -128,8 +137,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
with:
|
with:
|
||||||
@@ -161,8 +171,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
with:
|
with:
|
||||||
@@ -202,16 +213,6 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
name: server-dist
|
name: server-dist
|
||||||
path: ./packages/backend/server/dist
|
path: ./packages/backend/server/dist
|
||||||
- name: Setup env
|
|
||||||
run: |
|
|
||||||
echo "GIT_SHORT_HASH=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV"
|
|
||||||
if [ -z "${{ inputs.flavor }}" ]
|
|
||||||
then
|
|
||||||
echo "RELEASE_FLAVOR=canary" >> "$GITHUB_ENV"
|
|
||||||
else
|
|
||||||
echo "RELEASE_FLAVOR=${{ inputs.flavor }}" >> "$GITHUB_ENV"
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Login to GitHub Container Registry
|
- name: Login to GitHub Container Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
@@ -263,8 +264,9 @@ jobs:
|
|||||||
run: mv ./node_modules ./packages/backend/server
|
run: mv ./node_modules ./packages/backend/server
|
||||||
|
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
|
|
||||||
- name: Build front Dockerfile
|
- name: Build front Dockerfile
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
@@ -275,7 +277,7 @@ jobs:
|
|||||||
platforms: linux/amd64,linux/arm64
|
platforms: linux/amd64,linux/arm64
|
||||||
provenance: true
|
provenance: true
|
||||||
file: .github/deployment/front/Dockerfile
|
file: .github/deployment/front/Dockerfile
|
||||||
tags: ghcr.io/toeverything/affine-front:${{env.RELEASE_FLAVOR}}-${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-front:${{env.RELEASE_FLAVOR}}
|
tags: ghcr.io/toeverything/affine-front:${{inputs.build-type}}-${{ inputs.git-short-hash }}
|
||||||
|
|
||||||
- name: Build graphql Dockerfile
|
- name: Build graphql Dockerfile
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
@@ -286,4 +288,4 @@ jobs:
|
|||||||
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
platforms: linux/amd64,linux/arm64,linux/arm/v7
|
||||||
provenance: true
|
provenance: true
|
||||||
file: .github/deployment/node/Dockerfile
|
file: .github/deployment/node/Dockerfile
|
||||||
tags: ghcr.io/toeverything/affine-graphql:${{env.RELEASE_FLAVOR}}-${{ env.GIT_SHORT_HASH }},ghcr.io/toeverything/affine-graphql:${{env.RELEASE_FLAVOR}}
|
tags: ghcr.io/toeverything/affine:${{inputs.build-type}}-${{ inputs.git-short-hash }}
|
||||||
|
|||||||
25
.github/workflows/build-selfhost-image.yml
vendored
25
.github/workflows/build-selfhost-image.yml
vendored
@@ -1,25 +0,0 @@
|
|||||||
name: Build Selfhost Image
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
flavor:
|
|
||||||
description: 'Select distribution to build'
|
|
||||||
type: choice
|
|
||||||
default: canary
|
|
||||||
options:
|
|
||||||
- canary
|
|
||||||
- beta
|
|
||||||
- stable
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: 'write'
|
|
||||||
id-token: 'write'
|
|
||||||
packages: 'write'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-image:
|
|
||||||
name: Build Image
|
|
||||||
uses: ./.github/workflows/build-images.yml
|
|
||||||
with:
|
|
||||||
flavor: ${{ github.event.inputs.flavor }}
|
|
||||||
10
.github/workflows/build-test.yml
vendored
10
.github/workflows/build-test.yml
vendored
@@ -1359,15 +1359,6 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
yarn affine @affine/electron node ./scripts/macos-arm64-output-check.ts
|
yarn affine @affine/electron node ./scripts/macos-arm64-output-check.ts
|
||||||
|
|
||||||
test-build-mobile-app:
|
|
||||||
uses: ./.github/workflows/release-mobile.yml
|
|
||||||
with:
|
|
||||||
build-type: canary
|
|
||||||
build-target: development
|
|
||||||
secrets: inherit
|
|
||||||
permissions:
|
|
||||||
id-token: 'write'
|
|
||||||
|
|
||||||
test-done:
|
test-done:
|
||||||
needs:
|
needs:
|
||||||
- analyze
|
- analyze
|
||||||
@@ -1398,7 +1389,6 @@ jobs:
|
|||||||
- desktop-test
|
- desktop-test
|
||||||
- desktop-bundle-check
|
- desktop-bundle-check
|
||||||
- cloud-e2e-test
|
- cloud-e2e-test
|
||||||
- test-build-mobile-app
|
|
||||||
if: always()
|
if: always()
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: 3, 2, 1 Launch
|
name: 3, 2, 1 Launch
|
||||||
|
|||||||
32
.github/workflows/deploy-automatically.yml
vendored
32
.github/workflows/deploy-automatically.yml
vendored
@@ -1,32 +0,0 @@
|
|||||||
name: Deploy Automatically
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v[0-9]+.[0-9]+.[0-9]+-canary.[0-9]+'
|
|
||||||
schedule:
|
|
||||||
- cron: '0 9 * * *'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
actions: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dispatch-deploy:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Setup Deploy
|
|
||||||
steps:
|
|
||||||
- name: dispatch deploy by tag
|
|
||||||
if: ${{ github.event_name == 'push' }}
|
|
||||||
uses: benc-uk/workflow-dispatch@v1
|
|
||||||
with:
|
|
||||||
workflow: deploy.yml
|
|
||||||
inputs: '{ "flavor": "canary" }'
|
|
||||||
- name: dispatch deploy by schedule
|
|
||||||
if: ${{ github.event_name == 'schedule' }}
|
|
||||||
uses: benc-uk/workflow-dispatch@v1
|
|
||||||
with:
|
|
||||||
workflow: deploy.yml
|
|
||||||
inputs: '{ "flavor": "canary" }'
|
|
||||||
ref: canary
|
|
||||||
189
.github/workflows/deploy.yml
vendored
189
.github/workflows/deploy.yml
vendored
@@ -1,189 +0,0 @@
|
|||||||
name: Deploy
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
flavor:
|
|
||||||
description: 'Select what enverionment to deploy to'
|
|
||||||
type: choice
|
|
||||||
default: canary
|
|
||||||
options:
|
|
||||||
- canary
|
|
||||||
- beta
|
|
||||||
- stable
|
|
||||||
- internal
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: 'write'
|
|
||||||
id-token: 'write'
|
|
||||||
packages: 'write'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
output-prev-version:
|
|
||||||
name: Output previous version
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
environment: ${{ github.event.inputs.flavor }}
|
|
||||||
outputs:
|
|
||||||
prev: ${{ steps.print.outputs.version }}
|
|
||||||
namespace: ${{ steps.print.outputs.namespace }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Auth to Cluster
|
|
||||||
uses: './.github/actions/cluster-auth'
|
|
||||||
with:
|
|
||||||
gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }}
|
|
||||||
gcp-project-id: ${{ secrets.GCP_PROJECT_ID }}
|
|
||||||
service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}
|
|
||||||
cluster-name: ${{ secrets.GCP_CLUSTER_NAME }}
|
|
||||||
cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }}
|
|
||||||
- name: Output previous version
|
|
||||||
id: print
|
|
||||||
run: |
|
|
||||||
namespace=""
|
|
||||||
if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then
|
|
||||||
namespace="dev"
|
|
||||||
elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then
|
|
||||||
namespace="beta"
|
|
||||||
elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then
|
|
||||||
namespace="production"
|
|
||||||
else
|
|
||||||
echo "Invalid flavor: ${{ github.event.inputs.flavor }}"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Namespace set to: $namespace"
|
|
||||||
|
|
||||||
# Get the previous version from the deployment
|
|
||||||
prev_version=$(kubectl get deployment -n $namespace affine-graphql -o=jsonpath='{.spec.template.spec.containers[0].image}' | awk -F '-' '{print $3}')
|
|
||||||
|
|
||||||
echo "Previous version: $prev_version"
|
|
||||||
echo "version=$prev_version" >> $GITHUB_OUTPUT
|
|
||||||
echo "namesapce=$namespace" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
build-images:
|
|
||||||
name: Build Images
|
|
||||||
uses: ./.github/workflows/build-images.yml
|
|
||||||
secrets: inherit
|
|
||||||
with:
|
|
||||||
flavor: ${{ github.event.inputs.flavor }}
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
name: Deploy to cluster
|
|
||||||
if: ${{ github.event_name == 'workflow_dispatch' }}
|
|
||||||
environment: ${{ github.event.inputs.flavor }}
|
|
||||||
needs:
|
|
||||||
- build-images
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- name: Setup Version
|
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
|
||||||
- name: Deploy to ${{ github.event.inputs.flavor }}
|
|
||||||
uses: ./.github/actions/deploy
|
|
||||||
with:
|
|
||||||
build-type: ${{ github.event.inputs.flavor }}
|
|
||||||
gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }}
|
|
||||||
gcp-project-id: ${{ secrets.GCP_PROJECT_ID }}
|
|
||||||
service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}
|
|
||||||
cluster-name: ${{ secrets.GCP_CLUSTER_NAME }}
|
|
||||||
cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }}
|
|
||||||
env:
|
|
||||||
APP_VERSION: ${{ steps.version.outputs.APP_VERSION }}
|
|
||||||
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
|
||||||
CANARY_DEPLOY_HOST: ${{ secrets.CANARY_DEPLOY_HOST }}
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
|
||||||
DATABASE_USERNAME: ${{ secrets.DATABASE_USERNAME }}
|
|
||||||
DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}
|
|
||||||
DATABASE_NAME: ${{ secrets.DATABASE_NAME }}
|
|
||||||
GCLOUD_CONNECTION_NAME: ${{ secrets.GCLOUD_CONNECTION_NAME }}
|
|
||||||
REDIS_SERVER_HOST: ${{ secrets.REDIS_SERVER_HOST }}
|
|
||||||
REDIS_SERVER_PASSWORD: ${{ secrets.REDIS_SERVER_PASSWORD }}
|
|
||||||
CLOUD_SQL_IAM_ACCOUNT: ${{ secrets.CLOUD_SQL_IAM_ACCOUNT }}
|
|
||||||
APP_IAM_ACCOUNT: ${{ secrets.APP_IAM_ACCOUNT }}
|
|
||||||
STATIC_IP_NAME: ${{ secrets.STATIC_IP_NAME }}
|
|
||||||
AFFINE_INDEXER_SEARCH_PROVIDER: ${{ secrets.AFFINE_INDEXER_SEARCH_PROVIDER }}
|
|
||||||
AFFINE_INDEXER_SEARCH_ENDPOINT: ${{ secrets.AFFINE_INDEXER_SEARCH_ENDPOINT }}
|
|
||||||
AFFINE_INDEXER_SEARCH_API_KEY: ${{ secrets.AFFINE_INDEXER_SEARCH_API_KEY }}
|
|
||||||
|
|
||||||
deploy-done:
|
|
||||||
needs:
|
|
||||||
- output-prev-version
|
|
||||||
- build-images
|
|
||||||
- deploy
|
|
||||||
if: always()
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Post deploy message
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
repository: toeverything/blocksuite
|
|
||||||
path: blocksuite
|
|
||||||
fetch-depth: 0
|
|
||||||
fetch-tags: true
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: ./.github/actions/setup-node
|
|
||||||
with:
|
|
||||||
extra-flags: 'workspaces focus @affine/changelog'
|
|
||||||
electron-install: false
|
|
||||||
- name: Output deployed info
|
|
||||||
if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
|
|
||||||
id: set_info
|
|
||||||
run: |
|
|
||||||
if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then
|
|
||||||
echo "deployed_url=https://affine.fail" >> $GITHUB_OUTPUT
|
|
||||||
elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then
|
|
||||||
echo "deployed_url=https://insider.affine.pro" >> $GITHUB_OUTPUT
|
|
||||||
elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then
|
|
||||||
echo "deployed_url=https://app.affine.pro" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}}
|
|
||||||
- name: Post Success event to a Slack channel
|
|
||||||
if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }}
|
|
||||||
run: node ./tools/changelog/index.js
|
|
||||||
env:
|
|
||||||
CHANNEL_ID: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
|
|
||||||
SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
||||||
DEPLOYED_URL: ${{ steps.set_info.outputs.deployed_url }}
|
|
||||||
PREV_VERSION: ${{ needs.output-prev-version.outputs.prev }}
|
|
||||||
NAMESPACE: ${{ needs.output-prev-version.outputs.namespace }}
|
|
||||||
DEPLOYMENT: 'SERVER'
|
|
||||||
FLAVOR: ${{ github.event.inputs.flavor }}
|
|
||||||
BLOCKSUITE_REPO_PATH: ${{ github.workspace }}/blocksuite
|
|
||||||
- name: Post Failed event to a Slack channel
|
|
||||||
id: failed-slack
|
|
||||||
uses: slackapi/slack-github-action@v2.1.0
|
|
||||||
if: ${{ always() && contains(needs.*.result, 'failure') }}
|
|
||||||
with:
|
|
||||||
method: chat.postMessage
|
|
||||||
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
||||||
payload: |
|
|
||||||
channel: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
|
|
||||||
text: "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy failed `${{ github.event.inputs.flavor }}`>"
|
|
||||||
blocks:
|
|
||||||
- type: section
|
|
||||||
text:
|
|
||||||
type: mrkdwn
|
|
||||||
text: "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy failed `${{ github.event.inputs.flavor }}`>"
|
|
||||||
- name: Post Cancel event to a Slack channel
|
|
||||||
id: cancel-slack
|
|
||||||
uses: slackapi/slack-github-action@v2.1.0
|
|
||||||
if: ${{ always() && contains(needs.*.result, 'cancelled') && !contains(needs.*.result, 'failure') }}
|
|
||||||
with:
|
|
||||||
token: ${{ secrets.SLACK_BOT_TOKEN }}
|
|
||||||
method: chat.postMessage
|
|
||||||
payload: |
|
|
||||||
channel: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }}
|
|
||||||
text: "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy cancelled `${{ github.event.inputs.flavor }}`>"
|
|
||||||
blocks:
|
|
||||||
- type: section
|
|
||||||
text:
|
|
||||||
type: mrkdwn
|
|
||||||
text: "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy cancelled `${{ github.event.inputs.flavor }}`>"
|
|
||||||
66
.github/workflows/helm-releaser.yml
vendored
66
.github/workflows/helm-releaser.yml
vendored
@@ -1,66 +0,0 @@
|
|||||||
name: Release Charts
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [canary]
|
|
||||||
paths:
|
|
||||||
- '.github/helm/**/Chart.yml'
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Checkout Helm chart repo
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
repository: toeverything/helm-charts
|
|
||||||
path: .helm-chart-repo
|
|
||||||
ref: gh-pages
|
|
||||||
token: ${{ secrets.HELM_RELEASER_TOKEN }}
|
|
||||||
|
|
||||||
- name: Install Helm
|
|
||||||
uses: azure/setup-helm@v4
|
|
||||||
|
|
||||||
- name: Install chart releaser
|
|
||||||
run: |
|
|
||||||
set -e
|
|
||||||
arch="$(dpkg --print-architecture)"
|
|
||||||
curl -s https://api.github.com/repos/helm/chart-releaser/releases/latest \
|
|
||||||
| yq --indent 0 --no-colors --input-format json --unwrapScalar \
|
|
||||||
".assets[] | select(.name | test("\""^chart-releaser_.+_linux_${arch}\.tar\.gz$"\"")) | .browser_download_url" \
|
|
||||||
| xargs curl -SsL \
|
|
||||||
| tar zxf - -C /usr/local/bin
|
|
||||||
|
|
||||||
- name: Package charts
|
|
||||||
working-directory: .helm-chart-repo
|
|
||||||
run: |
|
|
||||||
mkdir -p .cr-index
|
|
||||||
helm repo add bitnami https://charts.bitnami.com/bitnami
|
|
||||||
helm repo update
|
|
||||||
|
|
||||||
helm dependencies build ../.github/helm/affine
|
|
||||||
helm dependencies build ../.github/helm/affine-cloud
|
|
||||||
cr package ../.github/helm/affine
|
|
||||||
cr package ../.github/helm/affine-cloud
|
|
||||||
|
|
||||||
- name: Publish charts
|
|
||||||
working-directory: .helm-chart-repo
|
|
||||||
run: |
|
|
||||||
set -ex
|
|
||||||
git config --local user.name "$GITHUB_ACTOR"
|
|
||||||
git config --local user.email "$GITHUB_ACTOR@users.noreply.github.com"
|
|
||||||
owner=$(cut -d '/' -f 1 <<< '${{ github.repository }}')
|
|
||||||
repo=helm-charts
|
|
||||||
git_hash=$(git rev-parse HEAD)
|
|
||||||
cr upload --commit "$git_hash" \
|
|
||||||
--git-repo "$repo" --owner "$owner" \
|
|
||||||
--token '${{ secrets.HELM_RELEASER_TOKEN }}' \
|
|
||||||
--skip-existing
|
|
||||||
cr index --git-repo "$repo" --owner "$owner" \
|
|
||||||
--token '${{ secrets.HELM_RELEASER_TOKEN }}' \
|
|
||||||
--index-path .cr-index --push
|
|
||||||
19
.github/workflows/label-checker.yml
vendored
19
.github/workflows/label-checker.yml
vendored
@@ -1,19 +0,0 @@
|
|||||||
name: Label Checker
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types:
|
|
||||||
- opened
|
|
||||||
- labeled
|
|
||||||
- unlabeled
|
|
||||||
branches:
|
|
||||||
- canary
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check_labels:
|
|
||||||
name: PR should not have a blocked label
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: docker://agilepathway/pull-request-label-checker:latest
|
|
||||||
with:
|
|
||||||
none_of: blocked
|
|
||||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
12
.github/workflows/pr-auto-assign.yml
vendored
12
.github/workflows/pr-auto-assign.yml
vendored
@@ -1,12 +0,0 @@
|
|||||||
name: Pull request auto assign
|
|
||||||
|
|
||||||
# on: pull_request
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
types: [opened, ready_for_review]
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
add-reviews:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: kentaro-m/auto-assign-action@v2.0.0
|
|
||||||
38
.github/workflows/release-automatically.yml
vendored
38
.github/workflows/release-automatically.yml
vendored
@@ -1,38 +0,0 @@
|
|||||||
name: Release Desktop/Mobile Automatically
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
tags:
|
|
||||||
- 'v[0-9]+.[0-9]+.[0-9]+-canary.[0-9]+'
|
|
||||||
schedule:
|
|
||||||
- cron: '0 9 * * *'
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
pull-requests: write
|
|
||||||
actions: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
dispatch-release-desktop:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
name: Setup Release Desktop
|
|
||||||
steps:
|
|
||||||
- name: dispatch desktop release by tag
|
|
||||||
if: ${{ github.event_name == 'push' }}
|
|
||||||
uses: benc-uk/workflow-dispatch@v1
|
|
||||||
with:
|
|
||||||
workflow: release-desktop.yml
|
|
||||||
inputs: '{ "build-type": "canary", "is-draft": false, "is-pre-release": true }'
|
|
||||||
|
|
||||||
- name: dispatch desktop release by schedule
|
|
||||||
if: ${{ github.event_name == 'schedule' }}
|
|
||||||
uses: benc-uk/workflow-dispatch@v1
|
|
||||||
with:
|
|
||||||
workflow: release-desktop.yml
|
|
||||||
inputs: '{ "build-type": "canary", "is-draft": false, "is-pre-release": true }'
|
|
||||||
ref: canary
|
|
||||||
- name: dispatch desktop release by tag
|
|
||||||
uses: benc-uk/workflow-dispatch@v1
|
|
||||||
with:
|
|
||||||
workflow: release-mobile.yml
|
|
||||||
inputs: '{ "build-type": "canary", "build-target": "distribution" }'
|
|
||||||
66
.github/workflows/release-cloud.yml
vendored
Normal file
66
.github/workflows/release-cloud.yml
vendored
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
name: Release Cloud
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
build-type:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
app-version:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
git-short-hash:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: 'write'
|
||||||
|
id-token: 'write'
|
||||||
|
packages: 'write'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-images:
|
||||||
|
name: Build Images
|
||||||
|
uses: ./.github/workflows/build-images.yml
|
||||||
|
secrets: inherit
|
||||||
|
with:
|
||||||
|
build-type: ${{ inputs.build-type }}
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
|
git-short-hash: ${{ inputs.git-short-hash }}
|
||||||
|
|
||||||
|
deploy:
|
||||||
|
name: Deploy to cluster
|
||||||
|
environment: ${{ inputs.build-type }}
|
||||||
|
needs:
|
||||||
|
- build-images
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Deploy to ${{ inputs.build-type }}
|
||||||
|
uses: ./.github/actions/deploy
|
||||||
|
with:
|
||||||
|
gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }}
|
||||||
|
gcp-project-id: ${{ secrets.GCP_PROJECT_ID }}
|
||||||
|
service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}
|
||||||
|
cluster-name: ${{ secrets.GCP_CLUSTER_NAME }}
|
||||||
|
cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }}
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: ${{ inputs.build-type }}
|
||||||
|
APP_VERSION: ${{ inputs.app-version }}
|
||||||
|
GIT_SHORT_HASH: ${{ inputs.git-short-hash }}
|
||||||
|
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
|
||||||
|
CANARY_DEPLOY_HOST: ${{ secrets.CANARY_DEPLOY_HOST }}
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
||||||
|
DATABASE_USERNAME: ${{ secrets.DATABASE_USERNAME }}
|
||||||
|
DATABASE_PASSWORD: ${{ secrets.DATABASE_PASSWORD }}
|
||||||
|
DATABASE_NAME: ${{ secrets.DATABASE_NAME }}
|
||||||
|
GCLOUD_CONNECTION_NAME: ${{ secrets.GCLOUD_CONNECTION_NAME }}
|
||||||
|
REDIS_SERVER_HOST: ${{ secrets.REDIS_SERVER_HOST }}
|
||||||
|
REDIS_SERVER_PASSWORD: ${{ secrets.REDIS_SERVER_PASSWORD }}
|
||||||
|
CLOUD_SQL_IAM_ACCOUNT: ${{ secrets.CLOUD_SQL_IAM_ACCOUNT }}
|
||||||
|
APP_IAM_ACCOUNT: ${{ secrets.APP_IAM_ACCOUNT }}
|
||||||
|
STATIC_IP_NAME: ${{ secrets.STATIC_IP_NAME }}
|
||||||
|
AFFINE_INDEXER_SEARCH_PROVIDER: ${{ secrets.AFFINE_INDEXER_SEARCH_PROVIDER }}
|
||||||
|
AFFINE_INDEXER_SEARCH_ENDPOINT: ${{ secrets.AFFINE_INDEXER_SEARCH_ENDPOINT }}
|
||||||
|
AFFINE_INDEXER_SEARCH_API_KEY: ${{ secrets.AFFINE_INDEXER_SEARCH_API_KEY }}
|
||||||
118
.github/workflows/release-desktop.yml
vendored
118
.github/workflows/release-desktop.yml
vendored
@@ -1,27 +1,17 @@
|
|||||||
name: Release Desktop App
|
name: Release Desktop
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
build-type:
|
build-type:
|
||||||
description: 'Build Type'
|
|
||||||
type: choice
|
|
||||||
required: true
|
required: true
|
||||||
default: canary
|
type: string
|
||||||
options:
|
app-version:
|
||||||
- canary
|
|
||||||
- beta
|
|
||||||
- stable
|
|
||||||
is-draft:
|
|
||||||
description: 'Draft Release?'
|
|
||||||
type: boolean
|
|
||||||
required: true
|
required: true
|
||||||
default: true
|
type: string
|
||||||
is-pre-release:
|
git-short-hash:
|
||||||
description: 'Pre Release? (labeled as "PreRelease")'
|
|
||||||
type: boolean
|
|
||||||
required: true
|
required: true
|
||||||
default: true
|
type: string
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
actions: write
|
actions: write
|
||||||
@@ -31,7 +21,8 @@ permissions:
|
|||||||
attestations: write
|
attestations: write
|
||||||
|
|
||||||
env:
|
env:
|
||||||
BUILD_TYPE: ${{ github.event.inputs.build-type }}
|
BUILD_TYPE: ${{ inputs.build-type }}
|
||||||
|
RELEASE_VERSION: ${{ inputs.app-version }}
|
||||||
DEBUG: 'affine:*,napi:*'
|
DEBUG: 'affine:*,napi:*'
|
||||||
APP_NAME: affine
|
APP_NAME: affine
|
||||||
MACOSX_DEPLOYMENT_TARGET: '10.13'
|
MACOSX_DEPLOYMENT_TARGET: '10.13'
|
||||||
@@ -39,14 +30,13 @@ env:
|
|||||||
jobs:
|
jobs:
|
||||||
before-make:
|
before-make:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: ${{ github.event.inputs.build-type }}
|
environment: ${{ inputs.build-type }}
|
||||||
outputs:
|
|
||||||
RELEASE_VERSION: ${{ steps.version.outputs.APP_VERSION }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
- name: Setup @sentry/cli
|
- name: Setup @sentry/cli
|
||||||
@@ -58,8 +48,8 @@ jobs:
|
|||||||
SENTRY_PROJECT: 'affine'
|
SENTRY_PROJECT: 'affine'
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
SENTRY_RELEASE: ${{ steps.version.outputs.APP_VERSION }}
|
SENTRY_RELEASE: ${{ inputs.app-version }}
|
||||||
RELEASE_VERSION: ${{ steps.version.outputs.APP_VERSION }}
|
RELEASE_VERSION: ${{ inputs.app-version }}
|
||||||
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
|
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
|
||||||
|
|
||||||
- name: Upload web artifact
|
- name: Upload web artifact
|
||||||
@@ -87,7 +77,7 @@ jobs:
|
|||||||
target: x86_64-unknown-linux-gnu
|
target: x86_64-unknown-linux-gnu
|
||||||
runs-on: ${{ matrix.spec.runner }}
|
runs-on: ${{ matrix.spec.runner }}
|
||||||
needs: before-make
|
needs: before-make
|
||||||
environment: ${{ github.event.inputs.build-type }}
|
environment: ${{ inputs.build-type }}
|
||||||
env:
|
env:
|
||||||
APPLE_ID: ${{ secrets.APPLE_ID }}
|
APPLE_ID: ${{ secrets.APPLE_ID }}
|
||||||
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
|
||||||
@@ -97,13 +87,14 @@ jobs:
|
|||||||
SENTRY_PROJECT: 'affine'
|
SENTRY_PROJECT: 'affine'
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
SENTRY_RELEASE: ${{ needs.before-make.outputs.RELEASE_VERSION }}
|
SENTRY_RELEASE: ${{ inputs.app-version }}
|
||||||
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
|
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
@@ -165,31 +156,31 @@ jobs:
|
|||||||
if: ${{ matrix.spec.platform == 'darwin' }}
|
if: ${{ matrix.spec.platform == 'darwin' }}
|
||||||
run: |
|
run: |
|
||||||
mkdir -p builds
|
mkdir -p builds
|
||||||
mv packages/frontend/apps/electron/out/*/make/*.dmg ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.dmg
|
mv packages/frontend/apps/electron/out/*/make/*.dmg ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.dmg
|
||||||
mv packages/frontend/apps/electron/out/*/make/zip/darwin/${{ matrix.spec.arch }}/*.zip ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.zip
|
mv packages/frontend/apps/electron/out/*/make/zip/darwin/${{ matrix.spec.arch }}/*.zip ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.zip
|
||||||
- name: Save artifacts (linux)
|
- name: Save artifacts (linux)
|
||||||
if: ${{ matrix.spec.platform == 'linux' }}
|
if: ${{ matrix.spec.platform == 'linux' }}
|
||||||
run: |
|
run: |
|
||||||
mkdir -p builds
|
mkdir -p builds
|
||||||
mv packages/frontend/apps/electron/out/*/make/zip/linux/${{ matrix.spec.arch }}/*.zip ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.zip
|
mv packages/frontend/apps/electron/out/*/make/zip/linux/${{ matrix.spec.arch }}/*.zip ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.zip
|
||||||
mv packages/frontend/apps/electron/out/*/make/*.AppImage ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.appimage
|
mv packages/frontend/apps/electron/out/*/make/*.AppImage ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.appimage
|
||||||
mv packages/frontend/apps/electron/out/*/make/deb/${{ matrix.spec.arch }}/*.deb ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.deb
|
mv packages/frontend/apps/electron/out/*/make/deb/${{ matrix.spec.arch }}/*.deb ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.deb
|
||||||
mv packages/frontend/apps/electron/out/*/make/flatpak/*/*.flatpak ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.flatpak
|
mv packages/frontend/apps/electron/out/*/make/flatpak/*/*.flatpak ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-${{ matrix.spec.arch }}.flatpak
|
||||||
|
|
||||||
- uses: actions/attest-build-provenance@v2
|
- uses: actions/attest-build-provenance@v2
|
||||||
if: ${{ matrix.spec.platform == 'darwin' }}
|
if: ${{ matrix.spec.platform == 'darwin' }}
|
||||||
with:
|
with:
|
||||||
subject-path: |
|
subject-path: |
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.zip
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.zip
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.dmg
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-macos-${{ matrix.spec.arch }}.dmg
|
||||||
|
|
||||||
- uses: actions/attest-build-provenance@v2
|
- uses: actions/attest-build-provenance@v2
|
||||||
if: ${{ matrix.spec.platform == 'linux' }}
|
if: ${{ matrix.spec.platform == 'linux' }}
|
||||||
with:
|
with:
|
||||||
subject-path: |
|
subject-path: |
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.zip
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.zip
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.appimage
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.appimage
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.deb
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-linux-x64.deb
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -197,7 +188,7 @@ jobs:
|
|||||||
path: builds
|
path: builds
|
||||||
|
|
||||||
package-distribution-windows:
|
package-distribution-windows:
|
||||||
environment: ${{ github.event.inputs.build-type }}
|
environment: ${{ inputs.build-type }}
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@@ -221,13 +212,14 @@ jobs:
|
|||||||
SENTRY_PROJECT: 'affine'
|
SENTRY_PROJECT: 'affine'
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
SENTRY_RELEASE: ${{ needs.before-make.outputs.RELEASE_VERSION }}
|
SENTRY_RELEASE: ${{ inputs.app-version }}
|
||||||
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
|
MIXPANEL_TOKEN: ${{ secrets.MIXPANEL_TOKEN }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
@@ -314,8 +306,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
timeout-minutes: 10
|
timeout-minutes: 10
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
@@ -399,16 +392,16 @@ jobs:
|
|||||||
- name: Save artifacts
|
- name: Save artifacts
|
||||||
run: |
|
run: |
|
||||||
mkdir -p builds
|
mkdir -p builds
|
||||||
mv packages/frontend/apps/electron/out/*/make/zip/win32/${{ matrix.spec.arch }}/AFFiNE*-win32-${{ matrix.spec.arch }}-*.zip ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.zip
|
mv packages/frontend/apps/electron/out/*/make/zip/win32/${{ matrix.spec.arch }}/AFFiNE*-win32-${{ matrix.spec.arch }}-*.zip ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.zip
|
||||||
mv packages/frontend/apps/electron/out/*/make/squirrel.windows/${{ matrix.spec.arch }}/*.exe ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.exe
|
mv packages/frontend/apps/electron/out/*/make/squirrel.windows/${{ matrix.spec.arch }}/*.exe ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.exe
|
||||||
mv packages/frontend/apps/electron/out/*/make/nsis.windows/${{ matrix.spec.arch }}/*.exe ./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.nsis.exe
|
mv packages/frontend/apps/electron/out/*/make/nsis.windows/${{ matrix.spec.arch }}/*.exe ./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.nsis.exe
|
||||||
|
|
||||||
- uses: actions/attest-build-provenance@v2
|
- uses: actions/attest-build-provenance@v2
|
||||||
with:
|
with:
|
||||||
subject-path: |
|
subject-path: |
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.zip
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.zip
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.exe
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.exe
|
||||||
./builds/affine-${{ needs.before-make.outputs.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.nsis.exe
|
./builds/affine-${{ env.RELEASE_VERSION }}-${{ env.BUILD_TYPE }}-windows-${{ matrix.spec.arch }}.nsis.exe
|
||||||
|
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@@ -465,32 +458,13 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
node ./scripts/generate-release-yml.mjs
|
node ./scripts/generate-release-yml.mjs
|
||||||
env:
|
env:
|
||||||
RELEASE_VERSION: ${{ needs.before-make.outputs.RELEASE_VERSION }}
|
RELEASE_VERSION: ${{ env.RELEASE_VERSION }}
|
||||||
- name: Create Release Draft
|
- name: Create GitHub Release
|
||||||
if: ${{ github.ref_type == 'tag' }}
|
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
name: ${{ needs.before-make.outputs.RELEASE_VERSION }}
|
name: ${{ env.RELEASE_VERSION }}
|
||||||
body: ''
|
draft: ${{ inputs.build-type == 'stable' }}
|
||||||
draft: ${{ github.event.inputs.is-draft }}
|
prerelease: ${{ inputs.build-type != 'stable' }}
|
||||||
prerelease: ${{ github.event.inputs.is-pre-release }}
|
|
||||||
files: |
|
|
||||||
./release/*
|
|
||||||
./release/.env.example
|
|
||||||
- name: Create Nightly Release Draft
|
|
||||||
if: ${{ github.ref_type == 'branch' }}
|
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }}
|
|
||||||
with:
|
|
||||||
# Temporarily, treat release from branch as nightly release, artifact saved to AFFiNE-Releases.
|
|
||||||
# Need to improve internal build and nightly release logic.
|
|
||||||
repository: 'toeverything/AFFiNE-Releases'
|
|
||||||
name: ${{ needs.before-make.outputs.RELEASE_VERSION }}
|
|
||||||
tag_name: ${{ needs.before-make.outputs.RELEASE_VERSION }}
|
|
||||||
body: ''
|
|
||||||
draft: false
|
|
||||||
prerelease: true
|
|
||||||
files: |
|
files: |
|
||||||
./release/*
|
./release/*
|
||||||
./release/.env.example
|
./release/.env.example
|
||||||
|
|||||||
89
.github/workflows/release-mobile.yml
vendored
89
.github/workflows/release-mobile.yml
vendored
@@ -1,68 +1,33 @@
|
|||||||
name: Release Mobile App
|
name: Release Mobile
|
||||||
|
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
inputs:
|
inputs:
|
||||||
build-target:
|
app-version:
|
||||||
description: 'Build Target'
|
type: string
|
||||||
|
required: true
|
||||||
|
git-short-hash:
|
||||||
type: string
|
type: string
|
||||||
required: true
|
required: true
|
||||||
build-type:
|
build-type:
|
||||||
description: 'Build Type'
|
|
||||||
type: string
|
type: string
|
||||||
required: true
|
required: true
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
build-target:
|
|
||||||
description: 'Build Target'
|
|
||||||
type: choice
|
|
||||||
required: true
|
|
||||||
default: distribution
|
|
||||||
options:
|
|
||||||
- development
|
|
||||||
- distribution
|
|
||||||
build-type:
|
|
||||||
description: 'Build Type'
|
|
||||||
type: choice
|
|
||||||
required: true
|
|
||||||
default: canary
|
|
||||||
options:
|
|
||||||
- canary
|
|
||||||
- beta
|
|
||||||
- stable
|
|
||||||
env:
|
env:
|
||||||
BUILD_TYPE: ${{ inputs.build-type || github.event.inputs.build-type }}
|
BUILD_TYPE: ${{ inputs.build-type }}
|
||||||
BUILD_TARGET: ${{ inputs.build-target || github.event.inputs.build-target }}
|
|
||||||
DEBUG: napi:*
|
DEBUG: napi:*
|
||||||
KEYCHAIN_NAME: ${{ github.workspace }}/signing_temp
|
KEYCHAIN_NAME: ${{ github.workspace }}/signing_temp
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
output-env:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
ENVIRONMENT: ${{ steps.env.outputs.ENVIRONMENT }}
|
|
||||||
steps:
|
|
||||||
- name: Output Environment
|
|
||||||
id: env
|
|
||||||
run: |
|
|
||||||
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
|
|
||||||
echo "ENVIRONMENT=${{ github.event.inputs.build-type }}" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "ENVIRONMENT=" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
build-ios-web:
|
build-ios-web:
|
||||||
needs:
|
runs-on: ubuntu-latest
|
||||||
- output-env
|
environment: ${{ inputs.build-type }}
|
||||||
runs-on: ubuntu-24.04-arm
|
|
||||||
environment: ${{ needs.output-env.outputs.ENVIRONMENT }}
|
|
||||||
outputs:
|
|
||||||
RELEASE_VERSION: ${{ steps.version.outputs.APP_VERSION }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
- name: Setup @sentry/cli
|
- name: Setup @sentry/cli
|
||||||
@@ -76,8 +41,8 @@ jobs:
|
|||||||
SENTRY_PROJECT: 'affine'
|
SENTRY_PROJECT: 'affine'
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
SENTRY_RELEASE: ${{ steps.version.outputs.APP_VERSION }}
|
SENTRY_RELEASE: ${{ inputs.app-version }}
|
||||||
RELEASE_VERSION: ${{ steps.version.outputs.APP_VERSION }}
|
RELEASE_VERSION: ${{ inputs.app-version }}
|
||||||
- name: Upload ios artifact
|
- name: Upload ios artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -85,17 +50,13 @@ jobs:
|
|||||||
path: packages/frontend/apps/ios/dist
|
path: packages/frontend/apps/ios/dist
|
||||||
|
|
||||||
build-android-web:
|
build-android-web:
|
||||||
runs-on: ubuntu-24.04-arm
|
runs-on: ubuntu-latest
|
||||||
needs:
|
|
||||||
- output-env
|
|
||||||
environment: ${{ needs.output-env.outputs.ENVIRONMENT }}
|
|
||||||
outputs:
|
|
||||||
RELEASE_VERSION: ${{ steps.version.outputs.APP_VERSION }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: ./.github/actions/setup-node
|
uses: ./.github/actions/setup-node
|
||||||
- name: Setup @sentry/cli
|
- name: Setup @sentry/cli
|
||||||
@@ -109,8 +70,7 @@ jobs:
|
|||||||
SENTRY_PROJECT: 'affine'
|
SENTRY_PROJECT: 'affine'
|
||||||
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
|
||||||
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
SENTRY_DSN: ${{ secrets.SENTRY_DSN }}
|
||||||
SENTRY_RELEASE: ${{ steps.version.outputs.APP_VERSION }}
|
SENTRY_RELEASE: ${{ inputs.app-version }}
|
||||||
RELEASE_VERSION: ${{ steps.version.outputs.APP_VERSION }}
|
|
||||||
- name: Upload android artifact
|
- name: Upload android artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -157,7 +117,7 @@ jobs:
|
|||||||
package: 'affine_mobile_native'
|
package: 'affine_mobile_native'
|
||||||
no-build: 'true'
|
no-build: 'true'
|
||||||
- name: Testflight
|
- name: Testflight
|
||||||
if: ${{ env.BUILD_TYPE != 'stable' }}
|
if: ${{ env.BUILD_TYPE == 'beta' }}
|
||||||
working-directory: packages/frontend/apps/ios/App
|
working-directory: packages/frontend/apps/ios/App
|
||||||
run: |
|
run: |
|
||||||
echo -n "${{ env.BUILD_PROVISION_PROFILE }}" | base64 --decode -o $PP_PATH
|
echo -n "${{ env.BUILD_PROVISION_PROFILE }}" | base64 --decode -o $PP_PATH
|
||||||
@@ -180,8 +140,9 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
- name: Setup Version
|
- name: Setup Version
|
||||||
id: version
|
|
||||||
uses: ./.github/actions/setup-version
|
uses: ./.github/actions/setup-version
|
||||||
|
with:
|
||||||
|
app-version: ${{ inputs.app-version }}
|
||||||
- name: Download mobile artifact
|
- name: Download mobile artifact
|
||||||
uses: actions/download-artifact@v4
|
uses: actions/download-artifact@v4
|
||||||
with:
|
with:
|
||||||
@@ -214,7 +175,7 @@ jobs:
|
|||||||
- name: Auth gcloud
|
- name: Auth gcloud
|
||||||
id: auth
|
id: auth
|
||||||
uses: google-github-actions/auth@v2
|
uses: google-github-actions/auth@v2
|
||||||
if: ${{ env.BUILD_TARGET == 'distribution' }}
|
if: ${{ env.BUILD_TYPE != 'canary' }}
|
||||||
with:
|
with:
|
||||||
workload_identity_provider: 'projects/${{ secrets.GCP_PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions-helm-deploy'
|
workload_identity_provider: 'projects/${{ secrets.GCP_PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions-helm-deploy'
|
||||||
service_account: '${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}'
|
service_account: '${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }}'
|
||||||
@@ -228,7 +189,7 @@ jobs:
|
|||||||
cache: 'gradle'
|
cache: 'gradle'
|
||||||
- name: Auto increment version code
|
- name: Auto increment version code
|
||||||
id: bump
|
id: bump
|
||||||
if: ${{ env.BUILD_TARGET == 'distribution' }}
|
if: ${{ env.BUILD_TYPE != 'canary' }}
|
||||||
run: yarn affine @affine/playstore-auto-bump bump
|
run: yarn affine @affine/playstore-auto-bump bump
|
||||||
env:
|
env:
|
||||||
GOOGLE_APPLICATION_CREDENTIALS: ${{ steps.auth.outputs.credentials_file_path }}
|
GOOGLE_APPLICATION_CREDENTIALS: ${{ steps.auth.outputs.credentials_file_path }}
|
||||||
@@ -240,14 +201,14 @@ jobs:
|
|||||||
AFFINE_ANDROID_KEYSTORE_PASSWORD: ${{ secrets.AFFINE_ANDROID_KEYSTORE_PASSWORD }}
|
AFFINE_ANDROID_KEYSTORE_PASSWORD: ${{ secrets.AFFINE_ANDROID_KEYSTORE_PASSWORD }}
|
||||||
AFFINE_ANDROID_KEYSTORE_ALIAS_PASSWORD: ${{ secrets.AFFINE_ANDROID_KEYSTORE_ALIAS_PASSWORD }}
|
AFFINE_ANDROID_KEYSTORE_ALIAS_PASSWORD: ${{ secrets.AFFINE_ANDROID_KEYSTORE_ALIAS_PASSWORD }}
|
||||||
AFFINE_ANDROID_SIGN_KEYSTORE: ${{ secrets.AFFINE_ANDROID_SIGN_KEYSTORE }}
|
AFFINE_ANDROID_SIGN_KEYSTORE: ${{ secrets.AFFINE_ANDROID_SIGN_KEYSTORE }}
|
||||||
VERSION_NAME: ${{ steps.version.outputs.APP_VERSION }}
|
VERSION_NAME: ${{ inputs.app-version }}
|
||||||
- name: Upload to Google Play
|
- name: Upload to Google Play
|
||||||
uses: r0adkll/upload-google-play@v1
|
uses: r0adkll/upload-google-play@v1
|
||||||
if: ${{ env.BUILD_TARGET == 'distribution' }}
|
if: ${{ env.BUILD_TYPE != 'canary' }}
|
||||||
with:
|
with:
|
||||||
serviceAccountJson: ${{ steps.auth.outputs.credentials_file_path }}
|
serviceAccountJson: ${{ steps.auth.outputs.credentials_file_path }}
|
||||||
packageName: app.affine.pro
|
packageName: app.affine.pro
|
||||||
releaseName: ${{ steps.version.outputs.APP_VERSION }}
|
releaseName: ${{ inputs.app-version }}
|
||||||
releaseFiles: packages/frontend/apps/android/App/app/build/outputs/bundle/${{ env.BUILD_TYPE }}Release/app-${{ env.BUILD_TYPE }}-release-signed.aab
|
releaseFiles: packages/frontend/apps/android/App/app/build/outputs/bundle/${{ env.BUILD_TYPE }}Release/app-${{ env.BUILD_TYPE }}-release-signed.aab
|
||||||
track: internal
|
track: internal
|
||||||
status: draft
|
status: draft
|
||||||
|
|||||||
128
.github/workflows/release.yml
vendored
Normal file
128
.github/workflows/release.yml
vendored
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v[0-9]+.[0-9]+.[0-9]+-canary.*'
|
||||||
|
|
||||||
|
schedule:
|
||||||
|
- cron: '0 9 * * *'
|
||||||
|
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
web:
|
||||||
|
description: 'Release Web?'
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
desktop:
|
||||||
|
description: 'Release Desktop?'
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
mobile:
|
||||||
|
description: 'Release Mobile?'
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
pull-requests: write
|
||||||
|
actions: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
prepare:
|
||||||
|
name: Prepare
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
outputs:
|
||||||
|
APP_VERSION: ${{ steps.prepare.outputs.APP_VERSION }}
|
||||||
|
GIT_SHORT_HASH: ${{ steps.prepare.outputs.GIT_SHORT_HASH }}
|
||||||
|
BUILD_TYPE: ${{ steps.prepare.outputs.BUILD_TYPE }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Prepare Release
|
||||||
|
id: prepare
|
||||||
|
uses: ./.github/actions/prepare-release
|
||||||
|
|
||||||
|
cloud:
|
||||||
|
name: Release Cloud
|
||||||
|
if: ${{ inputs.web || github.event_name != 'workflow_dispatch' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- prepare
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Release Cloud
|
||||||
|
uses: ./.github/workflows/release-cloud.yml
|
||||||
|
with:
|
||||||
|
build-type: ${{ needs.prepare.outputs.BUILD_TYPE }}
|
||||||
|
app-version: ${{ needs.prepare.outputs.APP_VERSION }}
|
||||||
|
git-short-hash: ${{ needs.prepare.outputs.GIT_SHORT_HASH }}
|
||||||
|
|
||||||
|
release-image:
|
||||||
|
name: Release Image
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- prepare
|
||||||
|
- cloud
|
||||||
|
steps:
|
||||||
|
- uses: trstringer/manual-approval@v1
|
||||||
|
if: ${{ needs.prepare.outputs.BUILD_TYPE == 'stable' }}
|
||||||
|
name: Wait for approval
|
||||||
|
with:
|
||||||
|
secret: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
approvers: forehalo,fengmk2
|
||||||
|
fail-on-denial: true
|
||||||
|
issue-title: Please confirm to release docker image
|
||||||
|
issue-body: |
|
||||||
|
Env: ${{ needs.prepare.outputs.BUILD_TYPE }}
|
||||||
|
Candidate: ghcr.io/toeverything/affine:${{ needs.prepare.outputs.BUILD_TYPE }}-${{ needs.prepare.outputs.GIT_SHORT_HASH }}
|
||||||
|
Tag: ghcr.io/toeverything/affine:${{ needs.prepare.outputs.BUILD_TYPE }}
|
||||||
|
|
||||||
|
> comment with "approve", "approved", "lgtm", "yes" to approve
|
||||||
|
> comment with "deny", "deny", "no" to deny
|
||||||
|
|
||||||
|
- name: Login to GitHub Container Registry
|
||||||
|
uses: docker/login-action@v3
|
||||||
|
with:
|
||||||
|
registry: ghcr.io
|
||||||
|
logout: false
|
||||||
|
username: ${{ github.actor }}
|
||||||
|
password: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
uses: docker/setup-buildx-action@v3
|
||||||
|
- name: Tag Image
|
||||||
|
run: |
|
||||||
|
docker tag ghcr.io/toeverything/affine:${{needs.prepare.outputs.BUILD_TYPE}}-${{needs.prepare.outputs.GIT_SHORT_HASH}} ghcr.io/toeverything/affine:${{needs.prepare.outputs.BUILD_TYPE}}
|
||||||
|
docker push ghcr.io/toeverything/affine:${{needs.prepare.outputs.BUILD_TYPE}}
|
||||||
|
|
||||||
|
desktop:
|
||||||
|
name: Release Desktop
|
||||||
|
if: ${{ inputs.desktop || github.event_name != 'workflow_dispatch' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- prepare
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Release Desktop
|
||||||
|
uses: ./.github/workflows/release-desktop.yml
|
||||||
|
with:
|
||||||
|
build-type: ${{ needs.prepare.outputs.BUILD_TYPE }}
|
||||||
|
app-version: ${{ needs.prepare.outputs.APP_VERSION }}
|
||||||
|
git-short-hash: ${{ needs.prepare.outputs.GIT_SHORT_HASH }}
|
||||||
|
|
||||||
|
mobile:
|
||||||
|
name: Release Mobile
|
||||||
|
if: ${{ inputs.mobile }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- prepare
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Release Mobile
|
||||||
|
uses: ./.github/workflows/release-mobile.yml
|
||||||
|
with:
|
||||||
|
build-type: ${{ needs.prepare.outputs.BUILD_TYPE }}
|
||||||
|
app-version: ${{ needs.prepare.outputs.APP_VERSION }}
|
||||||
|
git-short-hash: ${{ needs.prepare.outputs.GIT_SHORT_HASH }}
|
||||||
Reference in New Issue
Block a user