name: build-release run-name: build-release ${{ inputs.version && format('v{0}', inputs.version) || github.ref_name }} on: push: tags: - "v*" workflow_dispatch: inputs: version: description: "Release version (e.g. 1.1.95)" required: false type: string concurrency: build-release-${{ github.ref }} permissions: contents: write jobs: build: runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: oven-sh/setup-bun@v2 - name: Install zip utility run: sudo apt-get update && sudo apt-get install -y zip - name: Install dependencies run: | bun install mkdir -p packages/opencode/node_modules/@opentui for pkg in solid core; do if [ ! -e packages/opencode/node_modules/@opentui/$pkg ]; then ln -s "$(pwd)/node_modules/@opentui/$pkg" packages/opencode/node_modules/@opentui/$pkg echo "Linked @opentui/$pkg" fi done - name: Read version id: version run: | if [ -n "${{ inputs.version }}" ]; then echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT else TAG="${GITHUB_REF#refs/tags/}" echo "version=${TAG#v}" >> $GITHUB_OUTPUT fi - name: Build all targets working-directory: packages/opencode run: bun run script/build.ts env: OPENCODE_VERSION: ${{ steps.version.outputs.version }} - name: List dist directories run: ls -la packages/opencode/dist/ - name: Copy bundled models.json run: | cd packages/opencode for dir in dist/*/; do mkdir -p "${dir}bin/assets" cp assets/models.json "${dir}bin/assets/" echo "Copied models.json to ${dir}bin/assets/" done - name: Create archives run: | cd packages/opencode # 统一从前一步解析出的版本号命名产物,避免不同版本构建时文件名冲突。 VERSION="${{ steps.version.outputs.version }}" # 归档名称示例:qimingcode-darwin-arm64-v1.1.95.tar.gz for dir in dist/*/; do name=$(basename "$dir") echo "--- Archiving $name ---" tar czf "${{ github.workspace }}/${name}-v${VERSION}.tar.gz" -C "${dir}bin" . if [[ "$name" == *windows* ]]; then (cd "${dir}bin" && zip -r "${{ github.workspace }}/${name}-v${VERSION}.zip" .) fi done - name: List archives run: ls -lh ${{ github.workspace }}/*.tar.gz ${{ github.workspace }}/*.zip - name: Upload artifacts uses: actions/upload-artifact@v4 with: # 在 Actions 页面直接看到版本号,便于区分同一分支多次构建结果。 name: all-platforms-v${{ steps.version.outputs.version }} retention-days: 1 path: | ${{ github.workspace }}/*.tar.gz ${{ github.workspace }}/*.zip release: needs: build if: always() && needs.build.result == 'success' runs-on: ubuntu-24.04 steps: - uses: actions/checkout@v4 - uses: actions/download-artifact@v4 with: path: artifacts - name: List artifacts run: find artifacts -type f | sort - name: Determine version id: version run: | if [ -n "${{ inputs.version }}" ]; then echo "version=${{ inputs.version }}" >> $GITHUB_OUTPUT else TAG="${GITHUB_REF#refs/tags/}" echo "version=${TAG#v}" >> $GITHUB_OUTPUT fi - name: Create/update GitHub Release env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | VERSION="${{ steps.version.outputs.version }}" TAG="v${VERSION}" if gh release view "$TAG" 2>/dev/null; then echo "Release $TAG already exists, updating assets..." else echo "Creating release $TAG..." gh release create "$TAG" --title "$TAG" --notes "qimingcode $TAG" fi find artifacts -type f \( -name "*.tar.gz" -o -name "*.zip" \) | while read file; do echo "Uploading: $file" gh release upload "$TAG" "$file" --clobber done echo "=== Release $TAG assets ===" gh release view "$TAG" --json assets --jq '.assets[] | "\(.name) \(.size)"'