From 5ff26421679782c6e8d204026407f8a8f81c70d3 Mon Sep 17 00:00:00 2001 From: SvenBrnn Date: Wed, 19 Mar 2025 12:34:57 +0100 Subject: [PATCH] Add auto-building --- .github/workflows/build-and-push.yml | 57 ++++++++++++ .github/workflows/check-n8n-new-release.yml | 65 ++++++++++++++ .../workflows/create-new-release-on-push.yml | 86 +++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 .github/workflows/build-and-push.yml create mode 100644 .github/workflows/check-n8n-new-release.yml create mode 100644 .github/workflows/create-new-release-on-push.yml diff --git a/.github/workflows/build-and-push.yml b/.github/workflows/build-and-push.yml new file mode 100644 index 0000000..4fecd1f --- /dev/null +++ b/.github/workflows/build-and-push.yml @@ -0,0 +1,57 @@ +name: 📦 Build custom Docker image and push to Docker Hub + +# Workflow triggered manually (GitHub UI) or programmatically by the check-ollama-new-release workflow +on: + workflow_call: + inputs: + ollama_version: + description: 'ollama version to build. Example: 1.20.0' + required: true + type: string + next_version_suffix: + description: 'Next version suffix to compare with the new release. Example: 0' + required: false + type: string + workflow_dispatch: + inputs: + ollama_version: + description: 'ollama version to build. Example: 1.20.0' + required: true + type: string + next_version_suffix: + description: 'Next version suffix to compare with the new release. Example: 0' + required: false + type: string + +jobs: + build-push-docker-image: + name: 🐳 Build and push Docker image + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - uses: actions/checkout@v4 + - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-buildx-action@v3 + - uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + - uses: docker/build-push-action@v6 + with: + context: . + build-args: OLLAMA_VERSION=${{ inputs.ollama_version }} + push: true + tags: svenbrnn/runpod-ollama:${{ inputs.ollama_version }}${{ inputs.next_version_suffix }},svenbrnn/runpod-ollama:latest + + create-release: + name: 🏷️ Create GitHub Release + needs: build-push-docker-image + runs-on: ubuntu-latest + timeout-minutes: 1 + permissions: + contents: write + steps: + - uses: ncipollo/release-action@v1 + with: + commit: main + tag: ollama@${{ inputs.ollama_version }}${{ inputs.next_version_suffix }} \ No newline at end of file diff --git a/.github/workflows/check-n8n-new-release.yml b/.github/workflows/check-n8n-new-release.yml new file mode 100644 index 0000000..b3453e6 --- /dev/null +++ b/.github/workflows/check-n8n-new-release.yml @@ -0,0 +1,65 @@ +name: 👀 Check for new ollama stable releases and builds a new custom image release if needed + +on: + schedule: + - cron: '0 8 * * *' # Every day at 8am + workflow_dispatch: + +jobs: + check-new-release: + runs-on: ubuntu-latest + + timeout-minutes: 5 + + # Output mapping needed to share data between jobs. Separated jobs to reuse the build-and-push.yml workflow. + outputs: + has_new_release: ${{ steps.new_release_check.outputs.has_new_release }} + version_to_release: ${{ steps.ollama_version.outputs.version_to_release }} + + steps: + - name: 🆕 Get the latest ollama release + id: custom_image_release + uses: dvershinin/lastversion-action@main + with: + repository: 'SvenBrnn/runpod-worker-ollama' + + - name: 🆕 Get the latest ollama release + id: ollama_release + uses: dvershinin/lastversion-action@main + with: + repository: 'ollama/ollama' + + - name: 🤲 Check if it is a newer ollama release + id: new_release_check + run: | + echo "👀 Latest Codely custom image release: ${{ steps.custom_image_release.outputs.release }}" + echo "🆕 Latest ollama release: ${{ steps.ollama_release.outputs.last_version }}" + + custom_version_orig=$(echo "${{ steps.custom_image_release.outputs.release }}" | sed 's/ollama@//g') + custom_version=$(echo "$custom_version_orig" | sed 's/-[0-9]*//g') # Remove the suffix + ollama_version=$(echo "${{ steps.ollama_release.outputs.last_version }}" | sed 's/ollama@//g') + + latest_version=$(echo -e "$custom_version\n$ollama_version" | sort -V | tail -n1) + + if [ "$custom_version" != "$latest_version" ]; then + echo "has_new_release=true" >> $GITHUB_OUTPUT + echo "🤩 New release detected! Releasing new custom image version in 1, 2…" + else + echo "has_new_release=false" >> $GITHUB_OUTPUT + echo "👍 Release has not changed or it is previous to the current one. Doing nothing." + fi + + - name: 🔡 Remove 'ollama@' from release name to get the version + id: ollama_version + if: steps.new_release_check.outputs.has_new_release == 'true' + run: | + version_to_release=$(echo "${{ steps.ollama_release.outputs.last_version }}" | sed 's/ollama@//g') + echo "version_to_release=$version_to_release" >> $GITHUB_OUTPUT + + build-and-push-new-docker-image: + needs: check-new-release + if: ${{ needs.check-new-release.outputs.has_new_release == 'true' }} + uses: ./.github/workflows/build-and-push.yml + secrets: inherit + with: + ollama_version: ${{ needs.check-new-release.outputs.version_to_release }} diff --git a/.github/workflows/create-new-release-on-push.yml b/.github/workflows/create-new-release-on-push.yml new file mode 100644 index 0000000..5370334 --- /dev/null +++ b/.github/workflows/create-new-release-on-push.yml @@ -0,0 +1,86 @@ +name: Create new release on push + +on: + push: + branches: + - main + +jobs: + check-new-release: + runs-on: ubuntu-latest + + timeout-minutes: 5 + + # Output mapping needed to share data between jobs. Separated jobs to reuse the build-and-push.yml workflow. + outputs: + has_new_release: ${{ steps.new_release_check.outputs.has_new_release }} + version_to_release: ${{ steps.ollama_version.outputs.version_to_release }} + next_version_suffix: ${{ steps.new_release_check.outputs.next_version_suffix }} + + steps: + - name: 🆕 Get the latest ollama release + id: custom_image_release + uses: dvershinin/lastversion-action@main + with: + repository: 'SvenBrnn/runpod-worker-ollama' + + - name: 🆕 Get the latest ollama release + id: ollama_release + uses: dvershinin/lastversion-action@main + with: + repository: 'ollama/ollama' + + - name: 🤲 Check if it is a newer ollama release + id: new_release_check + run: | + echo "👀 Latest Codely custom image release: ${{ steps.custom_image_release.outputs.release }}" + echo "🆕 Latest ollama release: ${{ steps.ollama_release.outputs.last_version }}" + + custom_version_orig=$(echo "${{ steps.custom_image_release.outputs.release }}" | sed 's/ollama@//g') + custom_version=$(echo "$custom_version_orig" | sed 's/-[0-9]*//g') # Remove the suffix + ollama_version=$(echo "${{ steps.ollama_release.outputs.last_version }}" | sed 's/ollama@//g') + + latest_version=$(echo -e "$custom_version\n$ollama_version" | sort -V | tail -n1) + echo "has_new_release=true" >> $GITHUB_OUTPUT + + # Debug print + echo "custom_version_orig=$custom_version_orig" + echo "custom_version=$custom_version" + echo "ollama_version=$ollama_version" + + # Calculate the next_version_suffix to compare with the new release + # If the custom_version does not equal the latest_version, then it is a new release and we don't need a suffix + if [ "$custom_version" != "$ollama_version" ]; then + echo "next_version_suffix=" >> $GITHUB_OUTPUT + else + # If the custom_version equals the latest_version, then it is a new release and we need to increment the suffix + # If there is no suffix present we start with 1 + # Check if we have a - first + has_suffix=$(echo "$custom_version_orig" | sed 's/[^-]//g') + if [ -z "$has_suffix" ]; then + suffix="-1" + else + suffix=$(echo "$custom_version_orig" | grep -o '[0-9]*$') + suffix="-$((suffix + 1))" + fi + + echo "next_version_suffix=$suffix" + echo "next_version_suffix=$suffix" >> $GITHUB_OUTPUT + fi + + - name: 🔡 Remove 'ollama@' from release name to get the version + id: ollama_version + if: steps.new_release_check.outputs.has_new_release == 'true' + run: | + version_to_release=$(echo "${{ steps.ollama_release.outputs.last_version }}" | sed 's/ollama@//g') + echo "version_to_release=$version_to_release" >> $GITHUB_OUTPUT + echo "next_version_suffix=${{ steps.new_release_check.outputs.next_version_suffix }}" >> $GITHUB_OUTPUT + + build-and-push-new-docker-image: + needs: check-new-release + if: ${{ needs.check-new-release.outputs.has_new_release == 'true' }} + uses: ./.github/workflows/build-and-push.yml + secrets: inherit + with: + ollama_version: ${{ needs.check-new-release.outputs.version_to_release }} + next_version_suffix: ${{ needs.check-new-release.outputs.next_version_suffix }}