# Workflow that builds and tests the CLI binary executable name: CLI - Build binary and optionally release # Run on pushes to main branch and CLI tags, and on pull requests when CLI files change on: push: branches: - main tags: - "*-cli" pull_request: paths: - "openhands-cli/**" permissions: contents: write # needed to create releases or upload assets # Cancel previous runs if a new commit is pushed concurrency: group: ${{ github.workflow }}-${{ (github.head_ref && github.ref) || github.run_id }} cancel-in-progress: true jobs: build-binary: name: Build binary executable strategy: matrix: include: # Build on Ubuntu 22.04 for maximum GLIBC compatibility (GLIBC 2.31) - os: ubuntu-22.04 platform: linux artifact_name: openhands-cli-linux # Build on macOS for macOS users - os: macos-15 platform: macos artifact_name: openhands-cli-macos runs-on: ${{ matrix.os }} steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v5 with: python-version: 3.12 - name: Install uv uses: astral-sh/setup-uv@v3 with: version: "latest" - name: Install dependencies working-directory: openhands-cli run: | uv sync - name: Build binary executable working-directory: openhands-cli run: | ./build.sh --install-pyinstaller | tee output.log echo "Full output:" cat output.log if grep -q "❌" output.log; then echo "❌ Found failure marker in output" exit 1 fi echo "✅ Build & test finished without ❌ markers" - name: Verify binary files exist run: | if ! ls openhands-cli/dist/openhands* 1> /dev/null 2>&1; then echo "❌ No binaries found to upload!" exit 1 fi echo "✅ Found binaries to upload." - name: Upload binary artifact uses: actions/upload-artifact@v4 with: name: ${{ matrix.artifact_name }} path: openhands-cli/dist/openhands* retention-days: 30 create-github-release: name: Create GitHub Release runs-on: ubuntu-latest needs: build-binary if: startsWith(github.ref, 'refs/tags/') steps: - name: Checkout repository uses: actions/checkout@v4 - name: Download all artifacts uses: actions/download-artifact@v4 with: path: artifacts - name: Prepare release assets run: | mkdir -p release-assets # Copy binaries with appropriate names for release if [ -f artifacts/openhands-cli-linux/openhands ]; then cp artifacts/openhands-cli-linux/openhands release-assets/openhands-linux fi if [ -f artifacts/openhands-cli-macos/openhands ]; then cp artifacts/openhands-cli-macos/openhands release-assets/openhands-macos fi ls -la release-assets/ - name: Create GitHub Release uses: softprops/action-gh-release@v2 with: files: release-assets/* draft: true prerelease: false env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}