name: Build and push polytune-http-server image
on:
push:
branches: [ "main" ]
tags: ["http-server-v[0-9]*"]
jobs:
build-and-push-http-server:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v5
- uses: dtolnay/rust-toolchain@e97e2d8cc328f1b50210efc529dca0028893a2d9
with:
toolchain: stable
- run: cargo test --profile debug-release --package polytune --package polytune-server-core --package polytune-http-server
- name: Extract version
if: startsWith(github.ref, 'refs/tags/http-server-v')
id: get-version
run: |
# Strip the http-server-v prefix
RAW_TAG=${{ github.ref_name }}
echo "version=${RAW_TAG#http-server-v}" >> $GITHUB_OUTPUT
- name: Install taplo for extracting http-server version
uses: taiki-e/install-action@44c6d64aa62cd779e873306675c7a58e86d6d532
if: startsWith(github.ref, 'refs/tags/http-server-v')
with:
tool: taplo@0.10.0
- name: Check that crate version matches tag version
if: startsWith(github.ref, 'refs/tags/http-server-v')
run: |
http_server_version=$(taplo get -f crates/polytune-http-server/Cargo.toml 'package.version')
if [[ "$http_server_version" != "${{ steps.get-version.outputs.version }}" ]]; then
echo "::error:: polytune-http-server crate version ${http_server_version} does not match tag version ${{ steps.get-version.outputs.version }}"
exit 1
fi
- name: Log in to GitHub Container Registry
uses: docker/login-action@5e57cd118135c172c3672efd75eb46360885c0ef
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@c299e40c65443455700f0fdfc63efafe5b349051
with:
images: ghcr.io/${{ github.repository }}/polytune-http-server
tags: |
# Tags main branch pushes as 'dev'
type=raw,value=dev,enable={{ is_default_branch }}
# On git tag pushes, push e.g. 1.2.4, 1.2, and 1 versions (if major 0 is zero, skip major only push)
# metadata-action also tags a :latest image automatically when type=semver is enabled
# TODO, there might be an issue with this action when releasing e.g. a patch release 1.2.1 when 2.0.0 is already
# released, as then 1.2.1 would be tagged as :latest which is wrong.
# See https://github.com/docker/metadata-action/issues/407
type=semver,pattern={{major}},value=${{ steps.get-version.outputs.version }},enable=${{ steps.get-version.outputs.version != '' && !startsWith(steps.get-version.outputs.version, '0.') }}
type=semver,pattern={{major.minor}},value=${{ steps.get-version.outputs.version }},enable=${{ steps.get-version.outputs.version != '' }}
type=semver,pattern={{version}},value=${{ steps.get-version.outputs.version }},enable=${{ steps.get-version.outputs.version != '' }}
- name: Build and push http-server image
uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83
with:
context: .
file: ./crates/polytune-http-server/Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}