GladysProject/Gladys

View on GitHub
.github/workflows/docker-pr-build.yml

Summary

Maintainability
Test Coverage
name: Pull request tests
run-name: Pull request tests ${{ github.head_ref }}

on:
  pull_request:
    branches: [master]
    types: [opened, synchronize, reopened, ready_for_review]

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref }}
  cancel-in-progress: true

jobs:
  test-front:
    name: Front test
    runs-on: ubuntu-22.04
    steps:
      - name: ⬇️ Checkout Gladys code
        uses: actions/checkout@v3
      - name: 💽 Setup nodejs
        uses: actions/setup-node@v3
        with:
          node-version-file: 'front/package.json'
          cache: 'npm'
          cache-dependency-path: '**/package-lock.json'
      - name: 📦 Install Global NPM Packages
        run: |
          sudo npm install typescript node-gyp npm@latest -g
      - name: 📦 Install NPM front packages
        working-directory: ./front
        run: |
          npm ci
      - name: 🧐 Prettier check
        working-directory: ./front
        run: |
          npm run prettier-check
      - name: 👕 ESlint
        working-directory: ./front
        run: |
          npm run eslint
      - name: 🌐 Integration comparison
        working-directory: ./front
        run: |
          npm run compare-translations
  test-server:
    name: Server test
    runs-on: ubuntu-22.04
    steps:
      - name: ⬇️ Checkout Gladys code
        uses: actions/checkout@v3
        with:
          fetch-depth: 2
      - name: 💽 Setup nodejs
        uses: actions/setup-node@v3
        with:
          node-version-file: 'server/package.json'
          cache: 'npm'
          cache-dependency-path: '**/package-lock.json'
      - name: 💽 Install System Dependencies
        run: |
          sudo apt update
          sudo apt-get install -y libudev-dev sqlite3 openssl python-is-python3
      - name: 📦 Install Global NPM Packages
        run: |
          sudo npm install typescript node-gyp npm@latest -g
      - name: 📦 Install NPM server packages
        working-directory: ./server
        run: |
          npm ci
      - name: 🧐 Prettier check
        working-directory: ./server
        run: |
          npm run prettier-check
      - name: 👕 ESlint
        working-directory: ./server
        run: |
          npm run eslint
      - name: ✅ Test with coverage
        working-directory: ./server
        run: |
          npm run coverage
      - name: 🔐 Dependencies security audit
        working-directory: ./server
        run: npm audit --production --audit-level=critical || true
      - name: 📄 Codecov report upload
        uses: codecov/codecov-action@v4
        with:
          fail_ci_if_error: true
          token: 08cd0d46-0291-42ed-b352-50924cb6cca6

          ## Yes, we are storing the CODECOV token in plain text here and not as a secret.
          ## This is because Codecov report upload keeps failing because of a Github Action rate limit
          ## And as we are an open source project, we need forks to be able to upload reports as well, so
          ## we followed the recommandatiom from CodeCov:
          ## https://community.codecov.com/t/upload-issues-unable-to-locate-build-via-github-actions-api/3954
          ## It's not that dangerous to do it, and it's the best tradeoff we could find
  cypress-run:
    name: Cypress run
    runs-on: ubuntu-22.04
    steps:
      - name: ⬇️ Checkout code
        uses: actions/checkout@v3
      - name: 💽 Setup nodejs
        uses: actions/setup-node@v3
        with:
          node-version-file: 'front/package.json'
          cache: 'npm'
          cache-dependency-path: '**/package-lock.json'
      - name: 💽 Install System Dependencies
        run: |
          sudo apt update
          sudo apt-get install -y libudev-dev sqlite3 openssl python-is-python3
      - name: 📦 Install NPM packages
        run: |
          npm ci && npm run install-server:dev
      - name: ✅ Cypress run
        uses: cypress-io/github-action@v3.1.0
        with:
          install: false
          start: npm run start:cypress
          wait-on: 'http://localhost:1444'
          config-file: ./front/cypress/cypress.config.js
          project: ./front
          command: npm run cypress:run
  build-front:
    if: github.event.pull_request.draft == false
    name: Front build
    runs-on: ubuntu-22.04
    steps:
      - name: ⬇️ Checkout code
        uses: actions/checkout@v3
      - name: 💽 Setup nodejs
        uses: actions/setup-node@v3
        with:
          node-version-file: 'front/package.json'
          cache: 'npm'
          cache-dependency-path: '**/package-lock.json'
      - name: 📦 Install NPM front packages
        working-directory: ./front
        run: |
          npm ci
      - name: 🏗️ Build front
        working-directory: ./front
        run: |
          npm run build-with-stats
      - name: ↗️ Upload webpack stats artifact
        uses: relative-ci/agent-upload-artifact-action@v1
        with:
          webpackStatsFile: ./front/stats.json
      - name: ↗️ Upload build artifact
        uses: actions/upload-artifact@v3
        with:
          name: static
          path: front/build
  docker:
    if: github.event.pull_request.draft == false
    needs: build-front
    name: Docker magic !
    runs-on: ubuntu-22.04
    steps:
      - name: ⬇️ Checkout code
        uses: actions/checkout@v3
      - name: 💽 Set up QEMU
        uses: docker/setup-qemu-action@v2
      - name: 🐳 Set up Docker Buildx
        id: buildx
        uses: docker/setup-buildx-action@v2
        with:
          version: latest
      - name: ↙️ Download build artifact
        uses: actions/download-artifact@v3
        with:
          name: static
          path: static
      - name: 🐳 Build AMD64 images
        uses: docker/build-push-action@v3
        with:
          context: .
          file: ./docker/Dockerfile.buildx
          platforms: linux/amd64
          push: false