Deploy (Production) #125
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: 'Deploy (Production)' | |
on: | |
workflow_dispatch: | |
inputs: | |
deploy-backend: | |
type: boolean | |
description: Deploy backend to Railway | |
deploy-frontend: | |
type: boolean | |
description: Deploy frontend | |
deploy-website: | |
type: boolean | |
description: Deploy website | |
concurrency: | |
group: deploy-${{ github.head_ref }} | |
cancel-in-progress: true | |
jobs: | |
install: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout PR | |
uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
lint: | |
name: Lint | |
needs: ['install'] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout PR | |
uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: '[API] Generate Prisma Migration' | |
run: | | |
pnpm --filter=@codeimage/api exec prisma generate | |
pnpm --filter=@codeimage/prisma-models build | |
- name: Lint | |
run: pnpm lint | |
build-packages: | |
name: Build packages/** | |
needs: ['install'] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: '[API] Generate Prisma Migration' | |
run: | | |
pnpm --filter=@codeimage/api exec prisma generate | |
pnpm --filter=@codeimage/prisma-models build | |
- name: 'Build packages' | |
run: | | |
pnpm libs:build | |
- name: Cache packages | |
uses: actions/cache@v3 | |
with: | |
path: packages | |
key: packages-dist-${{ github.run_id }}-${{ github.run_number }} | |
build-api: | |
name: 'Build @codeimage/api' | |
needs: ['install'] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: '[API] Generate Prisma Migration' | |
run: | | |
pnpm --filter=@codeimage/api exec prisma generate | |
pnpm --filter=@codeimage/prisma-models build | |
- name: Build | |
run: | | |
pnpm --filter=@codeimage/api build:ts | |
pnpm prepare:api:deploy | |
- name: Cache build | |
uses: actions/cache@v3 | |
with: | |
path: | | |
dist/api-bundle/** | |
key: rest-api-bundle-${{ github.run_id }}-${{ github.run_number }} | |
restore-keys: rest-api-bundle-${{ github.run_id }}-${{ github.run_number }} | |
test-api: | |
name: Api test | |
needs: [install] | |
runs-on: ubuntu-latest | |
services: | |
postgres: | |
image: postgres:13-alpine | |
env: | |
POSTGRES_USER: postgres | |
POSTGRES_PASSWORD: postgres | |
POSTGRES_DB: test_codeimage | |
options: >- | |
--health-cmd pg_isready | |
--health-interval 10s | |
--health-timeout 5s | |
--health-retries 5 | |
ports: | |
- 5432:5432 | |
env: | |
DATABASE_URL: postgresql://postgres:postgres@localhost:5432/test_codeimage | |
DOMAIN_AUTH0: https://example.it | |
CLIENT_ID_AUTH0: <client-id-auth> | |
CLIENT_SECRET_AUTH0: <client-secret-auth> | |
AUTH0_CLIENT_CLAIMS: https://example.com | |
AUDIENCE_AUTH0: https://example.com | |
GRANT_TYPE_AUTH0: client_credentials | |
MOCK_AUTH: false | |
MOCK_AUTH_EMAIL: dev@example.it | |
ALLOWED_ORIGINS: '*' | |
steps: | |
- uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: 'Run prisma DB migrations' | |
run: | | |
cd apps/api | |
pnpm exec prisma migrate deploy | |
pnpm exec prisma generate | |
pnpm --filter=@codeimage/prisma-models build | |
- name: Test (unit) | |
run: pnpm --filter=@codeimage/api test:unit | |
- name: Test (integration) | |
run: pnpm --filter=@codeimage/api test:integration | |
typecheck-packages: | |
name: Type-checking packages/** | |
needs: ['install', 'build-packages'] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: Restore packages | |
uses: actions/cache@v3 | |
with: | |
path: packages | |
key: packages-dist-${{ github.run_id }}-${{ github.run_number }} | |
- name: Typecheck packages | |
run: | | |
pnpm --filter='./packages/**' --recursive typecheck:ci | |
- name: Typecheck apps | |
run: | | |
pnpm --filter='@codeimage/api' typecheck:ci | |
pnpm --filter='@codeimage/app' typecheck | |
deploy-highlight-package: | |
name: Deploy @codeimage/highlight app | |
environment: Production | |
needs: ['install', 'lint', 'build-packages'] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: Restore packages | |
uses: actions/cache@v3 | |
with: | |
path: packages | |
key: packages-dist-${{ github.run_id }}-${{ github.run_number }} | |
- name: Build @codeimage/highlight/dev | |
env: | |
ENABLE_VERCEL_BUILD: true | |
run: | | |
pnpm --filter=@codeimage/highlight build:dev | |
- uses: amondnet/vercel-action@v25.2.0 | |
with: | |
vercel-token: ${{ secrets.VERCEL_TOKEN }} | |
github-token: ${{ secrets.GITHUB_TOKEN }} | |
working-directory: packages/highlight/dev | |
vercel-org-id: ${{ secrets.VERCEL_ORG_ID }} | |
vercel-project-id: ${{ secrets.VERCEL_HIGHLIGHT_DEV_PROJECT_ID }} | |
vercel-args: '--prebuilt --prod' | |
deploy-api: | |
name: Build and Deploy Api | |
environment: Production | |
needs: [install, lint, typecheck-packages, test-api, build-api] | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: Restore packages | |
uses: actions/cache@v3 | |
with: | |
path: packages | |
key: packages-dist-${{ github.run_id }}-${{ github.run_number }} | |
- name: Restore api build | |
uses: actions/cache@v3 | |
with: | |
path: | | |
dist/api-bundle/** | |
key: rest-api-bundle-${{ github.run_id }}-${{ github.run_number }} | |
- name: Run prod migrations | |
if: ${{ github.event.inputs.deploy-backend == 'true' }} | |
run: | | |
pnpm --filter=@codeimage/api exec prisma migrate deploy | |
env: | |
DATABASE_URL: ${{ secrets.NEXT_DATABASE_URL }} | |
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }} | |
- name: Deploy to Railway | |
run: | | |
find -type f -name '.gitignore' -delete | |
pnpm railway link --environment production $RAILWAY_API_PROJECT_ID | |
cd dist/api-bundle | |
pnpm railway up -s codeimage | |
env: | |
RAILWAY_TOKEN: ${{ secrets.RAILWAY_TOKEN }} | |
RAILWAY_API_PROJECT_ID: ${{ secrets.RAILWAY_API_PROJECT_ID }} | |
deploy-app: | |
name: Deploy @codeimage/app | |
environment: Production | |
needs: [install, lint, typecheck-packages, build-packages, deploy-api] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout PR | |
uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: Restore packages | |
uses: actions/cache@v3 | |
with: | |
path: packages | |
key: packages-dist-${{ github.run_id }}-${{ github.run_number }} | |
- name: Build @codeimage/app | |
env: | |
VITE_PUBLIC_AUTH0_DOMAIN: ${{ secrets.VITE_PUBLIC_AUTH0_DOMAIN }} | |
VITE_PUBLIC_AUTH0_CLIENT_ID: ${{ secrets.VITE_PUBLIC_AUTH0_CLIENT_ID }} | |
VITE_PUBLIC_AUTH0_AUDIENCE: ${{ secrets.VITE_PUBLIC_AUTH0_AUDIENCE }} | |
VITE_API_BASE_URL: ${{ secrets.VITE_API_BASE_URL }} | |
VITE_ENABLE_MSW: ${{ env.IS_NEXT_BRANCH == 'false' }} | |
VITE_PRESET_LIMIT: 10 | |
VITE_PRESET_LIMIT_GUEST: 5 | |
UMAMI_SCRIPT_SRC: ${{ secrets.UMAMI_SCRIPT_SRC }} | |
UMAMI_WEBSITE_ID: ${{ secrets.UMAMI_WEBSITE_ID }} | |
ENABLE_VERCEL_BUILD: true | |
run: | | |
pnpm --filter=@codeimage/app build | |
- uses: amondnet/vercel-action@v25.2.0 | |
if: ${{ github.event.inputs.deploy-frontend == 'true' }} | |
name: Deploy | |
with: | |
vercel-token: ${{ secrets.VERCEL_TOKEN }} # Required | |
github-token: ${{ secrets.GITHUB_TOKEN }} #Optional | |
vercel-args: '--prebuilt --prod' #Optional | |
working-directory: apps/codeimage | |
vercel-org-id: ${{ secrets.VERCEL_ORG_ID}} #Required | |
vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }} #Required | |
alias-domains: | #Optional | |
app.codeimage.dev | |
deploy-website: | |
if: ${{ github.event.inputs.deploy-website == 'true' }} | |
name: Deploy @codeimage/website | |
environment: Production | |
needs: [install, lint, typecheck-packages, build-packages] | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout PR | |
uses: actions/checkout@v3 | |
# with: | |
# submodules: 'true' | |
- name: Use Node.js ${{ matrix.node-version }} | |
uses: actions/setup-node@v3 | |
with: | |
node-version: ${{ matrix.node-version }} | |
- name: 📥 Monorepo install | |
uses: ./.github/actions/pnpm-install | |
- name: Restore packages | |
uses: actions/cache@v3 | |
with: | |
path: packages | |
key: packages-dist-${{ github.run_id }}-${{ github.run_number }} | |
- name: Build | |
env: | |
VITE_UMAMI_SCRIPT_SRC: ${{ secrets.UMAMI_LANDING_SCRIPT_SRC }} | |
VITE_UMAMI_WEBSITE_ID: ${{ secrets.UMAMI_LANDING_WEBSITE_ID }} | |
VITE_PUBLIC_AUTH0_DOMAIN: ${{ secrets.VITE_PUBLIC_AUTH0_DOMAIN }} | |
VITE_PUBLIC_AUTH0_CLIENT_ID: ${{ secrets.VITE_PUBLIC_AUTH0_CLIENT_ID }} | |
VITE_PUBLIC_AUTH0_AUDIENCE: ${{ secrets.VITE_PUBLIC_AUTH0_AUDIENCE }} | |
run: | | |
pnpm --filter=@codeimage/website build | |
- name: Publish on Netlify | |
run: | | |
pnpm i -g netlify-cli@16.3.3 | |
cd apps/website | |
pnpm exec netlify link | |
pnpm exec netlify deploy --prod --dir=dist/public | |
env: | |
NETLIFY_SITE_ID: ${{ secrets.WEBSITE_NETLIFY_SITE_ID }} | |
NETLIFY_AUTH_TOKEN: ${{ secrets.WEBSITE_NETLIFY_AUTH_TOKEN }} |