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 - 'nightly' # mutable tag 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: release: runs-on: [ "self-hosted", "ragflow-release" ] 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: token: ${{ secrets.GITHUB_TOKEN }} # Use the secret as an environment variable fetch-depth: 0 fetch-tags: true # https://github.com/actions/setup-go - name: Set up Go uses: actions/setup-go@v5 with: go-version-file: go.mod cache: true - name: Prepare release body 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 create tag: ${RELEASE_TAG}" else RELEASE_TAG=nightly PRERELEASE=true echo "Workflow triggered by schedule" fi echo "RELEASE_TAG=${RELEASE_TAG}" >> ${GITHUB_ENV} echo "PRERELEASE=${PRERELEASE}" >> ${GITHUB_ENV} RELEASE_DATETIME=$(date --rfc-3339=seconds) echo Release ${RELEASE_TAG} created from ${GITHUB_SHA} at ${RELEASE_DATETIME} > release_body.md - name: Move the existing mutable tag # https://github.com/softprops/action-gh-release/issues/171 run: | git fetch --tags if [[ ${GITHUB_EVENT_NAME} == "schedule" ]]; then # Determine if a given tag exists and matches a specific Git commit. # actions/checkout@v6 fetch-tags doesn't work when triggered by schedule if [ "$(git rev-parse -q --verify "refs/tags/${RELEASE_TAG}")" = "${GITHUB_SHA}" ]; then echo "mutable tag ${RELEASE_TAG} exists and matches ${GITHUB_SHA}" else git tag -f ${RELEASE_TAG} ${GITHUB_SHA} git push -f origin ${RELEASE_TAG}:refs/tags/${RELEASE_TAG} echo "created/moved mutable tag ${RELEASE_TAG} to ${GITHUB_SHA}" fi fi - name: Build Go CLI release binaries run: | set -euo pipefail CLI_NAME="ragflow_cli" CLI_MAIN="./cmd/ragflow_cli.go" DIST_DIR="dist/cli" mkdir -p "${DIST_DIR}" if [[ ! -e "${CLI_MAIN}" ]]; then echo "::error::Go CLI entry does not exist: ${CLI_MAIN}" echo "::error::Please update CLI_MAIN in .github/workflows/release.yml" exit 1 fi echo "Building Go CLI release binaries" echo "CLI name: ${CLI_NAME}" echo "CLI main: ${CLI_MAIN}" echo "Release tag: ${RELEASE_TAG}" echo "Commit: ${GITHUB_SHA}" OFFICE_OXIDE_PREFIX="${OFFICE_OXIDE_PREFIX:-${HOME}/.office_oxide}" echo "office_oxide prefix: ${OFFICE_OXIDE_PREFIX}" build_one() { local goos="$1" local goarch="$2" local ext="$3" local output="${DIST_DIR}/${CLI_NAME}-${RELEASE_TAG}-${goos}-${goarch}${ext}" echo "Building ${goos}/${goarch} -> ${output}" CGO_ENABLED=1 \ CGO_CFLAGS="-I${OFFICE_OXIDE_PREFIX}/include/office_oxide_c" \ CGO_LDFLAGS="-L${OFFICE_OXIDE_PREFIX}/lib -loffice_oxide -Wl,-rpath,${OFFICE_OXIDE_PREFIX}/lib" \ GOOS="${goos}" \ GOARCH="${goarch}" \ go build \ -trimpath \ -ldflags="-s -w -X main.version=${RELEASE_TAG} -X main.commit=${GITHUB_SHA}" \ -o "${output}" \ "${CLI_MAIN}" if [[ "${goos}" != "windows" ]]; then chmod +x "${output}" fi } build_one linux amd64 "" build_one linux arm64 "" build_one darwin amd64 "" build_one darwin arm64 "" build_one windows amd64 ".exe" build_one windows arm64 ".exe" if command -v ldd >/dev/null 2>&1; then if ldd "${DIST_DIR}/${CLI_NAME}-${RELEASE_TAG}-linux-amd64" 2>&1 | tee /tmp/ragflow-cli-ldd.txt | grep -q "liboffice_oxide"; then echo "Verified linux/amd64 CLI links office_oxide" else echo "::error::linux/amd64 CLI does not link office_oxide" cat /tmp/ragflow-cli-ldd.txt || true exit 1 fi fi cd "${DIST_DIR}" sha256sum * > SHA256SUMS cd - echo "Generated CLI release assets:" ls -lh "${DIST_DIR}" - name: Upload Go CLI release assets uses: softprops/action-gh-release@v2 with: token: ${{ secrets.GITHUB_TOKEN }} prerelease: ${{ env.PRERELEASE }} tag_name: ${{ env.RELEASE_TAG }} body_path: release_body.md files: | dist/cli/* install.sh install.ps1 - name: Build and push image run: | sudo docker login --username infiniflow --password-stdin <<< ${{ secrets.DOCKERHUB_TOKEN }} sudo docker build -t infiniflow/ragflow:${RELEASE_TAG} -f Dockerfile . sudo docker tag infiniflow/ragflow:${RELEASE_TAG} infiniflow/ragflow:latest sudo docker push infiniflow/ragflow:${RELEASE_TAG} sudo docker push infiniflow/ragflow:latest - name: Build and push ragflow-sdk if: startsWith(github.ref, 'refs/tags/v') run: | cd sdk/python && uv build && uv publish --token ${{ secrets.PYPI_API_TOKEN }} - name: Build and push ragflow-cli if: startsWith(github.ref, 'refs/tags/v') run: | cd admin/client && uv build && uv publish --token ${{ secrets.PYPI_API_TOKEN }}