diff --git a/.github/workflows/multi-lang-tests.yml b/.github/workflows/multi-lang-tests.yml index 792ed36b75..6da0a658dd 100644 --- a/.github/workflows/multi-lang-tests.yml +++ b/.github/workflows/multi-lang-tests.yml @@ -52,121 +52,6 @@ jobs: run-multi-lang-tests: name: Run Multi-language SDK Tests needs: build-greptimedb - runs-on: ubuntu-latest - timeout-minutes: 30 - steps: - - name: Checkout greptimedb-tests repository - uses: actions/checkout@v4 - with: - repository: GreptimeTeam/greptimedb-tests - persist-credentials: false - - - name: Download pre-built greptime binary - uses: actions/download-artifact@v4 - with: - name: greptime-bin - path: bin - - - name: Setup greptime binary - run: | - chmod +x ./bin/greptime - ls -lh ./bin/greptime - ./bin/greptime --version - - - name: Setup Java 17 - uses: actions/setup-java@v4 - with: - distribution: 'temurin' - java-version: '17' - cache: 'maven' - - - name: Setup Python 3.8 - uses: actions/setup-python@v5 - with: - python-version: '3.8' - - - name: Setup Go 1.24 - uses: actions/setup-go@v5 - with: - go-version: '1.24' - cache: true - cache-dependency-path: go-tests/go.sum - - - name: Install Python dependencies - run: | - pip install mysql-connector-python psycopg2-binary - python3 -c "import mysql.connector; print(f'mysql-connector-python {mysql.connector.__version__}')" - python3 -c "import psycopg2; print(f'psycopg2 {psycopg2.__version__}')" - - - name: Install Go dependencies - working-directory: go-tests - run: | - go mod download - go mod verify - go version - - - name: Kill existing GreptimeDB processes - run: | - pkill -f greptime || true - sleep 2 - - - name: Start GreptimeDB standalone - run: | - ./bin/greptime standalone start \ - --http-addr 0.0.0.0:4000 \ - --rpc-addr 0.0.0.0:4001 \ - --mysql-addr 0.0.0.0:4002 \ - --postgres-addr 0.0.0.0:4003 \ - --user-provider=static_user_provider:cmd:greptime_user=greptime_pwd > /tmp/greptimedb.log 2>&1 & - - - name: Wait for GreptimeDB to be ready - run: | - echo "Waiting for GreptimeDB..." - for i in {1..60}; do - if curl -sf http://localhost:4000/health > /dev/null; then - echo "✅ GreptimeDB is ready" - exit 0 - fi - sleep 2 - done - echo "❌ GreptimeDB failed to start" - cat /tmp/greptimedb.log - exit 1 - - - name: Run multi-language tests - env: - DB_NAME: test_db - MYSQL_HOST: localhost - MYSQL_PORT: 4002 - POSTGRES_HOST: localhost - POSTGRES_PORT: 4003 - HTTP_PORT: 4000 - GREPTIME_USERNAME: greptime_user - GREPTIME_PASSWORD: greptime_pwd - run: | - chmod +x ./run_tests.sh - ./run_tests.sh - - - name: Collect logs on failure - if: failure() - run: | - echo "=== GreptimeDB Logs ===" - cat /tmp/greptimedb.log || true - - - name: Upload test logs on failure - if: failure() - uses: actions/upload-artifact@v4 - with: - name: test-logs - path: | - /tmp/greptimedb.log - java-tests/target/surefire-reports/ - python-tests/.pytest_cache/ - go-tests/*.log - **/test-output/ - retention-days: 7 - - - name: Cleanup - if: always() - run: | - pkill -f greptime || true + uses: ./.github/workflows/run-multi-lang-tests.yml + with: + artifact-name: greptime-bin diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml index 6640d1d3df..710a767334 100644 --- a/.github/workflows/nightly-build.yml +++ b/.github/workflows/nightly-build.yml @@ -174,6 +174,18 @@ jobs: image-registry: ${{ vars.ECR_IMAGE_REGISTRY }} image-namespace: ${{ vars.ECR_IMAGE_NAMESPACE }} + run-multi-lang-tests: + name: Run Multi-language SDK Tests + if: ${{ inputs.build_linux_amd64_artifacts || github.event_name == 'schedule' }} + needs: [ + allocate-runners, + build-linux-amd64-artifacts, + ] + uses: ./.github/workflows/run-multi-lang-tests.yml + with: + artifact-name: greptime-linux-amd64-${{ needs.allocate-runners.outputs.version }} + artifact-is-tarball: true + release-images-to-dockerhub: name: Build and push images to DockerHub if: ${{ inputs.release_images || github.event_name == 'schedule' }} @@ -301,7 +313,8 @@ jobs: if: ${{ github.repository == 'GreptimeTeam/greptimedb' && always() }} # Not requiring successful dependent jobs, always run. name: Send notification to Greptime team needs: [ - release-images-to-dockerhub + release-images-to-dockerhub, + run-multi-lang-tests, ] runs-on: ubuntu-latest permissions: @@ -319,17 +332,17 @@ jobs: run: pnpm tsx bin/report-ci-failure.ts env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CI_REPORT_STATUS: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result == 'success' }} + CI_REPORT_STATUS: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result == 'success' && (needs.run-multi-lang-tests.result == 'success' || needs.run-multi-lang-tests.result == 'skipped') }} - name: Notify nightly build successful result uses: slackapi/slack-github-action@v1.23.0 - if: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result == 'success' }} + if: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result == 'success' && (needs.run-multi-lang-tests.result == 'success' || needs.run-multi-lang-tests.result == 'skipped') }} with: payload: | {"text": "GreptimeDB's ${{ env.NEXT_RELEASE_VERSION }} build has completed successfully."} - name: Notify nightly build failed result uses: slackapi/slack-github-action@v1.23.0 - if: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result != 'success' }} + if: ${{ needs.release-images-to-dockerhub.outputs.nightly-build-result != 'success' || needs.run-multi-lang-tests.result == 'failure' }} with: payload: | {"text": "GreptimeDB's ${{ env.NEXT_RELEASE_VERSION }} build has failed, please check ${{ steps.report-ci-status.outputs.html_url }}."} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bc9da93b9c..614500fab1 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -215,6 +215,18 @@ jobs: image-registry: ${{ vars.ECR_IMAGE_REGISTRY }} image-namespace: ${{ vars.ECR_IMAGE_NAMESPACE }} + run-multi-lang-tests: + name: Run Multi-language SDK Tests + if: ${{ inputs.build_linux_amd64_artifacts || github.event_name == 'push' || github.event_name == 'schedule' }} + needs: [ + allocate-runners, + build-linux-amd64-artifacts, + ] + uses: ./.github/workflows/run-multi-lang-tests.yml + with: + artifact-name: greptime-linux-amd64-${{ needs.allocate-runners.outputs.version }} + artifact-is-tarball: true + build-macos-artifacts: name: Build macOS artifacts strategy: @@ -303,6 +315,7 @@ jobs: allocate-runners, build-linux-amd64-artifacts, build-linux-arm64-artifacts, + run-multi-lang-tests, ] runs-on: ubuntu-latest outputs: @@ -381,6 +394,7 @@ jobs: build-macos-artifacts, build-windows-artifacts, release-images-to-dockerhub, + run-multi-lang-tests, ] runs-on: ubuntu-latest steps: diff --git a/.github/workflows/run-multi-lang-tests.yml b/.github/workflows/run-multi-lang-tests.yml new file mode 100644 index 0000000000..f744d7a644 --- /dev/null +++ b/.github/workflows/run-multi-lang-tests.yml @@ -0,0 +1,194 @@ +# Reusable workflow for running multi-language SDK tests against GreptimeDB +# Used by: multi-lang-tests.yml, release.yml, nightly-build.yml +# Supports both direct binary artifacts and tarball artifacts + +name: Run Multi-language SDK Tests + +on: + workflow_call: + inputs: + artifact-name: + required: true + type: string + description: 'Name of the artifact containing greptime binary' + http-port: + required: false + type: string + default: '4000' + description: 'HTTP server port' + mysql-port: + required: false + type: string + default: '4002' + description: 'MySQL server port' + postgres-port: + required: false + type: string + default: '4003' + description: 'PostgreSQL server port' + db-name: + required: false + type: string + default: 'test_db' + description: 'Test database name' + username: + required: false + type: string + default: 'greptime_user' + description: 'Authentication username' + password: + required: false + type: string + default: 'greptime_pwd' + description: 'Authentication password' + timeout-minutes: + required: false + type: number + default: 30 + description: 'Job timeout in minutes' + artifact-is-tarball: + required: false + type: boolean + default: false + description: 'Whether the artifact is a tarball (tar.gz) that needs to be extracted' + +jobs: + run-tests: + name: Run Multi-language SDK Tests + runs-on: ubuntu-latest + timeout-minutes: ${{ inputs.timeout-minutes }} + steps: + - name: Checkout greptimedb-tests repository + uses: actions/checkout@v4 + with: + repository: GreptimeTeam/greptimedb-tests + persist-credentials: false + + - name: Download pre-built greptime binary + uses: actions/download-artifact@v4 + with: + name: ${{ inputs.artifact-name }} + path: artifact + + - name: Setup greptime binary + run: | + mkdir -p bin + if [ "${{ inputs.artifact-is-tarball }}" = "true" ]; then + # Extract tarball and find greptime binary + tar -xzf artifact/*.tar.gz -C artifact + find artifact -name "greptime" -type f -exec cp {} bin/greptime \; + else + # Direct binary format + if [ -f artifact/greptime ]; then + cp artifact/greptime bin/greptime + else + cp artifact/* bin/greptime + fi + fi + chmod +x ./bin/greptime + ls -lh ./bin/greptime + ./bin/greptime --version + + - name: Setup Java 17 + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: '17' + cache: 'maven' + + - name: Setup Python 3.8 + uses: actions/setup-python@v5 + with: + python-version: '3.8' + + - name: Setup Go 1.24 + uses: actions/setup-go@v5 + with: + go-version: '1.24' + cache: true + cache-dependency-path: go-tests/go.sum + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + + - name: Install Python dependencies + run: | + pip install mysql-connector-python psycopg2-binary + python3 -c "import mysql.connector; print(f'mysql-connector-python {mysql.connector.__version__}')" + python3 -c "import psycopg2; print(f'psycopg2 {psycopg2.__version__}')" + + - name: Install Go dependencies + working-directory: go-tests + run: | + go mod download + go mod verify + go version + + - name: Kill existing GreptimeDB processes + run: | + pkill -f greptime || true + sleep 2 + + - name: Start GreptimeDB standalone + run: | + ./bin/greptime standalone start \ + --http-addr 0.0.0.0:${{ inputs.http-port }} \ + --rpc-addr 0.0.0.0:4001 \ + --mysql-addr 0.0.0.0:${{ inputs.mysql-port }} \ + --postgres-addr 0.0.0.0:${{ inputs.postgres-port }} \ + --user-provider=static_user_provider:cmd:${{ inputs.username }}=${{ inputs.password }} > /tmp/greptimedb.log 2>&1 & + + - name: Wait for GreptimeDB to be ready + run: | + echo "Waiting for GreptimeDB..." + for i in {1..60}; do + if curl -sf http://localhost:${{ inputs.http-port }}/health > /dev/null; then + echo "✅ GreptimeDB is ready" + exit 0 + fi + sleep 2 + done + echo "❌ GreptimeDB failed to start" + cat /tmp/greptimedb.log + exit 1 + + - name: Run multi-language tests + env: + DB_NAME: ${{ inputs.db-name }} + MYSQL_HOST: 127.0.0.1 + MYSQL_PORT: ${{ inputs.mysql-port }} + POSTGRES_HOST: 127.0.0.1 + POSTGRES_PORT: ${{ inputs.postgres-port }} + HTTP_HOST: 127.0.0.1 + HTTP_PORT: ${{ inputs.http-port }} + GREPTIME_USERNAME: ${{ inputs.username }} + GREPTIME_PASSWORD: ${{ inputs.password }} + run: | + chmod +x ./run_tests.sh + ./run_tests.sh + + - name: Collect logs on failure + if: failure() + run: | + echo "=== GreptimeDB Logs ===" + cat /tmp/greptimedb.log || true + + - name: Upload test logs on failure + if: failure() + uses: actions/upload-artifact@v4 + with: + name: test-logs + path: | + /tmp/greptimedb.log + java-tests/target/surefire-reports/ + python-tests/.pytest_cache/ + go-tests/*.log + **/test-output/ + retention-days: 7 + + - name: Cleanup + if: always() + run: | + pkill -f greptime || true