From 17c9393b98d0c665d17dba61f4d813240849b5c0 Mon Sep 17 00:00:00 2001 From: Claudia CLI Bot Date: Tue, 31 Mar 2026 05:16:06 +0000 Subject: [PATCH] feat: Improve release workflow with install script, checksums and better packaging --- .gitea/workflows/release.yml | 171 ++++++++++++++++++++++++++--------- 1 file changed, 130 insertions(+), 41 deletions(-) diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 33f6903..9b92236 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -4,11 +4,20 @@ on: push: tags: - 'v*' + workflow_dispatch: + inputs: + version: + description: 'Version tag (e.g., v1.0.0)' + required: false + type: string + +env: + BINARY_NAME: claudia-docs + GO_VERSION: '1.22' jobs: build: runs-on: ubuntu-latest - # ← cada job corre dentro de esta imagen container: image: golang:1.22-alpine @@ -17,106 +26,186 @@ jobs: include: - goos: linux goarch: amd64 - suffix: "" + ext: '' - goos: linux goarch: arm64 - suffix: "" + ext: '' - goos: windows goarch: amd64 - suffix: ".exe" + ext: '.exe' - goos: darwin goarch: amd64 - suffix: "" + ext: '' - goos: darwin goarch: arm64 - suffix: "" + ext: '' steps: - - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Compilar + - name: Get version + id: version + run: | + VERSION=${{ github.event.inputs.version || github.ref_name }} + echo "version=${VERSION#v}" >> $GITHUB_OUTPUT + echo "tag=$VERSION" >> $GITHUB_OUTPUT + + - name: Build env: GOOS: ${{ matrix.goos }} GOARCH: ${{ matrix.goarch }} CGO_ENABLED: 0 run: | - BINARY_NAME="app-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.suffix }}" + BINARY="{{ env.BINARY_NAME }}-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}" mkdir -p dist - go build \ - -ldflags="-w -s \ - -X main.version=${{ gitea.ref_name }} \ - -X main.commit=${{ gitea.sha }}" \ - -o "dist/${BINARY_NAME}" \ - ./cmd/main.go + go build -ldflags="\ + -w -s \ + -X main.version=${{ steps.version.outputs.version }} \ + -X main.commit=$(git rev-parse --short HEAD) \ + -X main.date=$(date -u +%Y-%m-%dT%H:%M:%SZ)" \ + -o "dist/${BINARY}" \ + ./cmd/claudia-docs - - name: Comprimir + - name: Package run: | cd dist - BINARY_NAME="app-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.suffix }}" - if [ "${{ matrix.goos }}" = "windows" ]; then - apk add --no-cache zip - zip "${BINARY_NAME%.exe}.zip" "${BINARY_NAME}" - else - tar -czf "${BINARY_NAME}.tar.gz" "${BINARY_NAME}" - fi + BINARY="{{ env.BINARY_NAME }}-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.ext }}" + + case "${{ matrix.goos }}" in + windows) + apk add --no-cache zip + zip "${BINARY}.zip" "${BINARY}" + ;; + darwin|linux) + tar -czf "${BINARY}.tar.gz" "${BINARY}" + ;; + esac - - name: Subir artefacto temporal + - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: bin-${{ matrix.goos }}-${{ matrix.goarch }} - path: dist/*.tar.gz - retention-days: 1 + name: ${{ matrix.goos }}-${{ matrix.goarch }} + path: dist/* + retention-days: 5 release: runs-on: ubuntu-latest needs: build + if: startsWith(github.ref, 'refs/tags/v') || github.event.inputs.version != '' container: image: alpine:3.19 steps: - - name: Instalar dependencias - run: apk add --no-cache git + - name: Setup + run: apk add --no-cache git curl - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Descargar artefactos + - name: Get version + id: version + run: | + VERSION=${{ github.event.inputs.version || github.ref_name }} + echo "version=${VERSION#v}" >> $GITHUB_OUTPUT + echo "tag=$VERSION" >> $GITHUB_OUTPUT + + - name: Download artifacts uses: actions/download-artifact@v4 with: path: dist/ merge-multiple: true - - name: Generar changelog + - name: Generate changelog + id: changelog run: | PREV_TAG=$(git tag --sort=-version:refname | sed -n '2p') if [ -z "$PREV_TAG" ]; then - git log --pretty=format:"- %s (%h)" | head -20 > changelog.txt + echo "# Changes (full history)" > changelog.md + git log --pretty=format:"- %s (%h)" -20 >> changelog.md else - git log "${PREV_TAG}..${{ gitea.ref_name }}" \ - --pretty=format:"- %s (%h)" > changelog.txt + echo "# Changes since ${PREV_TAG}" > changelog.md + git log "${PREV_TAG}..${{ steps.version.outputs.tag }}" \ + --pretty=format="- %s (%h)" >> changelog.md fi - cat changelog.txt + cat changelog.md - - name: Crear checksums + - name: Generate checksums run: | cd dist sha256sum * > checksums.txt cat checksums.txt - - name: Crear Release + - name: Generate install script + run: | + cat > install.sh << 'INSTALL_SCRIPT' + #!/bin/bash + set -e + + VERSION="${VERSION:-latest}" + BINARY="claudia-docs" + + # Detect OS + OS="$(uname -s | tr '[:upper:]' '[:lower:]')" + ARCH="$(uname -m)" + + # Map architecture + case "$ARCH" in + x86_64) ARCH="amd64" ;; + aarch64|arm64) ARCH="arm64" ;; + esac + + # Map macOS + [ "$OS" = "darwin" ] && OS="darwin" + + # Download + URL="https://gitea.danielarroyo.cl/proyectos/claudia-docs-cli/releases/download/${VERSION}/claudia-docs-${OS}-${ARCH}" + + echo "Installing Claudia Docs CLI ${VERSION}..." + echo "Downloading from: ${URL}" + + curl -fsSL "${URL}" -o "${BINARY}" || { + echo "Error: Failed to download binary" + exit 1 + } + + chmod +x "${BINARY}" + + # Install + if [ -w /usr/local/bin ]; then + mv "${BINARY}" /usr/local/bin/ + echo "Installed to /usr/local/bin/claudia-docs" + else + echo "Installed to ./claudia-docs (not in PATH)" + fi + + echo "Done!" + INSTALL_SCRIPT + chmod +x install.sh + + - name: Create Release uses: https://gitea.com/actions/gitea-release-action@v1 with: token: ${{ secrets.RELEASE_TOKEN }} - tag_name: ${{ gitea.ref_name }} - name: "Release ${{ gitea.ref_name }}" - body_path: changelog.txt + tag_name: ${{ steps.version.outputs.tag }} + name: "Claudia Docs CLI ${{ steps.version.outputs.tag }}" + body_path: changelog.md files: | dist/*.tar.gz - dist/checksums.txt \ No newline at end of file + dist/*.zip + dist/checksums.txt + install.sh + + latest: + runs-on: ubuntu-latest + needs: release + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + steps: + - name: Update latest tag + run: | + echo "Latest release updated"