on: push: tags: - "v*.*.*" name: Release # Default for every job; the `release` job widens this for itself below. permissions: contents: read env: RUST_TOOLCHAIN: nightly-2026-05-20 jobs: build: name: Build binary strategy: matrix: include: - arch: x86_64-unknown-linux-gnu os: ubicloud-standard-16 features: "--features mimalloc" file_name: openobserve-${{ github.ref_name }}-linux-amd64 file_ext: .tar.gz - arch: x86_64-unknown-linux-gnu os: ubicloud-standard-16 features: "--features mimalloc" file_name: openobserve-${{ github.ref_name }}-linux-amd64-simd file_ext: .tar.gz - arch: x86_64-unknown-linux-musl os: ubicloud-standard-16 features: "--features mimalloc" file_name: openobserve-${{ github.ref_name }}-linux-amd64-musl file_ext: .tar.gz - arch: aarch64-unknown-linux-musl os: ubicloud-standard-16 features: "--features mimalloc" file_name: openobserve-${{ github.ref_name }}-linux-arm64-musl file_ext: .tar.gz - arch: aarch64-unknown-linux-gnu os: ubicloud-standard-16-arm features: "--features mimalloc" file_name: openobserve-${{ github.ref_name }}-linux-arm64 file_ext: .tar.gz - arch: x86_64-apple-darwin os: macos-latest-xlarge features: "--features mimalloc" file_name: openobserve-${{ github.ref_name }}-darwin-amd64 file_ext: .tar.gz - arch: aarch64-apple-darwin os: macos-latest-xlarge features: "--features mimalloc" file_name: openobserve-${{ github.ref_name }}-darwin-arm64 file_ext: .tar.gz - arch: x86_64-pc-windows-msvc os: windows-2022-16-cores features: "" file_name: openobserve-${{ github.ref_name }}-windows-amd64 file_ext: .zip runs-on: ${{ matrix.os }} steps: - name: Checkout sources uses: actions/checkout@v5 with: fetch-depth: 0 - uses: ./.github/actions/github-auth - name: Install Node uses: actions/setup-node@v7 with: node-version: 24 cache: "npm" cache-dependency-path: web/package-lock.json - name: Build UI env: NODE_OPTIONS: "--max-old-space-size=8192" run: | cd web/ npm ci npm run build - name: Install Protoc for linux if: contains(matrix.arch, 'x86_64-unknown-linux') || contains(matrix.arch, 'linux-musl') run: | # Make sure the protoc is >= 3.15 wget https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protoc-21.12-linux-x86_64.zip unzip protoc-21.12-linux-x86_64.zip -d protoc sudo cp protoc/bin/protoc /usr/local/bin/ sudo cp -r protoc/include/google /usr/local/include/ - name: Install Protoc for linux ARM if: contains(matrix.arch, 'aarch64-unknown-linux') && contains(matrix.arch, 'linux-musl') == false run: | # Make sure the protoc is >= 3.15 wget https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protoc-21.12-linux-aarch_64.zip unzip protoc-21.12-linux-aarch_64.zip -d protoc sudo cp protoc/bin/protoc /usr/local/bin/ sudo cp -r protoc/include/google /usr/local/include/ - name: Install Protoc for windows if: contains(matrix.arch, 'windows') shell: bash run: | curl -L -o protoc-21.12-win64.zip https://github.com/protocolbuffers/protobuf/releases/download/v21.12/protoc-21.12-win64.zip unzip protoc-21.12-win64.zip -d protoc cp protoc/bin/protoc.exe C:/windows/system32/protoc.exe cp -r protoc/include/google C:/windows/system32/ - name: Install Protoc for macos if: contains(matrix.arch, 'darwin') run: | brew install protobuf coreutils boost - name: Install dependencies for linux if: contains(matrix.arch, 'linux-gnu') run: | sudo apt-get -y update sudo apt-get -y install libssl-dev pkg-config gcc g++ g++-aarch64-linux-gnu gcc-aarch64-linux-gnu musl-dev musl-tools - name: Install rust toolchain uses: dtolnay/rust-toolchain@7e38f4b43b4db5c8dd498af069a4f6196df1d067 # master with: toolchain: ${{ env.RUST_TOOLCHAIN }} targets: ${{ matrix.arch }} - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 with: cache-on-failure: true prefix-key: release-${{ matrix.arch }} # Release target directories are multi-GB and have low cross-tag # reuse. Keep Cargo registry/git inputs without crowding PR caches. cache-targets: false - name: Install cross-rs if: contains(matrix.arch, 'linux-musl') run: RUSTFLAGS="" cargo install cross --git https://github.com/cross-rs/cross --force - name: Output package versions run: protoc --version ; cargo version ; rustc --version ; gcc --version ; g++ --version - name: Print rustc cfg run: rustc -C target-cpu=native --print cfg - name: Run cargo build (standard) if: contains(matrix.file_name, '-simd') == false && contains(matrix.arch, 'linux-musl') == false run: cargo build ${{ matrix.features }} --profile release-prod --target ${{ matrix.arch }} - name: Run cargo build (musl) if: contains(matrix.arch, 'linux-musl') env: CROSS_CONFIG: Cross.oss.toml run: cross build ${{ matrix.features }} --profile release-prod --target ${{ matrix.arch }} - name: Run cargo build (SIMD) if: contains(matrix.file_name, '-simd') run: RUSTFLAGS='-C target-feature=+aes,+avx,+avx2,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+avx512f,+avx512cd,+avx512bw,+avx512dq,+avx512vl' cargo build ${{ matrix.features }} --profile release-prod --target ${{ matrix.arch }} - name: Calculate checksum and rename binary if: contains(matrix.arch, 'windows') == false shell: bash run: | cd target/${{ matrix.arch }}/release-prod chmod +x openobserve tar -zcvf ${{ matrix.file_name }}.tar.gz openobserve echo $(shasum -a 256 ${{ matrix.file_name }}.tar.gz | cut -f1 -d' ') > ${{ matrix.file_name }}.tar.gz.sha256sum - name: Calculate checksum and rename binary for windows if: contains(matrix.arch, 'windows') shell: bash run: | cd target/${{ matrix.arch }}/release-prod 7z a -tzip ${{ matrix.file_name }}.zip openobserve.exe certutil.exe -hashfile ${{ matrix.file_name }}.zip sha256|head -n 2|tail -n 1 > ${{ matrix.file_name }}.zip.sha256sum - name: Upload artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.file_name }} path: target/${{ matrix.arch }}/release-prod/${{ matrix.file_name }}${{ matrix.file_ext }} - name: Upload checksum of artifacts uses: actions/upload-artifact@v4 with: name: ${{ matrix.file_name }}.sha256sum path: target/${{ matrix.arch }}/release-prod/${{ matrix.file_name }}${{ matrix.file_ext }}.sha256sum release: name: Release artifacts needs: [build] runs-on: eks-openobserve-standard-4 permissions: id-token: write contents: write steps: - name: Checkout sources uses: actions/checkout@v5 with: fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v5 - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@e1253824e5c10ff9df46874f81ed3ec929e19cfd # v6.3.0 with: role-to-assume: arn:aws:iam::325553860333:role/github-actions-s3-uploader role-session-name: GithubActionsSession aws-region: us-east-2 - name: Upload to S3 env: BUCKET: ${{ vars.AWS_S3_BUCKET_NAME }} run: | if ! command -v aws &> /dev/null; then echo "AWS CLI not found. Installing..." curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install else echo "AWS CLI already installed." fi echo "Uploading artifacts to S3..." for file in $(find . -type f \( -name "openobserve*.tar.gz" -o -name "*.zip" -o -name "openobserve*.sha256sum" \)); do echo "Uploading $file to s3://${BUCKET}/releases/openobserve/${GITHUB_REF_NAME}/" aws s3 cp "$file" "s3://${BUCKET}/releases/openobserve/${GITHUB_REF_NAME}/$(basename "$file")" done - name: Generate release body with Download Url id: generate-body run: | echo "📦 Download Binaries from https://openobserve.ai/downloads" > release_body.md echo "body<> $GITHUB_OUTPUT cat release_body.md >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT - name: Publish release uses: softprops/action-gh-release@efb35369e0ad2afab669f228072c1b0d510eae64 # v3.0.3 with: token: ${{ secrets.GITHUB_TOKEN }} name: "Release ${{ github.ref_name }}" generate_release_notes: true body: ${{ steps.generate-body.outputs.body }} - name: Send release notification to Strapi uses: actions/github-script@v9 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | // Get release info from workflow dispatch inputs const tag = context.ref.replace("refs/tags/", ""); const { data: release } = await github.rest.repos.getReleaseByTag({ owner: context.repo.owner, repo: context.repo.repo, tag: tag }); function cleanChangelog(changelog) { if (!changelog) return ''; const lines = changelog.split(/\r?\n/); const result = []; for (const line of lines) { if (line.toLowerCase().includes('new contributors')) break; if (line.toLowerCase().includes('full changelog')) continue; if (line.toLowerCase().includes('download binaries from')) continue; const cleanedLine = line.replace(/by\s+@[\w-]+.*$/i, '').replace(/@\w+/g, '').replace(/\bhttps?:\/\/\S+/gi, '').trim(); if (cleanedLine.length > 0) result.push(cleanedLine); } return result.join('\n'); } const cleanedBody = cleanChangelog(release.body); const payload = { version: release.tag_name, release_name: release.name, release_url: release.html_url, changelog: cleanedBody || 'No release notes provided', type: 'PUBLIC', date: release.published_at }; try { const response = await fetch(`${process.env.STRAPI_WEBHOOK_URL}/api/github-releases?status=published`, { method: 'POST', headers: { 'Authorization': `Bearer ${process.env.STRAPI_API_TOKEN}`, 'Content-Type': 'application/json' }, body: JSON.stringify({data: payload}) }); if (!response.ok) { throw new Error(`Webhook request failed: ${response.status} ${response.statusText}`); } console.log('Response status:', response.status); } catch (error) { console.error('Failed to send webhook notification:', error); core.setFailed(error.message); } env: STRAPI_WEBHOOK_URL: ${{ secrets.STRAPI_WEBHOOK_URL }} STRAPI_API_TOKEN: ${{ secrets.STRAPI_API_TOKEN }}