diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml new file mode 100644 index 0000000..1c3ebbe --- /dev/null +++ b/.gitea/workflows/ci.yml @@ -0,0 +1,66 @@ +name: CI + +on: + push: + branches: + - main + - dev + pull_request: + workflow_dispatch: + +jobs: + frontend: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up Bun + uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install dependencies + run: bun install + + - name: Type check + run: bun run check + + - name: Build + run: bun run build + + backend: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install system dependencies + run: | + apt-get update + apt-get install -y pkg-config libssl-dev + + - name: Clone Typst compiler + run: | + git clone https://github.com/typst/typst.git typst + git -C typst checkout 44b3f78ed37fedea75e911dde2269ef86c45316f + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + server/target + key: cargo-${{ hashFiles('server/Cargo.lock') }} + restore-keys: cargo- + + - name: Check + run: cargo check --manifest-path server/Cargo.toml + + - name: Clippy + run: cargo clippy --manifest-path server/Cargo.toml -- -D warnings + continue-on-error: true diff --git a/.gitea/workflows/docker-publish.yml b/.gitea/workflows/docker-publish.yml new file mode 100644 index 0000000..4b1b668 --- /dev/null +++ b/.gitea/workflows/docker-publish.yml @@ -0,0 +1,67 @@ +name: Build and Publish Docker Image + +on: + push: + branches: + - main + tags: + - "v*" + release: + types: [published] + workflow_dispatch: + inputs: + platforms: + description: "Target platforms to build (comma-separated)" + required: false + default: "linux/amd64,linux/arm64" + +env: + REGISTRY: ghcr.io + IMAGE_NAME: sirblobby/typstdrive + DEFAULT_PLATFORMS: "linux/amd64,linux/arm64" + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ secrets.REGISTRY_USERNAME }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Extract metadata (tags, labels) + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + type=ref,event=tag + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha + type=raw,value=latest,enable={{is_default_branch}} + + - name: Build and push Docker image + uses: docker/build-push-action@v6 + with: + context: . + file: ./Dockerfile + platforms: ${{ github.event.inputs.platforms || env.DEFAULT_PLATFORMS }} + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache + cache-to: type=registry,ref=${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:buildcache,mode=max diff --git a/README.md b/README.md index b11842c..39fa373 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,24 @@ The first account created via the setup wizard is automatically an administrator - **Toggle Admin** — promote or demote any other user - **Delete User** — permanently remove any account other than your own +## Continuous Integration + +Workflows live in `.gitea/workflows` for Gitea Actions and `.github/workflows` for GitHub Actions. + +| Workflow | Trigger | Purpose | +|---|---|---| +| `ci.yml` | push to `main` or `dev`, pull requests | Type checks and builds the frontend, then checks the backend. | +| `docker-publish.yml` | push to `main`, `v*` tags, releases | Builds the multi-architecture image and pushes it to the registry. | + +The Gitea publish workflow needs two repository secrets, since Gitea's built-in token only grants access to its own registry: + +| Secret | Value | +|---|---| +| `REGISTRY_USERNAME` | Your GitHub username. | +| `REGISTRY_TOKEN` | A GitHub personal access token with the `write:packages` scope. | + +Set the image name with the `IMAGE_NAME` variable at the top of the workflow if you publish somewhere other than `ghcr.io/sirblobby/typstdrive`. + ## Contributing & Local Development Clone the official Typst compiler into the `typst/` folder before building the backend: