Skip to content

release

release #1074

Workflow file for this run

name: release
on:
schedule:
- cron: '0 13 * * *' # This schedule runs every 13:00:00Z(21:00:00+08:00)
# https://github.com/orgs/community/discussions/26286?utm_source=chatgpt.com#discussioncomment-3251208
# "The create event does not support branch filter and tag filter."
# The "create tags" trigger is specifically focused on the creation of new tags, while the "push tags" trigger is activated when tags are pushed, including both new tag creations and updates to existing tags.
push:
tags:
- 'v*.*.*' # normal release
permissions:
contents: write
actions: read
checks: read
statuses: read
# https://docs.github.com/en/actions/using-jobs/using-concurrency
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
jobs:
prepare:
runs-on: ubuntu-latest
outputs:
release_tag: ${{ steps.prepare.outputs.release_tag }}
prerelease: ${{ steps.prepare.outputs.prerelease }}
steps:
- name: Prepare release info
id: prepare
run: |
if [[ ${GITHUB_EVENT_NAME} != 'schedule' ]]; then
RELEASE_TAG=${GITHUB_REF#refs/tags/}
if [[ ${RELEASE_TAG} == v* ]]; then
PRERELEASE=false
else
PRERELEASE=true
fi
echo "Workflow triggered by push tag: ${RELEASE_TAG}"
else
RELEASE_TAG=nightly
PRERELEASE=true
echo "Workflow triggered by schedule"
fi
echo "release_tag=${RELEASE_TAG}" >> ${GITHUB_OUTPUT}
echo "prerelease=${PRERELEASE}" >> ${GITHUB_OUTPUT}
build:
needs: prepare
strategy:
matrix:
include:
- runner: ["self-hosted", "infinity-release"]
arch: amd64
builder_image: infiniflow/infinity_builder:ubuntu22_clang20
- runner: ["self-hosted", "infinity-release-arm"]
arch: arm64
builder_image: infiniflow/infinity_builder:ubuntu22_clang20
runs-on: ${{ matrix.runner }}
steps:
- name: Ensure workspace ownership
run: echo "chown -R ${USER} ${GITHUB_WORKSPACE}" && sudo chown -R ${USER} ${GITHUB_WORKSPACE}
# https://github.com/actions/checkout/blob/v6/README.md
- name: Check out code
uses: actions/checkout@v6
with:
submodules: recursive
- name: Start builder container
run: |
BUILDER_CONTAINER=infinity_build_$(od -An -N4 -t u8 < /dev/urandom | tr -d ' ')
echo "BUILDER_CONTAINER=${BUILDER_CONTAINER}" >> ${GITHUB_ENV}
TZ=$(readlink -f /etc/localtime | awk -F '/zoneinfo/' '{print $2}')
sudo docker rm -f ${BUILDER_CONTAINER} && sudo docker run -d --name ${BUILDER_CONTAINER} -e TZ=${TZ} -e UV_INDEX=https://pypi.tuna.tsinghua.edu.cn/simple -v ${PWD}:/infinity ${{ matrix.builder_image }}
- name: Build release version
env:
RELEASE_TAG: ${{ needs.prepare.outputs.release_tag }}
run: |
sudo docker exec ${BUILDER_CONTAINER} bash -c "git config --global safe.directory \"*\" && cd /infinity && rm -fr cmake-build-reldeb && mkdir -p cmake-build-reldeb && cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCPACK_PACKAGE_VERSION=${RELEASE_TAG}-${{ matrix.arch }} -DCPACK_DEBIAN_PACKAGE_ARCHITECTURE=${{ matrix.arch }} -S /infinity -B /infinity/cmake-build-reldeb && cmake --build /infinity/cmake-build-reldeb --target infinity && cd /infinity/cmake-build-reldeb && cpack"
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.arch }}
path: |
cmake-build-reldeb/infinity-*.deb
cmake-build-reldeb/infinity-*.rpm
cmake-build-reldeb/infinity-*.tar.gz
retention-days: 1
- name: Build and push image
env:
RELEASE_TAG: ${{ needs.prepare.outputs.release_tag }}
run: |
sudo docker login --username infiniflow --password-stdin <<< ${{ secrets.DOCKERHUB_TOKEN }}
DOCKER_BUILDKIT=1 sudo docker build -t infiniflow/infinity:${RELEASE_TAG}-${{ matrix.arch }} -f scripts/Dockerfile_infinity .
sudo docker push infiniflow/infinity:${RELEASE_TAG}-${{ matrix.arch }}
- name: Destroy builder container
if: always() # always run this step even if previous steps failed
run: |
if [ -n "${BUILDER_CONTAINER}" ]; then
sudo docker rm -f -v ${BUILDER_CONTAINER}
fi
release:
needs: [prepare, build]
runs-on: ubuntu-latest
steps:
- name: Download amd64 artifacts
uses: actions/download-artifact@v4
with:
name: release-amd64
path: artifacts/amd64
- name: Download arm64 artifacts
uses: actions/download-artifact@v4
with:
name: release-arm64
path: artifacts/arm64
- name: Prepare release body
env:
RELEASE_TAG: ${{ needs.prepare.outputs.release_tag }}
PRERELEASE: ${{ needs.prepare.outputs.prerelease }}
run: |
RELEASE_DATETIME=$(date --rfc-3339=seconds)
cat <<EOF > release_body.md
Release ${RELEASE_TAG} created from ${GITHUB_SHA} at ${RELEASE_DATETIME}
EOF
- name: Create release
uses: softprops/action-gh-release@v2
env:
RELEASE_TAG: ${{ needs.prepare.outputs.release_tag }}
PRERELEASE: ${{ needs.prepare.outputs.prerelease }}
with:
token: ${{ secrets.GITHUB_TOKEN }}
prerelease: ${{ env.PRERELEASE }}
tag_name: ${{ env.RELEASE_TAG }}
body_path: release_body.md
files: |
artifacts/amd64/*
artifacts/arm64/*
tag:
needs: [prepare, release]
if: github.event_name == 'schedule'
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v6
with:
fetch-tags: true
- name: Create mutable tag
env:
RELEASE_TAG: ${{ needs.prepare.outputs.release_tag }}
run: |
git tag -f ${RELEASE_TAG} ${GITHUB_SHA}
git push -f origin ${RELEASE_TAG}:refs/tags/${RELEASE_TAG}
manifest:
needs: [prepare, build]
runs-on: ubuntu-latest
steps:
- name: Create and push multi-arch manifest
env:
RELEASE_TAG: ${{ needs.prepare.outputs.release_tag }}
run: |
sudo docker login --username infiniflow --password-stdin <<< ${{ secrets.DOCKERHUB_TOKEN }}
sudo docker manifest create infiniflow/infinity:${RELEASE_TAG} \
infiniflow/infinity:${RELEASE_TAG}-amd64 \
infiniflow/infinity:${RELEASE_TAG}-arm64
sudo docker manifest push infiniflow/infinity:${RELEASE_TAG}
infinity-sdk:
needs: [prepare, release]
if: startsWith(github.ref, 'refs/tags/v')
runs-on: ["self-hosted", "infinity-release"]
steps:
- name: Ensure workspace ownership
run: echo "chown -R ${USER} ${GITHUB_WORKSPACE}" && sudo chown -R ${USER} ${GITHUB_WORKSPACE}
- name: Check out code
uses: actions/checkout@v6
with:
submodules: recursive
- name: Build and push infinity-sdk
run: |
uv run --python 3.11 python/infinity_sdk/prepare_huqie.py && uv build && uv publish --token ${{ secrets.PYPI_API_TOKEN }}