name: Build and Release
on:
push:
branches: [release]
workflow_dispatch:
env:
DOCKER_IMAGE: zudsniper/mcp-image-recognition
UVX_PACKAGE: mcp-image-recognition
jobs:
version-check:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.extract-version.outputs.version }}
exists: ${{ steps.version-check.outputs.exists }}
steps:
- uses: actions/checkout@v4
- name: Extract version
id: extract-version
run: echo "version=$(grep -m 1 'version' pyproject.toml | cut -d'"' -f2)" >> $GITHUB_OUTPUT
- name: Check if version exists on PyPI
id: version-check
run: |
response=$(curl -s https://pypi.org/pypi/mcp-image-recognition/json || echo '{"releases":{}}')
versions=$(echo $response | jq -r '.releases | keys[]' 2>/dev/null || echo '')
version="${{ steps.extract-version.outputs.version }}"
if echo "$versions" | grep -q "^$version$"; then
echo "exists=true" >> $GITHUB_OUTPUT
echo "::error::Version $version already exists on PyPI. Please update the version in pyproject.toml and setup.py"
exit 1
else
echo "exists=false" >> $GITHUB_OUTPUT
fi
test:
runs-on: ubuntu-latest
needs: version-check
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install Tesseract OCR
run: |
sudo apt-get update
sudo apt-get install -y tesseract-ocr
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements-dev.txt
pip install -e .
- name: Run tests
run: |
PYTHONPATH=$PWD pytest tests/ --asyncio-mode=strict
build-and-push-docker:
needs: [test, version-check]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Login to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Set version from version-check job
id: version
run: echo "VERSION=${{ needs.version-check.outputs.version }}" >> $GITHUB_OUTPUT
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
platforms: linux/amd64,linux/arm64
tags: |
${{ env.DOCKER_IMAGE }}:latest
${{ env.DOCKER_IMAGE }}:${{ steps.version.outputs.VERSION }}
publish-uvx:
needs: [test, version-check]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.10'
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Extract version
id: version
run: echo "VERSION=$(grep -m 1 'version' pyproject.toml | cut -d'"' -f2)" >> $GITHUB_OUTPUT
- name: Build and publish to PyPI
env:
PYPI_API_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
run: |
uv pip install --system build twine
python -m build
twine upload dist/* --username __token__ --password $PYPI_API_TOKEN
create-release:
needs: [build-and-push-docker, publish-uvx, version-check]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set version from version-check job
id: version
run: echo "VERSION=${{ needs.version-check.outputs.version }}" >> $GITHUB_OUTPUT
- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: v${{ steps.version.outputs.VERSION }}
name: Release v${{ steps.version.outputs.VERSION }}
draft: false
prerelease: false
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}