name: CI on: push: branches: [main] pull_request: jobs: repo-hygiene: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Verify .env.example exists run: test -f .env.example lint: runs-on: ubuntu-latest needs: [repo-hygiene] steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.12" - uses: astral-sh/setup-uv@v4 - name: Install dependencies run: uv sync --frozen --group dev - name: Ruff check run: uv run ruff check backend/ - name: Ruff format check run: uv run ruff format --check backend/ - name: Mypy run: uv run mypy test: runs-on: ubuntu-latest needs: [lint] env: HANDIN_ADMIN_TOKEN: ci-test-token HANDIN_DATA_DIR: /tmp/handin-test-data steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.12" - uses: astral-sh/setup-uv@v4 - name: Install dependencies run: uv sync --frozen --group dev - name: Run tests run: uv run pytest frontend-quality: runs-on: ubuntu-latest needs: [repo-hygiene] defaults: run: working-directory: frontend steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: "20" - name: Install dependencies run: npm ci - name: Typecheck run: npx vue-tsc --noEmit - name: Build run: npm run build docker-publish: runs-on: ubuntu-latest needs: [test, frontend-quality] if: github.event_name == 'push' && github.ref == 'refs/heads/main' permissions: contents: read steps: - uses: actions/checkout@v4 - uses: docker/setup-qemu-action@v3 - uses: docker/setup-buildx-action@v3 - uses: docker/login-action@v3 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - id: meta uses: docker/metadata-action@v5 with: images: justinzeus/handin tags: | type=raw,value=latest type=sha,format=short,prefix=sha- - uses: docker/build-push-action@v6 with: context: . file: ./Dockerfile target: prod push: true platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max