.github/workflows/ci.yml
name: CI on: - push - pull_request env: PYTHON_VERSION: "3.10" IMAGE_NAME: pydrocsid/crypticbot jobs: codestyle: name: Codestyle (black+isort) if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - name: Set up Python ${{ env.PYTHON_VERSION }} uses: actions/setup-python@v4 with: python-version: ${{ env.PYTHON_VERSION }} - name: Cache Virtual Environment uses: actions/cache@v3 with: path: | ~/.cache/pip ~/.cache/pypoetry key: ${{ runner.os }}-venv-${{ hashFiles('poetry.lock') }} - name: Setup poetry run: | pip install poetry poethepoet poetry install -n --no-root - name: Check code formatting with black and isort run: poe black --diff --check && poe isort --diff --check # mypy:# name: mypy# if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }}# runs-on: ubuntu-latest## steps:# - name: Checkout# uses: actions/checkout@v3# with:# submodules: recursive## - name: Set up Python ${{ env.PYTHON_VERSION }}# uses: actions/setup-python@v4# with:# python-version: ${{ env.PYTHON_VERSION }}## - name: Cache Virtual Environment# uses: actions/cache@v3# with:# path: |# ~/.cache/pip# ~/.cache/pypoetry# key: ${{ runner.os }}-venv-${{ hashFiles('poetry.lock') }}## - name: Setup poetry# run: |# pip install poetry poethepoet# poetry install -n --no-root## - name: Check typing with mypy# run: poe mypy linter: name: Linter (flake8) if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }} runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 with: submodules: recursive - name: Set up Python ${{ env.PYTHON_VERSION }} uses: actions/setup-python@v4 with: python-version: ${{ env.PYTHON_VERSION }} - name: Cache Virtual Environment uses: actions/cache@v3 with: path: | ~/.cache/pip ~/.cache/pypoetry key: ${{ runner.os }}-venv-${{ hashFiles('poetry.lock') }} - name: Setup poetry run: | pip install poetry poethepoet poetry install -n --no-root - name: Check code style with wemake-python-styleguide run: poe flake8 # - name: Lint with wemake-python-styleguide# uses: wemake-services/wemake-python-styleguide@0.16.0# with:# reporter: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository && 'github-pr-review' || 'terminal' }}# env:# GITHUB_TOKEN: ${{ secrets.github_token }} docker_build: name: Docker Build if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository }} runs-on: ubuntu-latest strategy: matrix: platform: - "linux/amd64"# - "linux/arm/v7"# - "linux/arm64/v8"# - "linux/s390x"# - "linux/ppc64le" steps: - name: Checkout uses: actions/checkout@v3 with: persist-credentials: false submodules: recursive fetch-depth: 0 - name: Set up QEMU uses: docker/setup-qemu-action@v2.1.0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2.2.1 - name: Cache Docker layers uses: actions/cache@v3 with: path: /tmp/.buildx-cache key: ${{ runner.os }}-buildx-${{ matrix.platform }}-${{ github.sha }} restore-keys: ${{ runner.os }}-buildx-${{ matrix.platform }}- - name: Create Tag id: tag run: echo ::set-output "name=tag::$(echo ${{ matrix.platform }} | tr / -)" - name: Build uses: docker/build-push-action@v3.2.0 with: push: false load: true tags: ${{ steps.tag.outputs.tag }} platforms: ${{ matrix.platform }} file: Dockerfile context: . cache-from: type=local,src=/tmp/.buildx-cache cache-to: type=local,dest=/tmp/.buildx-cache-new,mode=max - name: Move cache run: | rm -rf /tmp/.buildx-cache mv /tmp/.buildx-cache-new /tmp/.buildx-cache - name: Build Docker Image Archive id: archive env: TAG: ${{ steps.tag.outputs.tag }} run: | set -ex name=${TAG}.tar.gz docker save $TAG | gzip > $name echo ::set-output name=name::$name - name: Upload Docker Image Archive uses: actions/upload-artifact@v3 with: name: ${{ steps.archive.outputs.name }} path: ${{ steps.archive.outputs.name }} retention-days: 1 docker_push: name: Docker Push if: ${{ github.event_name != 'pull_request' && github.actor != 'dependabot[bot]' && github.ref != 'refs/heads/template' }} needs: [ codestyle, linter, docker_build ] concurrency: docker runs-on: ubuntu-latest steps: - name: Download Docker Image Archive uses: actions/download-artifact@v3 - name: Login to GitHub Container Registry uses: docker/login-action@v2.1.0 with: registry: ghcr.io username: ${{ github.repository_owner }} password: ${{ secrets.github_token }} - name: Create and Push Tags run: | set -ex name=$IMAGE_NAME tag=${GITHUB_REF#refs/tags/v} branch=${GITHUB_REF#refs/heads/} if [[ $GITHUB_REF = refs/tags/v* ]]; then tags="v$tag latest" elif [[ $GITHUB_REF = refs/heads/* ]]; then tags="$branch" fi tags="$(echo $tags | tr / -)" echo Tags: $tags platforms="" for file in $(ls */*); do echo Loading $file platform=$(docker load -qi $file | cut -d' ' -f3) platform=${platform%:*} platforms="$platforms $platform" for tag in $tags; do tag=ghcr.io/$name:$tag-$platform docker tag $platform $tag docker push $tag done done for tag in $tags; do cmd="docker manifest create ghcr.io/$name:$tag" for platform in $platforms; do cmd="$cmd --amend ghcr.io/$name:$tag-$platform" done $cmd docker manifest push ghcr.io/$name:$tag done - name: Clear if: always() run: rm -f ${HOME}/.docker/config.json # docker_deploy:# name: Docker Deploy# if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/develop' }}# needs: [ docker_push ]# environment: server-test# runs-on: ubuntu-latest # steps:# - name: Deploy# env:# CREDENTIALS: ${{ secrets.UPDATE_CREDENTIALS }}# URL: ${{ secrets.UPDATE_URL }}# run: curl -u $CREDENTIALS $URL