Skip to content

Deploy API to Caprover #12

Deploy API to Caprover

Deploy API to Caprover #12

Workflow file for this run

name: Deploy API to Caprover
# This workflow builds Docker images for each app, then pushes the images to GitHub Container Registry
# After all images are built and pushed successfully, it deploys each image to Caprover (staging)
on:
workflow_run:
workflows: ['Lint']
branches: [main]
types:
- completed
# Allow this workflow to be triggered manually (ex: in GitHub UI)
workflow_dispatch:
jobs:
build:
name: Build
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'success' }}
environment: production
permissions:
contents: read
packages: write
outputs:
# output the image tag that was built and pushed so we can deploy this image tag in the deploy job
image-tag: ${{ steps.set-image-tag.outputs.image-tag }}
steps:
#
# ------------------ Setup -----------------------
#
# checkout GitHub repository
- name: Checkout
uses: actions/checkout@v4
# If merge event triggered this, get the name of the branch
- name: Get branch name (merge)
if: github.event_name != 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_REF#refs/heads/} | tr / -)" >> $GITHUB_ENV
# If PR create event triggered this, get the name of the branch
- name: Get branch name (pull request)
if: github.event_name == 'pull_request'
shell: bash
run: echo "BRANCH_NAME=$(echo ${GITHUB_HEAD_REF} | tr / -)" >> $GITHUB_ENV
# install QEMU, a utility for building docker images
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}
# This creates docker tags
# https://github.com/docker/build-push-action/blob/master/docs/advanced/tags-labels.md
- name: Docker meta
id: docker-meta
uses: docker/metadata-action@v4
with:
# list of Docker images to use as base name for tags
images: |
ghcr.io/${{ github.repository }}
# generate Docker tags based on the following events/attributes
tags: |
type=sha,prefix=${{ env.BRANCH_NAME }}-,priority=1000
type=semver,priority=900,pattern={{version}},prefix=staging-
- name: 'Build and push image'
uses: docker/build-push-action@v3
with:
file: 'Dockerfile'
context: '{{defaultContext}}:apps/api'
platforms: linux/amd64
push: true
tags: ${{ steps.docker-meta.outputs.tags }}
labels: ${{ steps.docker-meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
- id: set-image-tag
run: echo "image-tag=${{ fromJson(steps.docker-meta.outputs.json).tags[0] }}" >> $GITHUB_OUTPUT
deploy:
name: Deploy Production
runs-on: ubuntu-latest
needs: [build]
environment: production
concurrency: production
env:
CAPROVER_URL: ${{ secrets.CAPROVER_URL }}
CAPROVER_APP_TOKEN: ${{ secrets.CAPROVER_APP_TOKEN }}
CAPROVER_APP_NAME: ${{ secrets.CAPROVER_APP_NAME }}
strategy:
matrix:
include:
- app: ${{ github.event.repository.name }} # name of the app in Caprover
token-key: env.CAPROVER_APP_TOKEN # key used to get CAPROVER_APP_TOKEN from env
image: ${{ needs.build.outputs.image-tag }} # image to deploy
steps:
- name: 'Deploy ${{ matrix.app }}'
uses: caprover/deploy-from-github@main
with:
server: '${{ env.CAPROVER_URL }}'
app: '${{ env.CAPROVER_APP_NAME }}'
token: '${{ env.CAPROVER_APP_TOKEN }}'
image: '${{ matrix.image }}' # optional