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: node:20-slim outputs: should_build: ${{ steps.compare.outputs.should_build }} latest_version: ${{ steps.get_version.outputs.version }} steps: - name: Install dependencies run: | apt-get update && apt-get install -y curl jq - 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 - platform: linux/arm64 runner: linux-arm64 runs-on: ${{ matrix.runner }} steps: - 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 docker buildx build \ --platform ${{ matrix.platform }} \ --tag git.nicola.sh/public/nicotine-less:latest-${{ matrix.platform }} \ --tag git.nicola.sh/public/nicotine-less:${{ needs.check-version.outputs.latest_version }}-${{ matrix.platform }} \ --cache-from type=registry,ref=git.nicola.sh/public/nicotine-less:buildcache-${{ matrix.platform }} \ --cache-to type=registry,ref=git.nicola.sh/public/nicotine-less:buildcache-${{ matrix.platform }},mode=max \ --push \ . create-manifest: needs: [check-version, build] runs-on: linux-amd64 steps: - 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 multi-arch manifest 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 \ 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 }}\" }"