Fix release notes (#5599) #49
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Docker image release | |
on: | |
workflow_dispatch: | |
push: | |
branches: | |
- main | |
tags: | |
- "v[0-9].[0-9]+.[0-9]+*" | |
env: | |
DOCKER_REPO_NAME: deepset/haystack | |
jobs: | |
build-and-push: | |
name: Build ${{ matrix.target }} images | |
runs-on: ubuntu-latest-4-cores | |
strategy: | |
matrix: | |
target: | |
- "cpu" | |
- "cpu-remote-inference" | |
- "gpu" | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v3 | |
- name: Set up QEMU | |
uses: docker/setup-qemu-action@v2 | |
- name: Set up Docker Buildx | |
uses: docker/setup-buildx-action@v2 | |
- name: Login to DockerHub | |
uses: docker/login-action@v2 | |
with: | |
username: ${{ secrets.DOCKER_HUB_USER }} | |
password: ${{ secrets.DOCKER_HUB_TOKEN }} | |
- name: Docker meta | |
id: meta | |
uses: docker/metadata-action@v4 | |
with: | |
images: $DOCKER_REPO_NAME | |
- name: Build base images | |
uses: docker/bake-action@v2 | |
env: | |
IMAGE_TAG_SUFFIX: ${{ steps.meta.outputs.version }} | |
HAYSTACK_VERSION: ${{ steps.meta.outputs.version }} | |
with: | |
workdir: docker | |
targets: base-${{ matrix.target }} | |
push: true | |
- name: Test base image | |
run: | | |
EXPECTED_VERSION=$(cat VERSION.txt) | |
if [[ $EXPECTED_VERSION == *"-"* ]]; then | |
EXPECTED_VERSION=$(cut -d '-' -f 1 < VERSION.txt)$(cut -d '-' -f 2 < VERSION.txt) | |
fi | |
TAG="base-${{ matrix.target }}-${{ steps.meta.outputs.version }}" | |
PLATFORM="linux/amd64" | |
VERSION=$(docker run --platform "$PLATFORM" --rm "deepset/haystack:$TAG" python -c"import haystack; print(haystack.__version__)") | |
[[ "$VERSION" = "$EXPECTED_VERSION" ]] || echo "::error 'Haystack version in deepset/haystack:$TAG image for $PLATFORM is different from expected'" | |
PLATFORM="linux/arm64" | |
VERSION=$(docker run --platform "$PLATFORM" --rm "deepset/haystack:$TAG" python -c"import haystack; print(haystack.__version__)") | |
[[ "$VERSION" = "$EXPECTED_VERSION" ]] || echo "::error 'Haystack version in deepset/haystack:$TAG image for $PLATFORM is different from expected'" | |
# Remove image after test to avoid filling the GitHub runner and prevent its failure | |
docker rmi "deepset/haystack:$TAG" | |
- name: Test non-inference image | |
if: contains(matrix.target, 'inference') != true | |
run: | | |
TAG="base-${{ matrix.target }}-${{ steps.meta.outputs.version }}" | |
# docker commands below always output a non-empty string, otherwise the step will exit abnormally | |
PLATFORM="linux/amd64" | |
TORCH_INSTALLED=$(docker run --platform "$PLATFORM" --rm "deepset/haystack:$TAG" pip list | grep torch || echo 'not found') | |
[[ "$TORCH_INSTALLED" != "not found" ]] || echo "::error::Pytorch is not installed in deepset/haystack:$TAG image for $PLATFORM" | |
PLATFORM="linux/arm64" | |
TORCH_INSTALLED=$(docker run --platform "$PLATFORM" --rm "deepset/haystack:$TAG" pip list | grep torch || echo 'not found') | |
[[ "$TORCH_INSTALLED" != "not found" ]] || echo "::error::Pytorch is not installed in deepset/haystack:$TAG image for $PLATFORM" | |
- name: Test inference image | |
if: contains(matrix.target, 'inference') | |
run: | | |
TAG="base-${{ matrix.target }}-${{ steps.meta.outputs.version }}" | |
# docker commands below always output a non-empty string, otherwise the step will exit abnormally | |
PLATFORM="linux/amd64" | |
TORCH_INSTALLED=$(docker run --platform "$PLATFORM" --rm "deepset/haystack:$TAG" sh -c "pip list | grep torch || echo 'not found'") | |
[[ "$TORCH_INSTALLED" == "not found" ]] || echo "::error::Pytorch is installed in deepset/haystack:$TAG image for $PLATFORM" | |
PLATFORM="linux/arm64" | |
TORCH_INSTALLED=$(docker run --platform "$PLATFORM" --rm "deepset/haystack:$TAG" sh -c "pip list | grep torch || echo 'not found'") | |
[[ "$TORCH_INSTALLED" == "not found" ]] || echo "::error::Pytorch is installed in deepset/haystack:$TAG image for $PLATFORM" | |
- name: Build api images | |
uses: docker/bake-action@v2 | |
env: | |
IMAGE_TAG_SUFFIX: ${{ steps.meta.outputs.version }} | |
BASE_IMAGE_TAG_SUFFIX: ${{ steps.meta.outputs.version }} | |
with: | |
workdir: docker | |
targets: ${{ matrix.target }} | |
push: true | |
- name: Test inference API invocation | |
if: contains(matrix.target, 'inference') | |
env: | |
SERPERDEV_API_KEY: ${{ secrets.SERPERDEV_API_KEY }} | |
OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} | |
run: | | |
TAG="${{ matrix.target }}-${{ steps.meta.outputs.version }}" | |
PLATFORMS=("linux/amd64" "linux/arm64") | |
for PLATFORM in "${PLATFORMS[@]}"; do | |
docker run --name test-container -d \ | |
--platform "$PLATFORM" \ | |
-e PIPELINE_YAML_PATH=/opt/venv/lib/python3.10/site-packages/rest_api/pipeline/pipelines_web_lfqa.haystack-pipeline.yaml \ | |
-e "RETRIEVER_PARAMS_API_KEY=$SERPERDEV_API_KEY" \ | |
-e "PROMPTNODE_PARAMS_API_KEY=$OPENAI_API_KEY" \ | |
-p 8080:8000 "deepset/haystack:$TAG" | |
I=0 | |
until docker logs test-container 2>&1 | grep "Uvicorn running"; do | |
echo "Waiting" | |
sleep 2 | |
((I++)) && ((I==100)) && echo "::error 'Timeout waiting for Uvicorn to start using deepset/haystack:$TAG image for $PLATFORM'" | |
done | |
RESULT=$(curl -s -X POST -H "Content-Type: application/json" -d "{\"query\": \"Where in Europe, should I live?\"}" http://localhost:8080/query) | |
[[ -n "$RESULT" ]] || echo "::error 'No response from inference API using deepset/haystack:$TAG image for $PLATFORM'" | |
docker rm -f test-container | |
done | |
- name: Get latest version of Haystack | |
id: latest-version | |
if: startsWith(github.ref, 'refs/tags/') | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
VERSION=$(gh api repos/${{ github.repository }}/releases/latest --jq ".tag_name") | |
echo "release=$VERSION" >> "$GITHUB_OUTPUT" | |
- name: Compare current version with latest | |
uses: madhead/semver-utils@latest | |
id: version | |
if: startsWith(github.ref, 'refs/tags/') | |
with: | |
# Version being built | |
version: ${{ github.ref_name }} | |
# Compare to latest | |
compare-to: ${{ steps.latest-version.outputs.release }} | |
# This step should only run when we release a new minor, so | |
# that we can tag the most recent image without the version number. | |
# For example, if the previous step builds `deepset/haystack:cpu-1.8.0`, | |
# this builds `deepset/haystack:cpu` | |
- name: Build api images no version in tag | |
uses: docker/bake-action@v2 | |
if: steps.version.outputs.comparison-result == '>' | |
env: | |
IMAGE_TAG_SUFFIX: ${{ steps.meta.outputs.version }} | |
BASE_IMAGE_TAG_SUFFIX: ${{ steps.meta.outputs.version }} | |
with: | |
workdir: docker | |
targets: ${{ matrix.target }}-latest | |
push: true |