name: Docker on: push: branches: - master tags: - '*' pull_request: permissions: contents: read env: IMAGE: snegov/seafile-client jobs: # Application failures must be distinguishable from packaging failures, so # the unit tests do not depend on the image build. unit-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.11' cache: pip - name: Install dependencies run: pip install -r requirements-dev.txt - name: Run unit tests run: pytest -q test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Validate compose example run: docker compose --file compose.example.yaml config --quiet - name: Build image uses: docker/build-push-action@v7 with: context: . push: false load: true tags: ${{ env.IMAGE }}:ci push: needs: [unit-test, test] runs-on: ubuntu-latest if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') steps: - uses: actions/checkout@v4 # Every tag of a release must resolve to one manifest digest, so the # image is built once and all tags are attached to that single build. - name: Collect tags and labels id: meta uses: docker/metadata-action@v5 with: images: ${{ env.IMAGE }} tags: | type=ref,event=tag flavor: | latest=true - name: Log in to Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} - name: Build and push uses: docker/build-push-action@v7 with: context: . push: true tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }}