Run GitLab CI, GitHub Actions, and Forgejo pipelines locally.
[Verse 1]
They say that if you were to see
Your CI running locally
In that terminal window, free
It brings you good luck
All of you have come
Even the vendors who dismissed us
Today, they watch
[Chorus]
Throw magnolias at me
Run your pipelines locally
Throw magnolias at me
Own your CI destiny
[Verse 2]
Over their platforms, open forges burning bright
Tears and FUD melt into the code
GitLab and GitHub, Forgejo's might
Dancing with freedom on top of vendor lock
Today it's all sovereignty mocking fate
And what you couldn't test locally, you test before you commit
mise x ubi:tuist/magnoliaOr download from releases.
Test your CI/CD pipelines before pushing to your Git forge:
# Interactive mode - discover and select pipeline
magnolia
# Run a specific workflow
magnolia .github/workflows/test.yml
# Run a specific job from a workflow
magnolia .github/workflows/test.yml
# Then select the job interactivelyExample workflow:
$ magnolia .github/workflows/ci.yml
Discovering pipelines...
Select a pipeline: GitHub Actions: ci.yml
Select a job to run:
> build
test
deploy
Running job build from .github/workflows/ci.yml
✓ Step: Checkout code
✓ Step: Install dependencies
✓ Step: Build applicationSeamlessly migrate from external CI providers to your Git forge's native CI using AI-powered translation:
# Auto-detect source and target CI systems
magnolia migrate
# Preview migration without writing files
magnolia migrate --dry-run
# Override target CI system
magnolia migrate --to github
# Migrate specific source when multiple configs found
magnolia migrate bitriseExample migration:
$ magnolia migrate bitrise --dry-run --to github
Detecting CI configurations...
Source: Bitrise (bitrise.yml)
Target: GitHub Actions
Initializing AI agent for migration...
📋 Step 1/3: Analyzing source configuration...
→ Reading Bitrise pipeline from bitrise.yml
🔍 Step 2/3: Researching CI system documentation and generating configuration...
→ Consulting Bitrise and GitHub Actions documentation
→ This may take 30-60 seconds...
✅ Step 3/3: Migration complete!
Dry run - migration preview:
Generated configuration:
================================================================================
name: CI/CD Pipeline
on:
push:
branches: ['**']
jobs:
primary:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build
run: npm run build
================================================================================
Would be written to: .github/workflows/migrated-workflow.ymlCommon migration scenarios:
# CircleCI → GitHub Actions
magnolia migrate circleci --to github
# Buildkite → GitLab CI
magnolia migrate buildkite --to gitlab
# Mobile app (AppCircle) → GitHub Actions
magnolia migrate appcircle --to githubSupported Migration Sources:
- Bitrise (
bitrise.ymlor.bitrise/bitrise.yml) - Codemagic (
codemagic.yamlor.codemagic/codemagic.yaml) - CircleCI (
.circleci/config.yml) - AppCircle (
appcircle.yaml,configuration.yaml, or.appcircle/config.yaml) - Buildkite (
.buildkite/pipeline.ymlor.buildkite/pipeline.yaml)
Migration Targets (auto-detected from git remote):
- GitHub Actions (
.github/workflows/*.yml) - GitLab CI (
.gitlab-ci.yml) - Forgejo Actions (
.forgejo/workflows/*.yml)
Requirements:
- Install either
claudeorcodexCLI for AI-powered migration - The migration feature uses the agentic client protocol to delegate complex translation tasks
- GitLab CI: Executes jobs in containers (Podman/Docker) when
image:is specified, or on host otherwise. - GitHub Actions / Forgejo Actions:
- Executes
run:steps in containers based onruns-on:runner - Executes marketplace actions (
uses:) - composite, Docker, and Node.js actions supported - Actions are downloaded once and cached locally in
~/.magnolia/actions
- Executes
- 🦊 GitLab CI (
.gitlab-ci.yml) - 🐙 GitHub Actions (
.github/workflows/*.yml) - 🍵 Forgejo/Gitea Actions (
.forgejo/workflows/*.ymlor.gitea/workflows/*.yml)
MIT