name: Build All Color Schemes on: push: paths: - "config/schemes.nix" - "config/scheme-utils.nix" workflow_dispatch: jobs: build-schemes: runs-on: nixos env: HOSTNAME: server steps: - uses: actions/checkout@v4 - name: Get available schemes id: schemes run: | SCHEMES=$(nix eval --raw --impure --expr ' let pkgs = import {}; inputs = {}; utils = import ./scripts/scheme-utils.nix { inherit pkgs inputs; }; in builtins.concatStringsSep " " utils.availableSchemes ') echo "schemes=$SCHEMES" >> $GITEA_OUTPUT echo "Available schemes: $SCHEMES" - name: Configure Attic cache run: | # Configure attic client to use your cache server attic login servidos http://127.0.0.1:2343 ${{ secrets.ATTIC_TOKEN }} - name: Build and push all schemes continue-on-error: true run: | echo "Building and pushing all schemes..." # Retry function for attic push commands retry_attic_push() { local max_attempts=5 local attempt=1 local command="$@" while [ $attempt -le $max_attempts ]; do echo "Attempt $attempt/$max_attempts: $command" if eval "$command"; then echo "✓ Successfully pushed to cache on attempt $attempt" return 0 else local exit_code=$? echo "✗ Attempt $attempt failed with exit code $exit_code" if [ $attempt -lt $max_attempts ]; then echo "Waiting 2 seconds before retry..." sleep 2 fi attempt=$((attempt + 1)) fi done echo "⚠️ Failed to push to cache after $max_attempts attempts. Continuing anyway..." return 0 # Don't fail the pipeline } # Store original scheme ORIGINAL_SCHEME=$(grep -oP "scheme = schemesFile\.schemes\.\K\w+" config/stylix.nix) echo "Original scheme: $ORIGINAL_SCHEME" # Build and push each scheme for scheme in ${{ steps.schemes.outputs.schemes }}; do echo "=========================================" echo "Processing scheme: $scheme" echo "=========================================" # Update stylix.nix to use this scheme sed -i "s/scheme = schemesFile\.schemes\.\w\+;/scheme = schemesFile.schemes.$scheme;/" config/stylix.nix # Verify the change grep "scheme = schemesFile.schemes" config/stylix.nix # Build the configuration echo "Building $scheme..." nix build .#nixosConfigurations.${HOSTNAME}.config.system.build.toplevel \ --out-link ./result-$scheme \ --quiet # Push to cache with retry echo "Pushing $scheme to cache..." retry_attic_push "attic push servidos:nixos ./result-$scheme" # Also push using print-out-paths for better cache coverage build_path=$(nix build .#nixosConfigurations.${HOSTNAME}.config.system.build.toplevel \ --print-out-paths \ --quiet 2>/dev/null || echo "") if [ -n "$build_path" ]; then retry_attic_push "echo \"$build_path\" | attic push servidos:nixos --stdin" fi echo "✓ Completed $scheme" echo "" done # Restore original scheme echo "Restoring original scheme: $ORIGINAL_SCHEME" sed -i "s/scheme = schemesFile\.schemes\.\w\+;/scheme = schemesFile.schemes.$ORIGINAL_SCHEME;/" config/stylix.nix echo "=========================================" echo "All schemes built and pushed successfully!" echo "=========================================" - name: Summary run: | SCHEME_COUNT=$(echo "${{ steps.schemes.outputs.schemes }}" | wc -w) echo "✅ Color scheme builds completed successfully!" echo "- Built $SCHEME_COUNT schemes: ${{ steps.schemes.outputs.schemes }}" echo "- Pushed all builds to Atticd cache" echo "" echo "You can now switch schemes quickly without waiting for builds!"