# CI/CD Pipeline
The `proton-drive-linux` project uses **dual CI systems**: GitHub Actions for community-facing builds and GitLab CI for internal infrastructure.
## Pipeline Architecture
graph TB
subgraph "GitHub"
DEV[Developer Push]
GH_ACTIONS[GitHub Actions]
subgraph "Workflows"
PKG[package-workflows.yml
Multi-format Builds]
SANITY[sanity.yml
Lint & Check]
SYNC[sync-to-gitlab.yml
Issue/PR Mirror]
end
end
subgraph "GitLab"
GL_CI[GitLab CI
.gitlab-ci.yml]
GL_REPO[GitLab Repository
gitlab.dicematrix.cloud]
end
DEV --> GH_ACTIONS
GH_ACTIONS --> PKG
GH_ACTIONS --> SANITY
GH_ACTIONS --> SYNC
SYNC -->|mirrors issues/PRs| GL_REPO
DEV -->|git push| GL_REPO
GL_REPO --> GL_CI
## GitHub Actions (`package-workflows.yml`)
The primary build pipeline. **Builds all package formats** on pull requests and workflow dispatch:
| Package Type | Targets |
|---|---|
| **APK** | Alpine 3.20, 3.22, 3.23 |
| **AppImage** | linux-baseline |
| **DEB** | Debian 12, 13; Ubuntu 24.04, 26.04 |
| **RPM** | EL10, Fedora 43, 44; openSUSE Tumbleweed |
| **AUR** | arch-native (+ publish) |
| **Flatpak** | GNOME 49, 50 (+ publish) |
| **Snap** | core24, core26 (+ publish) |
Also includes `sanity.yml` for linting, type checking, and `maintenance/` workflows for issue/PR labeling, package spec generation, and releases.
### Mirroring
The `sync-to-gitlab.yml` workflow syncs GitHub issues and pull requests to GitLab as mirrored issues/comments. This keeps the GitLab project visible to internal infrastructure while GitHub remains the community-facing development hub.
## GitLab CI (`.gitlab-ci.yml`)
A parallel build pipeline running on self-hosted GitLab at `gitlab.dicematrix.cloud`:
| Stage | Jobs |
|---|---|
| **build** | APK (Alpine 3.20/3.22/3.23), AppImage, AUR, DEB (Debian 12/13, Ubuntu 24.04/26.04), RPM (EL10, Fedora 43/44, openSUSE), Flatpak (GNOME 49/50), Snap (core24/26) |
| **spec** | Package spec generation (PKGBUILD, RPM spec, source dist) |
| **release** | Release artifact assembly (main branch pushes and version tags) |
| **publish** | Manual publish jobs for git tags |
Each job clones Proton WebClients, applies distro-specific patches, builds with `scripts/build-webclients.sh`, compiles Tauri, and packages.
## Build Flow
1. Clone `ProtonMail/WebClients` at pinned commit
2. Apply platform-specific patch from `patches//.patch`
3. Run `scripts/build-webclients.sh` (installs deps, patches source, builds Drive/Account/Verify apps)
4. Set version from `package.json`
5. Compile Tauri (`cargo build --release`)
6. Package into target format
7. Store artifacts (30-day expiry)