Files
hatchet/.github/workflows/sdk-ruby.yml
dependabot[bot] 7420100a25 chore(deps): bump ruby/setup-ruby from 1.288.0 to 1.289.0 (#3168)
Bumps [ruby/setup-ruby](https://github.com/ruby/setup-ruby) from 1.288.0 to 1.289.0.
- [Release notes](https://github.com/ruby/setup-ruby/releases)
- [Changelog](https://github.com/ruby/setup-ruby/blob/master/release.rb)
- [Commits](09a7688d3b...19a43a6a24)

---
updated-dependencies:
- dependency-name: ruby/setup-ruby
  dependency-version: 1.289.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-03-05 04:24:14 +00:00

271 lines
9.5 KiB
YAML

name: ruby
on:
workflow_dispatch:
pull_request:
paths:
- ".github/**"
- "sdks/ruby/**"
push:
branches:
- main
paths:
- "sdks/ruby/**"
defaults:
run:
working-directory: ./sdks/ruby/src
jobs:
lint:
runs-on: ubicloud-standard-4
steps:
- name: Checkout code
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Set up Ruby
uses: ruby/setup-ruby@19a43a6a2428d455dbd1b85344698725179c9d8c # v1.289.0
with:
ruby-version: "3.2"
bundler-cache: true
working-directory: ./sdks/ruby/src
- name: Run RuboCop
run: bundle exec rubocop
- name: Run RBS validate
run: rbs -I sig validate
- name: Test gem build
run: gem build hatchet-sdk.gemspec
test:
runs-on: ubicloud-standard-4
strategy:
matrix:
ruby-version: ${{ github.event_name == 'pull_request' && fromJSON('["3.2"]') || fromJSON('["3.2", "3.3"]') }}
optimistic-scheduling: ["true", "false"]
timeout-minutes: 20
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- name: Install Protoc
uses: arduino/setup-protoc@c65c819552d16ad3c9b72d9dfd5ba5237b9c906b # v3.0.0
with:
version: "25.1"
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Install Task
uses: arduino/setup-task@b91d5d2c96a56797b48ac1e0e89220bf64044611 # v2.0.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Go
uses: actions/setup-go@4b73464bb391d4059bd26b0524d20df3927bd417 # v6.3.0
with:
go-version: "1.25"
- name: Start Docker dependencies
working-directory: .
run: docker compose up -d
- name: Generate
working-directory: .
run: |
export DATABASE_URL="postgresql://hatchet:hatchet@127.0.0.1:5431/hatchet"
go run ./cmd/hatchet-migrate
- name: Setup
working-directory: .
run: |
export SEED_DEVELOPMENT=true
export SERVER_PORT=8080
export SERVER_URL=http://localhost:8080
export SERVER_AUTH_COOKIE_DOMAIN=localhost
export SERVER_AUTH_COOKIE_INSECURE=true
export SERVER_DEFAULT_ENGINE_VERSION=V1
export SERVER_MSGQUEUE_RABBITMQ_URL="amqp://user:password@localhost:5672/"
export SERVER_OPTIMISTIC_SCHEDULING_ENABLED=${{ matrix.optimistic-scheduling }}
go run ./cmd/hatchet-admin quickstart
go run ./cmd/hatchet-engine --config ./generated/ > engine.log 2>&1 &
go run ./cmd/hatchet-api --config ./generated/ > api.log 2>&1 &
sleep 30
- name: Set up Ruby ${{ matrix.ruby-version }}
uses: ruby/setup-ruby@19a43a6a2428d455dbd1b85344698725179c9d8c # v1.289.0
with:
ruby-version: ${{ matrix.ruby-version }}
bundler-cache: true
working-directory: ./sdks/ruby/src
- name: Display Ruby version
run: ruby -v
- name: Generate Env File
working-directory: .
run: |
echo "HATCHET_CLIENT_TOKEN=$(go run ./cmd/hatchet-admin token create --config ./generated/ --tenant-id 707d0855-80ab-4e1f-a156-f1c4546cbf52)" >> $GITHUB_ENV
echo "HATCHET_CLIENT_TLS_ROOT_CA_FILE=../../../certs/ca.cert" >> $GITHUB_ENV
echo "HATCHET_CLIENT_WORKER_HEALTHCHECK_ENABLED=true" >> $GITHUB_ENV
- name: Set HATCHET_CLIENT_NAMESPACE
run: |
RUBY_VER=$(ruby -e "puts \"rb#{RUBY_VERSION.gsub('.','')[0..1]}\"")
SHORT_SHA=$(git rev-parse --short HEAD)
echo "HATCHET_CLIENT_NAMESPACE=${RUBY_VER}-${SHORT_SHA}" >> $GITHUB_ENV
- name: Run unit tests
run: |
echo "Using HATCHET_CLIENT_NAMESPACE: $HATCHET_CLIENT_NAMESPACE"
bundle exec rspec --format documentation --tag ~integration
- name: Run integration tests
run: bundle exec rspec spec/integration/ --format documentation --tag integration
- name: Set up Ruby for examples
uses: ruby/setup-ruby@19a43a6a2428d455dbd1b85344698725179c9d8c # v1.289.0
with:
ruby-version: ${{ matrix.ruby-version }}
bundler-cache: true
working-directory: ./sdks/ruby/examples
- name: Wait for API readiness
working-directory: .
run: |
echo "Waiting for API at http://localhost:8080/api/ready..."
for i in $(seq 1 60); do
if curl -sf http://localhost:8080/api/ready > /dev/null 2>&1; then
echo "API ready after ${i}s"
break
fi
if [ "$i" -eq 60 ]; then
echo "API did not become ready within 60s"
tail -n 50 engine.log 2>/dev/null || true
tail -n 50 api.log 2>/dev/null || true
exit 1
fi
sleep 1
done
sleep 5
- name: Start example worker and wait for health
working-directory: ./sdks/ruby/examples
run: |
export HATCHET_CLIENT_WORKER_HEALTHCHECK_PORT=8001
stdbuf -o0 -e0 bundle exec ruby worker.rb > worker.log 2>&1 &
WORKER_PID=$!
echo "Worker started with PID $WORKER_PID"
MAX_WAIT=45
POLL_INTERVAL=1
echo "Waiting 5s for worker to initialize..."
sleep 5
for i in $(seq 1 $MAX_WAIT); do
if ! kill -0 "$WORKER_PID" 2>/dev/null; then
echo "Worker process (PID $WORKER_PID) exited before becoming healthy"
echo "=== worker.log ==="
cat worker.log || true
echo "=== tail engine.log ==="
tail -n 80 "$GITHUB_WORKSPACE/engine.log" 2>/dev/null || true
echo "=== tail api.log ==="
tail -n 80 "$GITHUB_WORKSPACE/api.log" 2>/dev/null || true
exit 1
fi
if curl -sf http://localhost:8001/health > /dev/null 2>&1; then
echo "Worker is healthy after ${i}s"
exit 0
fi
if [ $((i % 5)) -eq 0 ]; then
echo "Still waiting for worker health... ${i}s/${MAX_WAIT}s"
echo "--- worker.log (last 25 lines) ---"
tail -n 25 worker.log 2>/dev/null || true
echo "--- engine.log (last 25 lines) ---"
tail -n 25 "$GITHUB_WORKSPACE/engine.log" 2>/dev/null || true
echo "--- api.log (last 25 lines) ---"
tail -n 25 "$GITHUB_WORKSPACE/api.log" 2>/dev/null || true
fi
sleep $POLL_INTERVAL
done
echo "Worker failed to become healthy within ${MAX_WAIT}s"
echo "=== worker.log ==="
cat worker.log || true
echo "=== tail engine.log ==="
tail -n 80 "$GITHUB_WORKSPACE/engine.log" 2>/dev/null || true
echo "=== tail api.log ==="
tail -n 80 "$GITHUB_WORKSPACE/api.log" 2>/dev/null || true
exit 1
- name: Run e2e tests
working-directory: ./sdks/ruby/examples
run: bundle exec rspec -f d --fail-fast
- name: Upload worker logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: ${{ env.HATCHET_CLIENT_NAMESPACE }}-opt-${{ matrix.optimistic-scheduling }}-worker-logs
path: ./sdks/ruby/examples/worker.log
- name: Upload engine logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: ${{ env.HATCHET_CLIENT_NAMESPACE }}-opt-${{ matrix.optimistic-scheduling }}-engine-logs
path: engine.log
- name: Upload API logs
if: always()
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
with:
name: ${{ env.HATCHET_CLIENT_NAMESPACE }}-opt-${{ matrix.optimistic-scheduling }}-api-logs
path: api.log
publish:
runs-on: ubicloud-standard-4
needs: [lint, test]
if: github.ref == 'refs/heads/main'
permissions:
contents: write
id-token: write
steps:
- name: Checkout Repository
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
submodules: recursive
- name: Set up Ruby
uses: ruby/setup-ruby@19a43a6a2428d455dbd1b85344698725179c9d8c # v1.289.0
with:
ruby-version: "3.2"
bundler-cache: true
working-directory: ./sdks/ruby/src
- name: Check if version changed
id: version_check
run: |
NEW_VERSION=$(ruby -e "require_relative 'lib/hatchet/version'; puts Hatchet::VERSION")
CURRENT_VERSION=$(gem info hatchet-sdk --remote --exact 2>/dev/null | grep -oP 'hatchet-sdk \(\K[^)]+' || echo "0.0.0")
if [ "$CURRENT_VERSION" == "$NEW_VERSION" ]; then
echo "Version has not changed ($NEW_VERSION). Skipping publish."
echo "should_publish=false" >> "$GITHUB_OUTPUT"
else
echo "Publishing version $NEW_VERSION (current: $CURRENT_VERSION)"
echo "should_publish=true" >> "$GITHUB_OUTPUT"
fi
- name: Configure RubyGems credentials
if: steps.version_check.outputs.should_publish == 'true'
uses: rubygems/configure-rubygems-credentials@main
- name: Publish to RubyGems
if: steps.version_check.outputs.should_publish == 'true'
run: |
gem build hatchet-sdk.gemspec
NEW_VERSION=$(ruby -e "require_relative 'lib/hatchet/version'; puts Hatchet::VERSION")
gem push hatchet-sdk-${NEW_VERSION}.gem