Skip to content

Deploy (Production) #125

Deploy (Production)

Deploy (Production) #125

Workflow file for this run

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 }}