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
- 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
- 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
- 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
- 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 }}