name: Lint, Test, Tag, Build and Deploy on: push: branches: - dev - master - renovate/** paths-ignore: - "**/.github/**" - "**/.gitignore" - "**/.vscode/**" - "**/README.md" - "**/CHANGELOG.md" - "**/docs/**" workflow_dispatch: pull_request: branches: - dev - master env: REGISTRY: ghcr.io IMAGE_NAME: ${{ github.repository }} jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: psf/black@stable with: options: "-l 100 --exclude '/.venv/|alembic/|/__init__.py'" - uses: creyD/autoflake_action@master with: no_commit: True options: --in-place --remove-all-unused-imports -r --exclude **/__init__.py,**/db/models.py, - uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Adjusted files for isort & autopep test: runs-on: ubuntu-latest needs: lint env: POSTGRES_USER: postgres POSTGRES_PASSWORD: root POSTGRES_DB: fastapi POSTGRES_HOST: 127.0.0.1 services: status_db: image: postgres:latest ports: - "5432:5432" env: POSTGRES_USER: postgres POSTGRES_PASSWORD: root POSTGRES_DB: fastapi steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: 3.12 cache: 'pip' # caching pip dependencies - name: Setup tests (install dependencies, run migrations) run: | python -m pip install --upgrade pip pip install -r requirements.txt alembic upgrade head - name: Run tests run: pytest tag: needs: test runs-on: ubuntu-latest permissions: contents: write # for the tags outputs: version: ${{ steps.git_version.outputs.version }} steps: - uses: actions/checkout@v4 with: fetch-tags: true ref: ${{ github.ref }} fetch-depth: 0 - name: setup git run: | git config --local user.email "15138480+creyD@users.noreply.github.com" git config --local user.name "creyD" - name: Git Version uses: codacy/git-version@2.8.0 id: git_version with: minor-identifier: "feat:" major-identifier: "breaking:" - name: Create Tag run: git tag ${{ steps.git_version.outputs.version }} - name: Push tag run: git push origin ${{ steps.git_version.outputs.version }} build_and_push: runs-on: ubuntu-latest permissions: write-all needs: tag steps: - name: Checkout repository uses: actions/checkout@v4 - name: Log in to the Container registry uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}-${{ github.ref_name }} tags: latest - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . file: ./Dockerfile build-args: | VERSION=${{ needs.tag.outputs.version }}-${{ github.ref_name }} push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}