name: Build and Push Docker Image on: push: branches: - main workflow_dispatch: schedule: - cron: '0 * * * *' # Every hour jobs: check-version: runs-on: linux-amd64 container: image: git.nicola.sh/public/alpine:latest outputs: should_build: ${{ steps.compare.outputs.should_build }} latest_version: ${{ steps.get_version.outputs.version }} steps: - name: Install dependencies run: | apk add --no-cache curl jq bash - name: Get latest Nicotine+ version from PyPI id: get_version run: | VERSION=$(curl -s https://pypi.org/pypi/nicotine-plus/json | jq -r '.info.version') echo "version=$VERSION" >> $GITHUB_OUTPUT echo "Latest Nicotine+ version: $VERSION" - name: Get current built version id: current_version run: | CURRENT=$(curl -s https://git.nicola.sh/api/v1/repos/public/nicotine-less/releases/latest 2>/dev/null | jq -r '.tag_name // "none"') echo "current=$CURRENT" >> $GITHUB_OUTPUT echo "Current built version: $CURRENT" - name: Compare versions id: compare run: | if [ "${{ steps.get_version.outputs.version }}" != "${{ steps.current_version.outputs.current }}" ]; then echo "should_build=true" >> $GITHUB_OUTPUT echo "New version detected, will build" else echo "should_build=false" >> $GITHUB_OUTPUT echo "Already up to date" fi build: needs: check-version if: needs.check-version.outputs.should_build == 'true' || github.event_name == 'push' || github.event_name == 'workflow_dispatch' strategy: matrix: include: - platform: linux/amd64 runner: linux-amd64 # Temporarily disabled until ARM64 runner is configured # - platform: linux/arm64 # runner: linux-arm64 runs-on: ${{ matrix.runner }} container: image: git.nicola.sh/public/alpine:latest options: --privileged steps: - name: Install dependencies run: | apk add --no-cache git docker docker-cli-buildx - name: Checkout code run: | rm -rf nicotine-less git clone --depth 1 https://git.nicola.sh/public/nicotine-less.git nicotine-less cd nicotine-less - name: Set up Docker Buildx run: | docker buildx create --use --name builder --driver docker-container || docker buildx use builder - name: Login to Gitea Container Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login git.nicola.sh -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Build and push run: | cd nicotine-less PLATFORM_TAG=$(echo "${{ matrix.platform }}" | tr '/' '-') docker buildx build \ --platform ${{ matrix.platform }} \ --tag git.nicola.sh/public/nicotine-less:latest-${PLATFORM_TAG} \ --tag git.nicola.sh/public/nicotine-less:${{ needs.check-version.outputs.latest_version }}-${PLATFORM_TAG} \ --cache-from type=registry,ref=git.nicola.sh/public/nicotine-less:buildcache-${PLATFORM_TAG} \ --cache-to type=registry,ref=git.nicola.sh/public/nicotine-less:buildcache-${PLATFORM_TAG},mode=max \ --push \ . create-manifest: needs: [check-version, build] runs-on: linux-amd64 container: image: git.nicola.sh/public/alpine:latest steps: - name: Install dependencies run: | apk add --no-cache docker docker-cli-buildx curl bash - name: Login to Gitea Container Registry run: | echo "${{ secrets.REGISTRY_PASSWORD }}" | docker login git.nicola.sh -u "${{ secrets.REGISTRY_USERNAME }}" --password-stdin - name: Create and push manifest (AMD64 only for now) run: | docker buildx imagetools create \ -t git.nicola.sh/public/nicotine-less:latest \ -t git.nicola.sh/public/nicotine-less:${{ needs.check-version.outputs.latest_version }} \ git.nicola.sh/public/nicotine-less:latest-linux-amd64 # TODO: Add ARM64 when runner is configured: # git.nicola.sh/public/nicotine-less:latest-linux-arm64 - name: Create release if: needs.check-version.outputs.should_build == 'true' run: | curl -X POST "https://git.nicola.sh/api/v1/repos/public/nicotine-less/releases" \ -H "Authorization: token ${{ secrets.TOKEN }}" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"${{ needs.check-version.outputs.latest_version }}\", \"name\": \"Nicotine+ ${{ needs.check-version.outputs.latest_version }}\", \"body\": \"Automated build with Nicotine+ version ${{ needs.check-version.outputs.latest_version }}\" }"