# CI/CD Pipelines

TypeDialog uses **dual CI/CD setup** to support both GitHub and Gitea/Forgejo platforms.

## Quick Reference

| Platform           | Files                        | Documentation                |
| ------------------ | ---------------------------- | ---------------------------- |
| **GitHub Actions** | `.github/workflows/*.yml`    | Auto-configured              |
| **Woodpecker CI**  | `.woodpecker/*.yml`          | See `.woodpecker/README.md`  |

## Platform Comparison

| Feature         | GitHub Actions             | Woodpecker Basic           | Woodpecker Advanced/Docker |
| --------------- | -------------------------- | -------------------------- | -------------------------- |
| **Multi-OS** | ✅ Linux, macOS, Windows | ❌ Linux only | ✅ 5 targets* |
| **Linting** | ✅ 5 languages (parallel) | ✅ 5 languages (parallel) | ✅ 5 languages (parallel) |
| **Testing** | ✅ Matrix (3 OS) | ✅ Linux | ✅ Multi-OS** |
| **Coverage** | ✅ Codecov integration | ❌ | ✅ SonarQube** |
| **Security** | ✅ cargo-audit | ✅ cargo-audit | ✅ cargo-audit |
| **Compliance** | ✅ cargo-deny | ✅ cargo-deny | ✅ cargo-deny |
| **Benchmarks** | ✅ On PRs | ❌ | ✅ Gitea API** |
| **SBOM** | ✅ Auto-upload | ⚠️  Manual upload | ✅ Auto-upload |
| **Release** | ✅ 6 targets + crates.io | ❌ 1 target | ✅ 5 targets + crates.io |
| **Gitea API** | N/A | ❌ | ✅ Auto-create releases |

\* Advanced: cross-compilation, Docker: .woodpecker/Dockerfile.cross
\*\* Advanced pipelines only (ci-advanced.yml, release-advanced.yml, release-docker.yml)

## CI Pipeline (Both Platforms)

**Triggers**: Push to `main`/`develop`, Pull Requests

**Stages**:

1. **Linting** (parallel):
   - Rust (clippy)
   - Bash (shellcheck)
   - Nickel
   - Nushell
   - Markdown
2. **Testing**: `just ci::test-all`
3. **Building**: `just ci::build-release`
4. **Security**: `cargo audit`
5. **Compliance**: `cargo deny check licenses`

**Duration**:

- GitHub Actions: ~20-25 min
- Woodpecker CI: ~15-20 min (with custom image), ~25-30 min (without)

## Release Pipeline (Both Platforms)

**Triggers**: Git tags `v*` (e.g., `v0.1.0`)

**GitHub Actions**: 6 targets, auto-upload, auto-publish to crates.io

**Woodpecker CI**: 3 pipeline options

- **Basic** (`release.yml`) - Linux x86_64 only, manual upload
- **Advanced** (`release-advanced.yml`) - 5 targets, Gitea API auto-upload
- **Docker-based** (`release-docker.yml`) - 5 targets, uses .woodpecker/Dockerfile.cross, Gitea API

**Artifacts**:

- Release binaries (GitHub: 6 targets, Woodpecker: 1-5 depending on pipeline)
- SHA256 checksums
- SBOM (SPDX + CycloneDX formats)
- BUILD_INFO.json manifest (Woodpecker Docker-based only)
- Auto-publish to crates.io (optional on both platforms)

## Local Testing

Test before pushing:

```bash
just ci::full          # Complete pipeline
just ci::test-all      # Tests only
just ci::audit         # Security audit
just ci::deny          # License check
```text

## Setup

### GitHub Actions (Auto-configured)

Secrets required:

- `CODECOV_TOKEN` - For coverage reports
- `CARGO_REGISTRY_TOKEN` - For crates.io publishing

### Woodpecker CI (Manual)

See [`.woodpecker/README.md`](../../.woodpecker/README.md) for:

- Activation steps
- Custom Docker image (optional, faster CI)
- Secrets configuration

## Creating a Release

```bash
# 1. Update version in Cargo.toml files
# 2. Commit changes
git commit -am "chore: bump version to 0.1.0"

# 3. Create and push tag
git tag v0.1.0
git push origin v0.1.0

# 4. CI systems will
#    GitHub Actions
#      - Build 6 platform binaries
#      - Generate SBOMs
#      - Create GitHub Release with auto-upload
#      - Publish to crates.io
#
#    Woodpecker CI
#      - Basic: Build Linux x86_64 binary, generate SBOM (manual upload)
#      - Advanced: Build 5 platform binaries, auto-create Gitea release, upload artifacts
#      - Docker-based: Build 5 platforms via .woodpecker/Dockerfile.cross, auto-create Gitea release
#      - Optional: Publish to crates.io (if CARGO_TOKEN configured)
```text

**Woodpecker Pipeline Selection**:

Choose which release pipeline to use by renaming in `.woodpecker/`:

- Keep only one `release.yml` active
- Rename others to `.release-*.yml.disabled`

Example (use Docker-based):

```bash
mv .woodpecker/release.yml .woodpecker/.release-basic.yml.disabled
mv .woodpecker/release-advanced.yml .woodpecker/.release-advanced.yml.disabled
mv .woodpecker/release-docker.yml .woodpecker/release.yml
```text

## Troubleshooting

### Tests Failing

Some tests require `ANTHROPIC_API_KEY` and are marked `#[ignore]`:

```bash
# Run locally with API key
export ANTHROPIC_API_KEY=sk-xxx
cargo test -- --ignored
```text

### CI Caching Issues

**GitHub**: Clear caches via Actions UI

**Woodpecker**: Server-side cache configuration (ask admin)

### Security Audit Warnings

See `.cargo/audit.toml` for ignored advisories (unmaintained deps with no alternatives).

## More Information

- **Just commands**: See `justfiles/*.just`
- **Woodpecker setup**: See `.woodpecker/README.md`
- **Project structure**: See `README.md`
