From f3cc7c9401c5909f1a9b92baf2991de279c699af Mon Sep 17 00:00:00 2001 From: Hua Audio Date: Sun, 8 Mar 2026 00:53:46 +0100 Subject: [PATCH] Refactor nightly build workflow for clarity and efficiency Refactor nightly build workflow to improve clarity and efficiency. Update job names, streamline version generation, and enhance Docker build process. --- .github/workflows/nightly.yml | 200 +++++++--------------------------- 1 file changed, 40 insertions(+), 160 deletions(-) diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 423f68307..231f422ba 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -2,230 +2,110 @@ name: Nightly Build on: schedule: - # Run every day at 00:00 UTC - cron: '0 0 * * *' workflow_dispatch: - # Allow manual triggering - inputs: - skip_version: - description: 'Skip version generation (use current)' - required: false - default: 'false' - type: boolean - build_only: - description: 'Build only, skip release' - required: false - default: 'false' - type: boolean - -env: - CARGO_TERM_COLOR: always - REGISTRY: ghcr.io - IMAGE_NAME: ${{ github.repository }} jobs: generate-version: - name: Generate Nightly Version + name: Generate Version runs-on: ubuntu-latest - if: github.event.inputs.skip_version != 'true' outputs: version: ${{ steps.version.outputs.version }} tag: ${{ steps.version.outputs.tag }} - date: ${{ steps.version.outputs.date }} steps: - - name: Checkout code + - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - - name: Generate nightly version + - name: Generate version id: version run: | - # Get current date DATE=$(date +%Y%m%d) - - # Get short commit hash SHA=$(git rev-parse --short HEAD) - - # Generate version: v0.1.0-nightly-YYYYMMDD-sha VERSION="v0.1.0-nightly-${DATE}-${SHA}" TAG="nightly-${DATE}-${SHA}" - echo "version=${VERSION}" >> $GITHUB_OUTPUT echo "tag=${TAG}" >> $GITHUB_OUTPUT - echo "date=${DATE}" >> $GITHUB_OUTPUT - echo "Generated version: ${VERSION}" - echo "Generated tag: ${TAG}" - echo "Generated date: ${DATE}" build: - name: Build Picoclaw + name: Build runs-on: ubuntu-latest needs: generate-version steps: - - name: Checkout code + - name: Checkout uses: actions/checkout@v4 - - name: Set up Go - uses: actions/setup-go@v5 + - name: Setup Go + uses: actions/setup-go@v6 with: - go-version: '1.21' - cache: true + go-version-file: go.mod - - name: Build binary - run: | - go build -v -o picoclaw . + - name: Build + run: make build-all - - name: Upload artifact + - name: Upload artifacts uses: actions/upload-artifact@v4 with: - name: picoclaw-linux-amd64 - path: picoclaw + name: picoclaw-binaries + path: build/* build-docker: - name: Build Docker Image + name: Build Docker runs-on: ubuntu-latest - needs: generate-version steps: - - name: Checkout code + - name: Checkout uses: actions/checkout@v4 + - name: Generate lowercase repo + id: repo + run: echo "repo=$(echo '${{ github.repository }}' | tr '[:upper:]' '[:lower:]')" >> $GITHUB_OUTPUT + + - name: Generate date tag + id: date + run: echo "date=$(date +%Y%m%d)" >> $GITHUB_OUTPUT + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - - name: Log in to GitHub Container Registry + - name: Log in to GHCR uses: docker/login-action@v3 with: - registry: ${{ env.REGISTRY }} + registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - - name: Build and push Docker image - uses: docker/build-push-action@v5 + - name: Build and push + uses: docker/build-push-action@v6 with: context: . + file: ./docker/Dockerfile push: true tags: | - ghcr.io/${{ github.repository }}:${{ needs.generate-version.outputs.tag }} - ghcr.io/${{ github.repository }}:nightly-${{ needs.generate-version.outputs.date }} - ghcr.io/${{ github.repository }}:nightly + ghcr.io/${{ steps.repo.outputs.repo }}:nightly-${{ steps.date.outputs.date }} + ghcr.io/${{ steps.repo.outputs.repo }}:nightly cache-from: type=gha cache-to: type=gha,mode=max - create-release: - name: Create Nightly Release + release: + name: Release runs-on: ubuntu-latest needs: [generate-version, build] - if: github.event.inputs.build_only != 'true' steps: - - name: Checkout code + - name: Checkout uses: actions/checkout@v4 - with: - fetch-depth: 0 - name: Download artifacts uses: actions/download-artifact@v4 with: - name: picoclaw-linux-amd64 - path: ./artifacts + name: picoclaw-binaries + path: ./build - - name: Prepare release notes - run: | - cat > release_notes.md << 'EOF' - # Picoclaw Nightly Release - - 📅 **Date**: $(date -u +'%Y-%m-%d %H:%M:%S UTC') - 🏷️ **Version**: ${{ needs.generate-version.outputs.version }} - 🌿 **Branch**: ${{ github.ref_name }} - 🔗 **Commit**: ${{ github.sha }} - - --- - - ## 📦 Download - - ### Linux AMD64 Binary - - `picoclaw-linux-amd64` - Pre-built binary for Linux x86_64 - - ### Docker Image - \`\`\`bash - docker pull ghcr.io/${{ github.repository }}:nightly-$(date +%Y%m%d) - # or latest nightly - docker pull ghcr.io/${{ github.repository }}:nightly - \`\`\` - - --- - - ## 🔧 Installation - - ### Using binary - \`\`\`bash - chmod +x picoclaw - sudo mv picoclaw /usr/local/bin/ - \`\`\` - - ### Using Docker - \`\`\`bash - docker run -d --name picoclaw \\ - -v /path/to/config:/config \\ - ghcr.io/${{ github.repository }}:nightly - \`\`\` - - --- - - ## ⚠️ Disclaimer - - This is a **nightly build** and may contain: - - Unfinished features - - Bugs and instability - - Breaking changes - - For production use, please use a stable release instead. - - --- - - 🦞 **Built with ❤️ by Picoclaw** - EOF - - - name: Create GitHub Release - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - VERSION: ${{ needs.generate-version.outputs.version }} - TAG: ${{ needs.generate-version.outputs.tag }} - run: | - gh release create "$TAG" \ - --title "$VERSION" \ - --notes-file release_notes.md \ - ./artifacts/picoclaw-linux-amd64 - - - name: Update nightly tag reference - if: success() - run: | - # Update 'nightly' tag to point to latest nightly - git config user.name "github-actions[bot]" - git config user.email "github-actions[bot]@users.noreply.github.com" - git tag -f nightly ${{ github.sha }} - git push origin nightly --force - - - name: Clean up old nightly releases (keep last 7) - if: success() + - name: Create release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | - # List all nightly releases, keep only the 7 most recent - gh release list --limit 100 | grep nightly- | tail -n +8 | awk '{print $3}' | xargs -I {} gh release delete --yes --cleanup-tag {} - - notify: - name: Notify Results - runs-on: ubuntu-latest - needs: [build-docker, create-release] - if: always() - steps: - - name: Check build status - run: | - if [ "${{ needs.create-release.result }}" == "success" ]; then - echo "✅ Nightly build completed successfully!" - echo "Version: ${{ needs.generate-version.outputs.version }}" - else - echo "❌ Nightly build failed" - echo "Check the workflow logs for details" - fi + gh release create ${{ needs.generate-version.outputs.tag }} \ + --title "${{ needs.generate-version.outputs.version }}" \ + --notes "Nightly build for ${{ needs.generate-version.outputs.version }}" \ + build/*