name: Docker # This workflow uses actions that are not certified by GitHub. # They are provided by a third-party and are governed by # separate terms of service, privacy policy, and support # documentation. on: schedule: - cron: '30 20 * * Sun' push: branches: ["*"] # Publish semver tags as releases. tags: ["v*.*.*"] pull_request: branches: ["{{is_default_branch}}"] release: types: [published] env: # Use docker.io for Docker Hub if empty REGISTRY: ghcr.io # github.repository as / IMAGE_NAME: ${{ github.repository }} jobs: build: runs-on: ubuntu-latest strategy: fail-fast: false matrix: include: - dockerfile: ./Dockerfile image: ghcr.io/${{ github.repository }} flavour: "" - dockerfile: ./Dockerfile.alpine image: ghcr.io/${{ github.repository }} flavour: "-alpine" permissions: contents: read packages: write # This is used to complete the identity challenge # with sigstore/fulcio when running outside of PRs. id-token: write steps: - name: Checkout repository uses: actions/checkout@v6 # Fetch the ipinfo database file using curl if API key is defined - name: Fetch DB from ipinfo.io # IPINFO_APIKEY is set in https://github.com/librespeed/speedtest/settings/secrets/actions run: | if [ -z "${{ secrets.IPINFO_APIKEY }}" ]; then echo "Warning: IPINFO_APIKEY is not defined." else curl -L https://ipinfo.io/data/free/country_asn.mmdb?token=${{ secrets.IPINFO_APIKEY }} -o backend/country_asn.mmdb fi # Set up QEMU for multi-arch builds - name: Set up QEMU uses: docker/setup-qemu-action@v3 # Set up BuildKit Docker container builder to be able to build # multi-platform images and export cache # https://github.com/docker/setup-buildx-action - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # Login against a Docker registry except on PR # https://github.com/docker/login-action - name: Log into registry ${{ env.REGISTRY }} if: github.event_name != 'pull_request' uses: docker/login-action@v3 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} # Extract metadata (tags, labels) for Docker # https://github.com/docker/metadata-action - name: Extract Docker metadata id: meta uses: docker/metadata-action@v5 with: images: ${{ matrix.image }} tags: | type=ref,event=branch,suffix=${{ matrix.flavour }} type=ref,event=pr,suffix=${{ matrix.flavour }} # set latest tag for default branch type=raw,value=latest${{ matrix.flavour }},enable={{is_default_branch}} type=semver,pattern={{version}}${{ matrix.flavour }} type=semver,pattern={{major}}${{ matrix.flavour }} type=semver,pattern={{major}}.{{minor}}${{ matrix.flavour }} type=semver,pattern={{major}}.{{minor}}.{{patch}}${{ matrix.flavour }} # Build and push Docker image with Buildx (don't push on PR) # https://github.com/docker/build-push-action - name: Build and push Docker image id: build-and-push uses: docker/build-push-action@v6 with: context: . file: ${{ matrix.dockerfile }} platforms: linux/amd64,linux/arm64 push: ${{ github.event_name != 'pull_request' }} tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max