J2G
Jenkins to GitLab CI Migration Tool
A desktop application that automates Jenkins-to-GitLab CI/CD migration — connects to your GitLab instance, finds Jenkinsfiles in repos, and converts them to production-ready .gitlab-ci.yml.
Electron Desktop App
Works Offline
Download J2G
Loading...
What is J2G?
A desktop application that automates Jenkins-to-GitLab CI/CD migration — connects to your GitLab instance, finds Jenkinsfiles in repos, and converts them to production-ready .gitlab-ci.yml.
See J2G in Action
A visual tour of the J2G desktop app — from scanning your GitLab projects and analysing pipeline complexity, to converting Jenkinsfiles into production-ready .gitlab-ci.yml. Click any screenshot to open the full-size viewer — use the ‹ › buttons or the arrow keys to navigate, press Esc to close.
How It Works
A streamlined 5-step pipeline — from connecting to GitLab to having production-ready CI/CD configuration. Works with a single project or thousands.
On-prem or cloud
Select projects to scan
Pattern detection
Lint validation
Create merge request
Conversion at a Glance
J2G translates Jenkins pipeline constructs into their GitLab CI/CD equivalents — not a 1:1 copy but an intelligent mapping.
- pipeline{} → top-level
.gitlab-ci.yml - stages{} →
stages:keyword - stage(‘X’){} → named job under stage
- steps{} →
script:block - parallel{} →
parallel:matrix jobs - agent any →
tags:runner tags - agent { docker } →
image:directive - agent { label } →
tags:runner mapping
- sh/bat →
script:commands - withEnv →
variables:block - withCredentials → CI/CD variables reference
- tool ‘maven’ →
image:maven container - timeout →
timeout:keyword - retry →
retry:keyword - input →
when: manual - catchError →
allow_failure:
- post{ always } →
after_script: - post{ success/failure } →
rules:conditions - when{ branch } →
rules: if $CI_COMMIT_BRANCH - when{ expression } →
rules: ifexpression - cron triggers →
schedules:pipeline - archiveArtifacts →
artifacts: paths: - stash/unstash →
artifacts+dependencies - shared libraries →
include:templates
Key Features
Everything you need for a successful Jenkins-to-GitLab migration — built into a single desktop application.
Security & Privacy
No AI, no cloud, no telemetry. J2G is a deterministic, rule-based desktop application — your code stays on your machine.
No AI — rule-based only
→ Pushes .gitlab-ci.yml
On-prem / cloud
- Zero AI/ML components — no LLMs, no neural networks, no inference
- All conversion uses deterministic regex + AST pattern matching
- No data sent to OpenAI, Google, or any AI service
- Same input always produces same output — fully reproducible
- Only 1 runtime dependency:
js-yaml(YAML parser)
- Parsing, analysis, and conversion happen entirely on your machine
- Jenkinsfiles never leave your filesystem or network
- Converted YAML stored in memory until you explicitly save or push
- Works fully offline (only GitLab API calls need network)
- Air-gapped compatible — lockout timer falls back to local clock offline
- No analytics libraries (no Google Analytics, Mixpanel, Sentry, etc.)
- No usage tracking, crash reporting, or behaviour monitoring
- No
sendBeacon(), no tracking pixels, no event logging - Only outbound beyond GitLab: lockout time verification (public HTTPS, read-only)
- No third-party SDKs of any kind bundled in the application
- In-memory Chromium partition — no persistent browser storage
- Cookies, LocalStorage, SessionStorage, IndexedDB all disabled
purgePersistedData()runs on every startup — cleans leftovers- Tokens held in process memory only — never written to disk
- Only disk writes: license data + anti-tamper marker + optional file-cache
Security Deep Dive
Electron hardening, license protection, and compliance — designed for enterprise security review.
- ▸
contextIsolation: true,nodeIntegration: false - ▸Preload bridge: 43 named IPC methods — no raw
ipcRendereraccess - ▸CSP:
default-src 'self'; script-src 'self' - ▸DevTools blocked in production (4 mechanisms)
- ▸Remote debug disabled,
--inspectblocked, V8:--jitless - ▸External URLs restricted to http/https;
execSyncscoped to app git only
- ▸
RunAsNode: false— binary cannot be used as Node.js - ▸
EnableNodeOptionsEnvironmentVariable: false - ▸
EnableNodeCliInspectArguments: false - ▸Fuses baked into binary — cannot be changed at runtime
- ▸macOS: hardened runtime + entitlements + re-signed post-fuse
- ▸Strongest Electron hardening available today
- ▸Ed25519 signed keys — offline cryptographic verification
- ▸Machine fingerprint binding (platform + arch + CPU + memory hash)
- ▸Shadow marker + foreign-machine detection — permanently blocks shared keys
- ▸HMAC-SHA256 integrity checksums — tampered data resets to Free tier
- ▸Per-key usage tracking + GitLab instance binding across activations
- ▸Brute-force lockout with NTP verification + anti-clock-rollback detection
- ▸V1 key format auto-sunset — forces migration to v2 signed keys
- ▸HTTPS-only with session certificate pinning (MITM detection)
- ▸Tokens in
PRIVATE-TOKENheaders — never in URLs or logs - ▸Automatic TLS fallback for self-signed / corporate certificates
- ▸DELETE/PUT/PATCH hard-blocked; only 5 POST endpoints whitelisted
- ▸Rate limiting (50ms min) + exponential backoff on 429/503
- ▸Per-operation timeouts (30s API, 45s file, 60s commit) + AbortController
- ▸No PII collection or processing by J2G
- ▸Only outbound: your GitLab instance + public time APIs (read-only, no data sent)
- ▸No persistent cookies or browser-level sessions
- ▸All write actions user-initiated — startup checks are read-only
- ▸Single production dependency (
js-yaml) — minimal supply chain - ▸Deterministic output — auditable, testable, reproducible
- ▸One-click cancel aborts all in-flight API requests
- ▸Connection test validates access before full scan
- ▸No automatic retries on auth failures (401/403)
- ▸Graceful degradation on network/timeout errors
- ▸Deactivate license instantly — resets to Free tier
- ▸Clear error messages with actionable next steps
What J2G Does NOT Do
Setting clear expectations — J2G is a migration accelerator, not a magic wand. Understanding the boundaries helps plan your migration.
Technical Specifications
Built with modern web technologies — a single codebase producing native desktop applications for all major platforms.
- ▸Electron 41 (Chromium + Node.js)
- ▸Pure JavaScript — no TypeScript, no build step
- ▸Single
main.jsbackend (6,500+ lines) - ▸Single
app.jsfrontend (10,700+ lines) - ▸Context-isolated IPC (preload bridge)
- ▸Hardened runtime on macOS
- ▸electron-builder for packaging
- ▸macOS: DMG installers (arm64 + x64)
- ▸Windows: NSIS installers (universal, x64, arm64)
- ▸Linux: AppImage (x64) + .deb (amd64)
- ▸10 build artifacts per release (7 binaries + SHA256 manifest + GPG signature + pubkey)
- ▸Jenkins CI/CD release pipeline
- ▸Custom test runner (zero dependencies)
- ▸23 test suites, 330+ test cases
- ▸Playwright E2E tests (5 phases)
- ▸Real GitLab instance integration tests
- ▸Mock-based unit tests (nock, fake-timers)
- ▸Anti-abuse and edge case suites
- ▸Declarative + scripted pipeline support
- ▸Regex + AST rule-based pattern matching
- ▸Shared library detection and mapping
- ▸Groovy expression handling
- ▸100+ recognized Jenkins constructs
- ▸Deterministic — same input, same output
- ▸REST API v4 with personal access token
- ▸Project browsing, search, and selection
- ▸Jenkinsfile discovery in repo tree
- ▸Branch creation + commit push + MR
- ▸CI lint API validation
- ▸TLS fallback for self-hosted instances
- ▸v2 key format with tier encoding
- ▸Machine fingerprint binding
- ▸Shadow marker anti-tampering
- ▸Per-key usage tracking across activations
- ▸Feature gate system (11 gated features)
- ▸Graceful v1 → v2 key migration
Summary
J2G turns a weeks-long migration project into a streamlined, repeatable process.
License Tiers & Pricing
Starter, Business, Enterprise, Enterprise+ — one-time purchase, valid for 1 year from the invoice date. After expiry the app stays installed and reverts to Free tier. Renew only if you need more conversions.
Unlim ($9,999) — lifetime licence. “Lifetime” means the economic life of the J2G product line — as long as we continue to publish and support J2G. No renewal needed, ever.
No subscription, no auto-renewal, no credit card on file. Free tier has no time limit.
| Feature | Free | Starter | Business | Enterprise | Enterprise+ | Unlim |
|---|---|---|---|---|---|---|
| Price | Free | $199 | $999 | $2,499 | $4,999 | $9,999 |
| Validity | Unlimited | 1 year | 1 year | 1 year | 1 year | Lifetime |
| Pipelines | 3 | 25 | 250 | 1,000 | 5,000 | Unlimited |
| Analyze Limit | 6/scan | 50/scan | 500/scan | 2,000/scan | 10,000/scan | Unlimited |
| Scan & Explore | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
| CI Lint Validation | — | ✓ | ✓ | ✓ | ✓ | ✓ |
| Export Reports | — | ✓ | ✓ | ✓ | ✓ | ✓ |
| Migrate to GitLab | — | — | ✓ | ✓ | ✓ | ✓ |
| Patterns & Components | — | — | ✓ | ✓ | ✓ | ✓ |
| Batch Convert | — | — | ✓ | ✓ | ✓ | ✓ |
| Batch Migrate | — | — | — | ✓ | ✓ | ✓ |
| Multi-Branch Scanning | — | — | — | 20/project | Unlimited | Unlimited |
| Variable & Runner Mapping | — | — | — | ✓ | ✓ | ✓ |
| Multi-Instance (5 GitLab URLs) | — | — | — | — | — | ✓ |