folk-builder 0.1.2

Custom binary builder for Folk — generates and compiles a Folk server with selected plugins
Documentation
name: Release

on:
  push:
    tags:
      - "v[0-9]+.[0-9]+.[0-9]+"

permissions:
  contents: write

env:
  CARGO_TERM_COLOR: always

jobs:
  build-linux:
    name: Build ${{ matrix.target }}
    runs-on: self-hosted

    strategy:
      matrix:
        include:
          - target: x86_64-unknown-linux-musl
            arch: x86_64
          - target: aarch64-unknown-linux-musl
            arch: aarch64

    steps:
      - uses: actions/checkout@v4
        with:
          clean: true

      - name: Clean target
        run: rm -rf /home/deploy/cargo-target target

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      # --- Build folk-builder ---
      - name: Build folk-builder
        run: cross build --release --target ${{ matrix.target }}
        env:
          CARGO_TARGET_DIR: target

      - name: Package folk-builder
        run: |
          VERSION=${GITHUB_REF_NAME}
          ARCHIVE=folk-builder-linux-${{ matrix.arch }}-${VERSION}.tar.gz
          tar -czf "${ARCHIVE}" -C target/${{ matrix.target }}/release folk-builder
          echo "BUILDER_ARCHIVE=${ARCHIVE}" >> $GITHUB_ENV

      # --- Build folk-server (all plugins) ---
      - name: Build folk-server via folk-builder
        run: |
          export PATH="$PWD/target/${{ matrix.target }}/release:$PATH"
          folk-builder build --config examples/folk.build.toml --output-dir .
        env:
          CARGO_TARGET_DIR: /tmp/folk-server-build

      - name: Package folk-server
        run: |
          VERSION=${GITHUB_REF_NAME}
          ARCHIVE=folk-server-linux-${{ matrix.arch }}-${VERSION}.tar.gz
          tar -czf "${ARCHIVE}" folk-server
          echo "SERVER_ARCHIVE=${ARCHIVE}" >> $GITHUB_ENV

      - name: Upload folk-builder artifact
        uses: actions/upload-artifact@v4
        with:
          name: folk-builder-linux-${{ matrix.arch }}
          path: ${{ env.BUILDER_ARCHIVE }}

      - name: Upload folk-server artifact
        uses: actions/upload-artifact@v4
        with:
          name: folk-server-linux-${{ matrix.arch }}
          path: ${{ env.SERVER_ARCHIVE }}

  build-macos:
    name: Build aarch64-apple-darwin
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          targets: aarch64-apple-darwin

      # --- Build folk-builder ---
      - name: Build folk-builder
        run: cargo build --release --target aarch64-apple-darwin

      - name: Package folk-builder
        run: |
          VERSION=${GITHUB_REF_NAME}
          ARCHIVE=folk-builder-darwin-aarch64-${VERSION}.tar.gz
          tar -czf "${ARCHIVE}" -C target/aarch64-apple-darwin/release folk-builder
          echo "BUILDER_ARCHIVE=${ARCHIVE}" >> $GITHUB_ENV

      # --- Build folk-server (all plugins) ---
      - name: Build folk-server via folk-builder
        run: |
          export PATH="$PWD/target/aarch64-apple-darwin/release:$PATH"
          folk-builder build --config examples/folk.build.toml --output-dir .

      - name: Package folk-server
        run: |
          VERSION=${GITHUB_REF_NAME}
          ARCHIVE=folk-server-darwin-aarch64-${VERSION}.tar.gz
          tar -czf "${ARCHIVE}" folk-server
          echo "SERVER_ARCHIVE=${ARCHIVE}" >> $GITHUB_ENV

      - name: Upload folk-builder artifact
        uses: actions/upload-artifact@v4
        with:
          name: folk-builder-darwin-aarch64
          path: ${{ env.BUILDER_ARCHIVE }}

      - name: Upload folk-server artifact
        uses: actions/upload-artifact@v4
        with:
          name: folk-server-darwin-aarch64
          path: ${{ env.SERVER_ARCHIVE }}

  release:
    name: Create GitHub Release
    needs: [build-linux, build-macos]
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: dist/

      - name: Create release
        uses: softprops/action-gh-release@v2
        with:
          files: dist/**/*.tar.gz
          generate_release_notes: true
          body: |
            ## Folk ${{ github.ref_name }}

            ### Pre-built binaries

            **folk-server** — ready-to-run server with all official plugins (HTTP, Jobs, gRPC, Metrics, Process).
            **folk-builder** — build tool for custom server binaries with selected plugins.

            | Platform | folk-server | folk-builder |
            |----------|-------------|-------------|
            | Linux x86_64 | [Download](https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-server-linux-x86_64-${{ github.ref_name }}.tar.gz) | [Download](https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-builder-linux-x86_64-${{ github.ref_name }}.tar.gz) |
            | Linux ARM64 | [Download](https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-server-linux-aarch64-${{ github.ref_name }}.tar.gz) | [Download](https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-builder-linux-aarch64-${{ github.ref_name }}.tar.gz) |
            | macOS (Apple Silicon) | [Download](https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-server-darwin-aarch64-${{ github.ref_name }}.tar.gz) | [Download](https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-builder-darwin-aarch64-${{ github.ref_name }}.tar.gz) |

            ### Quick start with folk-server

            ```bash
            # Download
            curl -L https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-server-linux-x86_64-${{ github.ref_name }}.tar.gz | tar xz

            # Configure
            cat > folk.toml << 'EOF'
            [server]
            runtime = "pipe"

            [workers]
            script = "vendor/bin/folk-worker"
            count = 4

            [http]
            listen = "0.0.0.0:8080"
            EOF

            # Run
            ./folk-server
            ```

            ### Custom builds with folk-builder

            If you only need specific plugins, use folk-builder to create a minimal binary:

            ```bash
            curl -L https://github.com/Folk-Project/folk-builder/releases/download/${{ github.ref_name }}/folk-builder-linux-x86_64-${{ github.ref_name }}.tar.gz | tar xz

            cat > folk.build.toml << 'EOF'
            [build]
            output = "my-server"

            [[plugin]]
            crate_name = "folk-plugin-http"
            version = "0.1"
            config_key = "http"
            EOF

            folk-builder build
            ./my-server
            ```
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}