diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 119af012fb..17f2e543ef 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -94,53 +94,28 @@ jobs: - goos: linux goarch: amd64 runner: ubuntu-24.04 - native_asset: native-linux-x86_64.tar.gz - goos: linux goarch: arm64 runner: ubuntu-24.04-arm - native_asset: native-linux-aarch64.tar.gz - goos: darwin goarch: amd64 runner: macos-15-intel - native_asset: native-macos-x86_64.tar.gz - goos: darwin goarch: arm64 runner: macos-14 - native_asset: native-macos-aarch64.tar.gz - goos: windows goarch: amd64 runner: windows-latest - native_asset: native-windows-x86_64.zip - msystem: CLANG64 - rust_target: x86_64-pc-windows-gnullvm - msys2_packages: >- - mingw-w64-clang-x86_64-clang - mingw-w64-clang-x86_64-lld - mingw-w64-clang-x86_64-cmake - mingw-w64-clang-x86_64-ninja - mingw-w64-clang-x86_64-pcre2 - mingw-w64-clang-x86_64-pkgconf output_ext: .exe - goos: windows goarch: arm64 runner: windows-11-arm - native_asset: native-windows-aarch64.zip - msystem: CLANGARM64 - rust_target: aarch64-pc-windows-gnullvm - msys2_packages: >- - mingw-w64-clang-aarch64-clang - mingw-w64-clang-aarch64-lld - mingw-w64-clang-aarch64-cmake - mingw-w64-clang-aarch64-ninja - mingw-w64-clang-aarch64-pcre2 - mingw-w64-clang-aarch64-pkgconf output_ext: .exe runs-on: ${{ matrix.runner }} env: CLI_NAME: ragflow-cli CLI_MAIN: ./cmd/ragflow-cli.go DIST_DIR: dist/cli - OFFICE_OXIDE_VERSION: "0.1.2" RELEASE_TAG: ${{ needs.prepare.outputs.release_tag }} steps: @@ -159,249 +134,7 @@ jobs: go-version-file: go.mod cache: true - - name: Install Unix native build dependencies - if: runner.os != 'Windows' - shell: bash - run: | - set -euo pipefail - - if [[ "${{ matrix.goos }}" == "linux" ]]; then - sudo apt-get update - sudo apt-get install -y build-essential libpcre2-dev libsimde-dev pkg-config python3-pip - elif [[ "${{ matrix.goos }}" == "darwin" ]]; then - brew list pcre2 >/dev/null 2>&1 || brew install pcre2 - brew list simde >/dev/null 2>&1 || brew install simde - fi - - python3 -m pip install --user --upgrade 'cmake>=4.0,<5' || \ - python3 -m pip install --user --break-system-packages --upgrade 'cmake>=4.0,<5' - python_user_base="$(python3 -m site --user-base)" - echo "${python_user_base}/bin" >> "${GITHUB_PATH}" - export PATH="${python_user_base}/bin:${PATH}" - cmake --version - - - name: Download office_oxide native library - if: runner.os != 'Windows' - shell: bash - run: | - set -euo pipefail - - OFFICE_OXIDE_PREFIX="${RUNNER_TEMP}/office_oxide" - OFFICE_OXIDE_URL="https://github.com/yfedoseev/office_oxide/releases/download/v${OFFICE_OXIDE_VERSION}/${{ matrix.native_asset }}" - - mkdir -p "${OFFICE_OXIDE_PREFIX}" - curl -fsSL "${OFFICE_OXIDE_URL}" -o "${RUNNER_TEMP}/${{ matrix.native_asset }}" - tar xzf "${RUNNER_TEMP}/${{ matrix.native_asset }}" -C "${OFFICE_OXIDE_PREFIX}" - - test -f "${OFFICE_OXIDE_PREFIX}/include/office_oxide_c/office_oxide.h" - test -f "${OFFICE_OXIDE_PREFIX}/lib/liboffice_oxide.a" - ln -sf "office_oxide_c/office_oxide.h" "${OFFICE_OXIDE_PREFIX}/include/office_oxide.h" - test -f "${OFFICE_OXIDE_PREFIX}/include/office_oxide.h" - - echo "OFFICE_OXIDE_PREFIX=${OFFICE_OXIDE_PREFIX}" >> "${GITHUB_ENV}" - - - name: Set up MSYS2 - if: runner.os == 'Windows' - uses: msys2/setup-msys2@v2 - with: - msystem: ${{ matrix.msystem }} - update: true - install: ${{ matrix.msys2_packages }} - path-type: inherit - - - name: Install Windows SIMDe headers - if: runner.os == 'Windows' - shell: msys2 {0} - run: | - set -euo pipefail - - simde_dir="$(cygpath -u "${RUNNER_TEMP}")/simde" - simde_archive="$(cygpath -u "${RUNNER_TEMP}")/simde-v0.8.2.tar.gz" - github_env="$(cygpath -u "${GITHUB_ENV}")" - - rm -rf "${simde_dir}" - mkdir -p "${simde_dir}" - curl -fsSL "https://github.com/simd-everywhere/simde/archive/refs/tags/v0.8.2.tar.gz" -o "${simde_archive}" - tar xzf "${simde_archive}" -C "${simde_dir}" --strip-components=1 - - test -f "${simde_dir}/simde/x86/sse4.1.h" - - # Install SIMDe headers into the MSYS2 toolchain include directory. - # CMake/Ninja invokes clang-scan-deps as a Windows-native executable; - # a POSIX-style include path like /c/a/_temp/simde may not be resolved - # there, so keep the headers under ${MINGW_PREFIX}/include instead. - rm -rf "${MINGW_PREFIX}/include/simde" - cp -R "${simde_dir}/simde" "${MINGW_PREFIX}/include/simde" - test -f "${MINGW_PREFIX}/include/simde/x86/sse4.1.h" - - - name: Configure Windows C compiler - if: runner.os == 'Windows' - shell: msys2 {0} - run: | - set -euo pipefail - - cc_path="$(command -v clang.exe 2>/dev/null || command -v clang)" - cxx_path="$(command -v clang++.exe 2>/dev/null || command -v clang++)" - - if [[ ! -f "${cc_path}" && -f "${cc_path}.exe" ]]; then - cc_path="${cc_path}.exe" - fi - if [[ ! -f "${cxx_path}" && -f "${cxx_path}.exe" ]]; then - cxx_path="${cxx_path}.exe" - fi - test -f "${cc_path}" - test -f "${cxx_path}" - - cc="$(cygpath -m "${cc_path}")" - cxx="$(cygpath -m "${cxx_path}")" - github_env="$(cygpath -u "${GITHUB_ENV}")" - - pcre2_libdir="$(pkg-config --variable=libdir libpcre2-8)" - pcre2_includedir="$(pkg-config --variable=includedir libpcre2-8)" - - echo "CC=${cc}" >> "${github_env}" - echo "CXX=${cxx}" >> "${github_env}" - echo "PCRE2_LIBDIR=$(cygpath -m "${pcre2_libdir}")" >> "${github_env}" - echo "PCRE2_INCLUDEDIR=$(cygpath -m "${pcre2_includedir}")" >> "${github_env}" - - echo "Resolved MSYS2 clang: ${cc}" - "${cc_path}" --version - echo "Resolved MSYS2 clang++: ${cxx}" - "${cxx_path}" --version - - - name: Set up Rust for Windows office_oxide staticlib - if: runner.os == 'Windows' - uses: dtolnay/rust-toolchain@stable - with: - targets: ${{ matrix.rust_target }} - - - name: Build office_oxide native library for Windows GNU ABI - if: runner.os == 'Windows' - shell: msys2 {0} - run: | - set -euo pipefail - - office_oxide_prefix="$(cygpath -u "${RUNNER_TEMP}")/office_oxide" - office_oxide_src="$(cygpath -u "${RUNNER_TEMP}")/office_oxide-src" - archive_path="$(cygpath -u "${RUNNER_TEMP}")/office_oxide-v${OFFICE_OXIDE_VERSION}.tar.gz" - github_env="$(cygpath -u "${GITHUB_ENV}")" - - rm -rf "${office_oxide_prefix}" "${office_oxide_src}" - mkdir -p "${office_oxide_prefix}/include/office_oxide_c" "${office_oxide_prefix}/lib" "${office_oxide_src}" - - curl -fsSL "https://github.com/yfedoseev/office_oxide/archive/refs/tags/v${OFFICE_OXIDE_VERSION}.tar.gz" -o "${archive_path}" - tar xzf "${archive_path}" -C "${office_oxide_src}" --strip-components=1 - - cd "${office_oxide_src}" - - cc_path="$(command -v clang.exe 2>/dev/null || command -v clang)" - cxx_path="$(command -v clang++.exe 2>/dev/null || command -v clang++)" - if [[ ! -f "${cc_path}" && -f "${cc_path}.exe" ]]; then - cc_path="${cc_path}.exe" - fi - if [[ ! -f "${cxx_path}" && -f "${cxx_path}.exe" ]]; then - cxx_path="${cxx_path}.exe" - fi - test -f "${cc_path}" - test -f "${cxx_path}" - - export CC="${cc_path}" - export CXX="${cxx_path}" - export AR="$(command -v llvm-ar || command -v ar)" - export CARGO_BUILD_TARGET="${{ matrix.rust_target }}" - export RUSTFLAGS="-C target-feature=+crt-static -C link-arg=-fuse-ld=lld" - - case "${{ matrix.rust_target }}" in - x86_64-pc-windows-gnullvm) - export CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_LINKER="${CC}" - export CARGO_TARGET_X86_64_PC_WINDOWS_GNULLVM_AR="${AR}" - ;; - aarch64-pc-windows-gnullvm) - export CARGO_TARGET_AARCH64_PC_WINDOWS_GNULLVM_LINKER="${CC}" - export CARGO_TARGET_AARCH64_PC_WINDOWS_GNULLVM_AR="${AR}" - ;; - *) - echo "Unsupported Rust target: ${{ matrix.rust_target }}" - exit 1 - ;; - esac - - # The release workflow only needs the static archive for cgo. - # Building cdylib on Windows pulls in extra MinGW runtime libraries, - # which can fail under the CLANG64/CLANGARM64 environments. - perl -0pi -e 's/crate-type\s*=\s*\[[^\]]+\]/crate-type = ["staticlib"]/s' Cargo.toml - - cargo build --release --lib --target "${CARGO_BUILD_TARGET}" --no-default-features - - cp "include/office_oxide_c/office_oxide.h" "${office_oxide_prefix}/include/office_oxide_c/office_oxide.h" - cp "include/office_oxide_c/office_oxide.h" "${office_oxide_prefix}/include/office_oxide.h" - cp "target/${CARGO_BUILD_TARGET}/release/liboffice_oxide.a" "${office_oxide_prefix}/lib/liboffice_oxide.a" - - test -f "${office_oxide_prefix}/include/office_oxide_c/office_oxide.h" - test -f "${office_oxide_prefix}/include/office_oxide.h" - test -f "${office_oxide_prefix}/lib/liboffice_oxide.a" - - echo "OFFICE_OXIDE_PREFIX=$(cygpath -m "${office_oxide_prefix}")" >> "${github_env}" - - - name: Build rag tokenizer native library - if: runner.os != 'Windows' - shell: bash - run: | - set -euo pipefail - - cmake_args=( - -S internal/binding/cpp - -B internal/binding/cpp/cmake-build-release - -DCMAKE_BUILD_TYPE=Release - ) - - if [[ "${{ matrix.goos }}" == "darwin" ]]; then - simde_prefix="$(brew --prefix simde)" - pcre2_prefix="$(brew --prefix pcre2)" - cmake_args+=( - -DCMAKE_PREFIX_PATH="${pcre2_prefix};${simde_prefix}" - -DCMAKE_C_FLAGS="-I${simde_prefix}/include" - -DCMAKE_CXX_FLAGS="-I${simde_prefix}/include" - ) - fi - - cmake "${cmake_args[@]}" - cmake --build internal/binding/cpp/cmake-build-release --target rag_tokenizer_c_api --parallel - - test -f internal/binding/cpp/cmake-build-release/librag_tokenizer_c_api.a - - - name: Build rag tokenizer native library - if: runner.os == 'Windows' - shell: msys2 {0} - run: | - set -euo pipefail - - cc_path="$(command -v clang.exe 2>/dev/null || command -v clang)" - cxx_path="$(command -v clang++.exe 2>/dev/null || command -v clang++)" - - if [[ ! -f "${cc_path}" && -f "${cc_path}.exe" ]]; then - cc_path="${cc_path}.exe" - fi - if [[ ! -f "${cxx_path}" && -f "${cxx_path}.exe" ]]; then - cxx_path="${cxx_path}.exe" - fi - test -f "${cc_path}" - test -f "${cxx_path}" - - test -f "${MINGW_PREFIX}/include/simde/x86/sse4.1.h" - - cmake -S internal/binding/cpp -B internal/binding/cpp/cmake-build-release -G Ninja \ - -DCMAKE_BUILD_TYPE=Release \ - -DCMAKE_C_COMPILER="$(cygpath -m "${cc_path}")" \ - -DCMAKE_CXX_COMPILER="$(cygpath -m "${cxx_path}")" \ - -DCMAKE_C_FLAGS="-I${MINGW_PREFIX}/include" \ - -DCMAKE_CXX_FLAGS="-I${MINGW_PREFIX}/include" - - cmake --build internal/binding/cpp/cmake-build-release --target rag_tokenizer_c_api --parallel - - test -f internal/binding/cpp/cmake-build-release/librag_tokenizer_c_api.a - - - name: Build Go CLI release binaries + - name: Build Go CLI release binaries on non-Windows if: runner.os != 'Windows' shell: bash run: | @@ -435,7 +168,7 @@ jobs: chmod +x "${output}" - - name: Build Go CLI release binaries + - name: Build Go CLI release binaries on Windows if: runner.os == 'Windows' shell: pwsh run: | @@ -449,24 +182,10 @@ jobs: $output = Join-Path $env:DIST_DIR "${env:CLI_NAME}-${env:RELEASE_TAG}-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.output_ext }}" Write-Host "Building ${{ matrix.goos }}/${{ matrix.goarch }} -> $output" - $cc = $env:CC - if ([string]::IsNullOrWhiteSpace($cc)) { - Write-Error "CC is not set" - exit 1 - } - if (-not (Test-Path $cc)) { - Write-Error "C compiler does not exist: $cc" - exit 1 - } - $env:CGO_ENABLED = "0" - $env:CC = $cc $env:GOOS = "${{ matrix.goos }}" $env:GOARCH = "${{ matrix.goarch }}" - Write-Host "CC: $env:CC" - & $env:CC --version - go build ` -trimpath ` -ldflags="-s -w -X main.version=$env:RELEASE_TAG -X main.commit=$env:GITHUB_SHA" `