name: Weekly NixOS Build & Cache on: schedule: - cron: "30 09 * * 1,5" workflow_dispatch: # Allow manual trigger jobs: build-and-cache: runs-on: nixos steps: - name: Checkout repository uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - name: Configure Git for automated commits run: | git config user.name "NixOS Builder Bot" git config user.email "noreply@servidos.lat" - name: Update flake inputs run: | nix flake update - name: Check for changes id: check_changes run: | if git diff --quiet flake.lock; then echo "changes=false" >> $GITHUB_OUTPUT echo "No changes in flake.lock" else echo "changes=true" >> $GITHUB_OUTPUT echo "Changes detected in flake.lock" fi - name: Configure Attic cache if: steps.check_changes.outputs.changes == 'true' run: | # Configure attic client to use your cache server attic login servidos http://127.0.0.1:2343 ${{ secrets.ATTIC_TOKEN }} - name: Build workstation configuration if: steps.check_changes.outputs.changes == 'true' run: | echo "Building workstation configuration..." nix build .#nixosConfigurations.workstation.config.system.build.toplevel --quiet - name: Build server configuration if: steps.check_changes.outputs.changes == 'true' run: | echo "Building server configuration..." nix build .#nixosConfigurations.server.config.system.build.toplevel --quiet - name: Build emacs-vm configuration if: steps.check_changes.outputs.changes == 'true' run: | echo "Building emacs-vm configuration..." nix build .#emacs-vm --quiet - name: Push to cache if: steps.check_changes.outputs.changes == 'true' run: | echo "Pushing builds to cache..." # Push all built derivations to cache if ls result* 1> /dev/null 2>&1; then attic push servidos:nixos result* fi # Push the specific system derivations we just built nix build .#nixosConfigurations.workstation.config.system.build.toplevel --print-out-paths | attic push servidos:nixos --stdin nix build .#nixosConfigurations.server.config.system.build.toplevel --print-out-paths | attic push servidos:nixos --stdin nix build .#emacs-vm --print-out-paths | attic push servidos:nixos --stdin - name: Commit updated flake.lock if: steps.check_changes.outputs.changes == 'true' run: | git add flake.lock git commit -m "Weekly flake update: $(date -u '+%Y-%m-%d %H:%M UTC')" git push origin main - name: Create release tag if: steps.check_changes.outputs.changes == 'true' run: | TAG_NAME="weekly-$(date -u '+%Y-%m-%d')" git tag -a "$TAG_NAME" -m "Weekly build and cache update for $(date -u '+%Y-%m-%d')" git push origin "$TAG_NAME" - name: Summary run: | if [[ "${{ steps.check_changes.outputs.changes }}" == "true" ]]; then echo "✅ Weekly build completed successfully!" echo "- Updated flake.lock" echo "- Built workstation and server configurations" echo "- Pushed builds to Atticd cache" echo "- Committed changes and created release tag" else echo "ℹ️ No updates needed - flake.lock is already up to date" fi