diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5918f33 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,133 @@ +name: Lint, Test, Tag, Build and Deploy + +on: + push: + branches: + - dev + - master + paths-ignore: + - "**/.github/**" + - "**/.gitignore" + - "**/.vscode/**" + - "**/README.md" + - "**/CHANGELOG.md" + - "**/docs/**" + workflow_dispatch: + +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 }} diff --git a/Dockerfile b/Dockerfile index 2c007ac..2098b7c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,6 +19,7 @@ RUN rm -rf /wheels # Python setup ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 + ARG VERSION=unknown ENV VERSION=${VERSION}