name: ๐Ÿš€ Deploy on: push: branches: - main pull_request: {} permissions: actions: write contents: read jobs: test: name: ๐Ÿงช Test runs-on: ubuntu-latest services: postgres: image: postgres:15 env: POSTGRES_USER: test POSTGRES_PASSWORD: test POSTGRES_DB: brackt_test options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 ports: - 5432:5432 steps: - name: ๐Ÿ›‘ Cancel Previous Runs uses: styfle/cancel-workflow-action@0.12.1 - name: โฌ‡๏ธ Checkout repo uses: actions/checkout@v4 - name: โŽ” Setup node uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - name: ๐Ÿ“ฅ Install dependencies run: npm ci - name: ๐Ÿงช Run unit tests run: npm run test:run env: DATABASE_URL: postgresql://test:test@localhost:5432/brackt_test NODE_OPTIONS: --max-old-space-size=4096 typecheck: name: สฆ TypeScript runs-on: ubuntu-latest steps: - name: ๐Ÿ›‘ Cancel Previous Runs uses: styfle/cancel-workflow-action@0.12.1 - name: โฌ‡๏ธ Checkout repo uses: actions/checkout@v4 - name: โŽ” Setup node uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - name: ๐Ÿ“ฅ Install dependencies run: npm ci - name: ๐Ÿ”Ž Type check run: npm run typecheck lint: name: ๐Ÿ” Lint runs-on: ubuntu-latest steps: - name: ๐Ÿ›‘ Cancel Previous Runs uses: styfle/cancel-workflow-action@0.12.1 - name: โฌ‡๏ธ Checkout repo uses: actions/checkout@v4 - name: โŽ” Setup node uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' - name: ๐Ÿ“ฅ Install dependencies run: npm ci - name: ๐Ÿ” Lint (oxlint) run: npm run lint build: name: ๐Ÿณ Build needs: [test, typecheck, lint] # only build/deploy main branch on pushes if: ${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} runs-on: ubuntu-latest steps: - name: ๐Ÿ›‘ Cancel Previous Runs uses: styfle/cancel-workflow-action@0.12.1 - name: โฌ‡๏ธ Checkout repo uses: actions/checkout@v4 - name: ๐Ÿณ Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Setup cache - name: โšก๏ธ Cache Docker layers uses: actions/cache@v4 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ github.sha }} restore-keys: | ${{ runner.os }}-buildx- - name: ๐Ÿ”“ Login to Container Registry uses: docker/login-action@v3 with: registry: ${{ vars.CONTAINER_REGISTRY }} username: ${{ secrets.REGISTRY_USERNAME }} password: ${{ secrets.REGISTRY_PASSWORD }} - name: ๐Ÿ—„๏ธ Build and Push to Container Registry uses: docker/build-push-action@v5 with: context: . push: true tags: ${{ vars.CONTAINER_REGISTRY }}/brackt:latest cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max build-args: | DATABASE_URL=${{ secrets.PROD_DATABASE_URL }} # This ugly bit is necessary if you don't want your cache to grow forever # till it hits GitHub's limit of 10GB. # Temp fix # https://github.com/docker/build-push-action/issues/252 # https://github.com/moby/buildkit/issues/1896 - name: ๐Ÿšš Move cache run: | rm -rf /tmp/.buildx-cache mv /tmp/.buildx-cache-new /tmp/.buildx-cache deploy: name: ๐Ÿš€ Deploy runs-on: ubuntu-latest needs: [build] # only deploy main/dev branch on pushes if: ${{ github.ref == 'refs/heads/main' && github.event_name == 'push' }} steps: - name: ๐Ÿš€ Deploy app to server uses: appleboy/ssh-action@v1.0.3 env: REGISTRY_USERNAME: ${{ secrets.REGISTRY_USERNAME }} REGISTRY_PASSWORD: ${{ secrets.REGISTRY_PASSWORD }} CONTAINER_REGISTRY: ${{ vars.CONTAINER_REGISTRY }} with: host: ${{ secrets.DEPLOY_HOST }} port: ${{ secrets.DEPLOY_PORT }} username: ${{ secrets.DEPLOY_USER }} key: ${{ secrets.DEPLOY_KEY }} envs: REGISTRY_USERNAME,REGISTRY_PASSWORD,CONTAINER_REGISTRY script: | docker login $CONTAINER_REGISTRY -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD cd brackt docker compose pull docker compose up -d