← All playbooks
CI/CD migration

Jenkins → CircleCI

Move Jenkins freestyle jobs and Jenkinsfiles onto CircleCI. Copy Execute Shell steps into .circleci/config.yml first. Then replace plugins, agents, credentials, and approvals with CircleCI jobs, orbs, contexts, and self-hosted runners.

Typical timeline15–35 business days60–130 hours active work
Statusneeds review
Source profileJenkins pipeline syntax reviewed 2026-10-29
Destination profileCircleCI migrate-from-Jenkins guide reviewed 2026-10-29
Documentation date
Review window
Evidence3 sources
This route needs review.Use it as a planning baseline, then verify the dated sources and test with representative data before production.
Before you migrate

Should you make this move?

Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.

Current platform

Jenkins

Reasons to stay
  • Extreme flexibility, self-hosting, and a vast plugin ecosystem handle unusual build systems
  • Repository-centered workflows keep code, review, and automation close together
Reasons to leave
  • Plugin maintenance, security, scaling, and interface debt create significant operational work
  • Advanced governance and automation can become configuration-heavy
New platform

CircleCI

What gets better
  • YAML pipelines, orbs, contexts, and SSH debugging make hosted CI approachable for growing engineering teams
  • Repository-centered workflows keep code, review, and automation close together
What gets worse
  • Usage credits, contexts, and orb-specific behavior create lock-in that does not map one-to-one onto other runners
  • Advanced governance and automation can become configuration-heavy
Best of the move

CircleCI: YAML pipelines, orbs, contexts, and SSH debugging make hosted CI approachable for growing engineering teams. This removes a major source-side concern: Plugin maintenance, security, scaling, and interface debt create significant operational work.

Worst of the move

What you lose: Extreme flexibility, self-hosting, and a vast plugin ecosystem handle unusual build systems. What you inherit: Usage credits, contexts, and orb-specific behavior create lock-in that does not map one-to-one onto other runners.

Jump to a section
01At a glance

Know the shape of the move.

Transfer outcome12 features audited
Transfer outcome distributionClean transfer: 0, Partial transfer: 4, Manual rebuild: 6, Not transferred: 2.
Clean0
Partial4
Manual6
Lost2
Mapping route9 of 9 fields have a destination path

This timeline assumes

  • Up to 60 Jenkins jobs or Jenkinsfiles, 20 agents, and 40 credential entries that feed production deploys.
  • You control the Jenkins controller, agent machines, CircleCI org, contexts, and the Git host's required checks.
  • CircleCI's guide treats this as a different product, not a plugin-for-plugin copy.
  • A pilot covers one Execute Shell job, one Pipeline job with agents, and one deploy that uses credentials.
  • Jenkins stays up until CircleCI has owned one release path.
02What transfers

What survives the move.

“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.

ItemOutcomeImpactWhat happensMitigation
Execute Shell stepspartialcriticalCircleCI says you can paste those commands into run steps in .circleci/config.yml after a first green Getting Started build.Create the config, paste the commands, and install anything that is not on the CircleCI image.
Plugin-driven build stepsmanualcriticalCircleCI says anything beyond Execute Shell needs a manual port against its configuration keys.Inventory every plugin step and replace it with a run step, an orb, or an explicit skip.
Agents and executorsmanualcriticalJenkins labels and node blocks become CircleCI executors, resource classes, or self-hosted runners. Hardware you owned does not appear automatically.Map each label to a CircleCI executor or a self-hosted runner and run the same compile on it.
Credentials and secretsmanualcriticalJenkins Credentials do not export as CircleCI contexts. Values have to be re-entered and rotated.List every credential ID and consumer. Recreate them as project env vars or contexts.
Jenkinsfile stages and when conditionspartialhighDeclarative stages become CircleCI jobs and workflows. when, input, and options need a new expression.Translate each stage to a job, each when to a filter or a logic step, and each input to an approval job.
Shared librariesmanualhighGlobal Pipeline Libraries are Groovy. CircleCI has no Groovy shared-library runtime.Extract the shell they wrap and put it in orbs, commands, or repo scripts.
Build history, test trends, and fingerprintslostmediumJenkins job history stays on the controller.Export reports you still need for audit and accept a new CircleCI baseline.
Plugin-managed artifacts and publisherspartialhighArchive the Artifacts, JUnit, and HTML publisher plugins become store_artifacts, store_test_results, or an external bucket.Write artifacts to a known path and configure CircleCI store steps or an upload command.
Triggers and webhooksmanualhighJenkins Git hooks, cron triggers, and downstream jobs become CircleCI triggers, scheduled workflows, and workflow requires.Recreate each trigger and disable the Jenkins one before cutover.
Controller and agent operationslosthighYou stop patching Jenkins core, plugins, and executor machines. That ops work does not move. It disappears if the move works.Keep the controller read-only through rollback and snapshot it before you power anything down.
Matrix and parallelismpartialmediumJenkins matrix axes and parallel stages become CircleCI matrix jobs or parallelism plus a split.Rehearse the same axis set and compare shard counts.
Folder and RBAC structuremanualmediumJenkins folders and matrix auth become CircleCI projects, groups, and contexts.Rebuild access from a written permission sheet, not from the old folder tree.
03Field and feature mapping

Where each thing goes.

SourceDestinationMethodNotes
Execute Shell commandrun steptransformInstall missing packages on the image.
Jenkinsfile stageCircleCI jobtransformKeep stage order in a workflow.
agent / node labelexecutor or runnermanualConfirm OS and tools.
Jenkins credential IDcontext or project env varmanualRotate the value.
when conditionworkflow filter or logic steptransformTest matching and excluded branches.
input stepapproval jobmanualName the approver group.
shared libraryorb, command, or repo scriptmanualNo Groovy runtime.
JUnit publisherstore_test_resultstransformKeep the XML path stable.
Build triggerCircleCI trigger or schedulemanualDisable the Jenkins trigger first.
04Before you begin

Make the move recoverable.

Backup procedure

Create the source-of-truth backup

Preserve Jenkins job definitions, credentials inventory, and agent images before you change merge gates.

  1. Inventory jobs, Jenkinsfiles, plugins, agents, credentials, triggers, and downstream deploys.
  2. Export job XML or snapshot the Jenkins home you still treat as recoverable.
  3. Copy every Jenkinsfile from the production commit.
  4. List credential IDs and consumers without writing secret values into the ticket.
  5. Record current required checks on the Git host.

Proof to capture: A dated manifest lists every job, plugin step, credential consumer, and required check.

Transformation · CircleCI Getting Started plus .circleci/config.yml

First green CircleCI build

Follow CircleCI's published first step before you paste production shell.

  1. Connect the repo and get a green hello-world build.
  2. Paste Execute Shell commands into run steps.
  3. Install packages that the image does not ship.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

Transformation · Orb registry and repo scripts

Plugin and library rewrite

Remove Groovy and plugin steps that have no CircleCI equivalent.

  1. List every plugin step and shared-library call.
  2. Replace each with a command, orb, or explicit skip.
  3. Test the deploy path with rotated credentials.

Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.

05Handle with care

The things most likely to hurt.

These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.

Pilot

A plugin step is silently skipped

criticalpossible likelihood

The CircleCI job is green but a Jenkins publisher, scanner, or gate never ran.

Consequence
Broken artifacts or skipped security checks ship.
Mitigation
Tick every plugin step on the inventory before you call the pilot done.

Stop if: Any production plugin step lacks a CircleCI replacement or a signed skip.

Cutover

Jenkins and CircleCI both deploy

criticalpossible likelihood

A Git webhook still hits Jenkins after CircleCI is required.

Consequence
Two releases, or a rollback to the wrong build.
Mitigation
Disable Jenkins triggers and downstream jobs before you open CircleCI deploys.

Stop if: The same commit deploys from both systems.

Cleanup

Self-hosted Jenkins agents disappear too early

highpossible likelihood

Someone powers down agents before rollback is closed.

Consequence
You cannot return to Jenkins inside the window.
Mitigation
Keep the controller and a restore snapshot until the observation period ends.

Stop if: Jenkins cannot run the production job from backup.

06Precise timeline

Do the work in this order.

Estimate forOne Jenkins controller with up to 60 jobs and a mix of freestyle and Pipeline builds
Total elapsed15–35 business days
Active work60–130 hours
BufferAdd time for custom agents, shared libraries, or plugin-heavy release trains.
01
Days 1–5Inventory and decisions3–5 days
02
Days 4–8Export and snapshot2–4 days
03
Days 7–20Translate and pilot8–14 days
04
Days 18–28Switch triggers4–8 days
05
Days 26–35Observe and close6–9 days
  1. Days 1–5 · inventory

    Inventory and decisions

    10–18 hours active3–5 days elapsedPlugin and credential owners waiting
    • Inventory jobs, plugins, agents, and credentials.
    • Mark Execute Shell jobs versus plugin-heavy jobs.

    Depends on: Jenkins admin and CircleCI admin access

    Stop / go checkpoint

    Pilot?

    Go when: Every production job has an owner and a CircleCI disposition.

    Stop when: A deploy credential or plugin step is unknown.

  2. Days 4–8 · backup

    Export and snapshot

    6–12 hours active2–4 days elapsedController snapshot waiting
    • Export Jenkinsfiles and job config.
    • Snapshot Jenkins home and list credential IDs.

    Depends on: Approved inventory

    Stop / go checkpoint

    Transform?

    Go when: The snapshot restores a sample job.

    Stop when: Job XML or Jenkinsfiles are incomplete.

  3. Days 7–20 · pilot

    Translate and pilot

    24–60 hours active8–14 days elapsedFirst CircleCI runs waiting
    • Get a green Getting Started build.
    • Port one freestyle and one Pipeline job.
    • Rebuild the deploy credential path.

    Depends on: Verified backup

    Stop / go checkpoint

    Scale?

    Go when: Pilot jobs match Jenkins on the same SHA.

    Stop when: A plugin step has no replacement.

  4. Days 18–28 · cutover

    Switch triggers

    12–28 hours active4–8 days elapsedGit host required checks waiting
    • Port remaining jobs.
    • Move required checks to CircleCI.
    • Disable Jenkins webhooks and downstream deploys.

    Depends on: Passed pilot

    Stop / go checkpoint

    Open production?

    Go when: CircleCI is the only deploy trigger.

    Stop when: Jenkins still runs a production job.

  5. Days 26–35 · observe

    Observe and close

    8–12 hours active6–9 days elapsedRelease cycle waiting
    • Watch scheduled and release jobs.
    • Keep Jenkins powered for rollback.

    Depends on: Verified cutover

    Stop / go checkpoint

    Close rollback?

    Go when: No trigger fires through one release.

    Stop when: A required Jenkins path is missing on CircleCI.

07The point of change

Cut over with a way back.

Go live

Cutover

Make CircleCI the only required CI and the only deploy trigger.

Recommended window: A weekday after a green CircleCI workflow on the default branch.

  1. Freeze Jenkins job edits that affect production.
  2. Merge the approved .circleci/config.yml on the compared commit.
  3. Point the Git host required check at CircleCI.
  4. Disable Jenkins webhooks, cron triggers, and downstream deploys.
  5. Run one production deploy from CircleCI and keep Jenkins recoverable.

Proof to capture: CircleCI owns checks and deploys. Jenkins cannot ship. Pilot results still match.

Return to safety

Rollback

Return checks and deploys to Jenkins without a double release.

Deadline: Before Jenkins agents or the controller snapshot are retired.

  1. Stop CircleCI deploy jobs and schedules.
  2. Restore the Jenkins required check.
  3. Re-enable Jenkins webhooks and downstream jobs.
  4. Disable the CircleCI deploy workflow.
  5. Run one Jenkins release path.

Proof to capture: Jenkins is the merge gate again and only one deploy ran.

Rollback immediately when
  • Required CircleCI check missing
  • Deploy ran twice
  • Plugin step skipped
  • Credential failure
  • Jenkins restore untested
08Verification report

Prove the migration worked.

Every blocking check must pass. Capture the evidence before cleanup begins.

0%
Interactive report preview0 / 8 checks passed
PassIDCheckMethodExpected resultEvidence
V-01BlockingJob coverageCompare the Jenkins job list to CircleCI workflows.Every production job is ported or signed as retired.Job ledger.
V-02BlockingSame-commit parityRun Jenkins and CircleCI on one frozen SHA for the pilot jobs.Tests and artifacts match.Job logs.
V-03BlockingStep replacementTick every plugin step against a CircleCI command or skip.No unsigned skips.Plugin worksheet.
V-04BlockingCredential recreationExercise each rotated context on a non-production job, then the deploy job.Least privilege and a successful auth.Context audit.
V-05BlockingExecutorsRun each mapped label on its CircleCI executor or runner.OS, tools, and architecture match the Jenkins agent.Executor log.
V-06BlockingRequired checksAttempt a merge with CircleCI failing.The branch stays closed.Branch-protection screenshot.
V-07BlockingSingle deployRehearse production with Jenkins triggers disabled.One CircleCI deploy.Deploy log.
V-08BlockingJenkins restoreBoot the snapshot or re-enable the production job.Jenkins can run the job again.Restore note.
09Post-migration cleanup

Remove the scaffolding safely.

Safe after: One full release cycle and seven stable days with Jenkins still restorable.

  1. Archive Jenkins job XML, Jenkinsfiles, and the plugin worksheet.
  2. Revoke Jenkins credentials that CircleCI now holds.
  3. Leave the controller snapshot until legal and billing review finish.
  4. Power down agents only after rollback closes.
  5. Update runbooks with CircleCI workflow names.
  6. Schedule the next context and orb pin review.
10Experiences from the field

When the plan met reality.

First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.

First-person accountAntony Fuentes · Instawork Engineering

Breaking Barriers: Jenkins to CircleCI for seamless E2E test execution2023

Antony Fuentes recounts Instawork moving iOS and Android end-to-end tests from on-premises Jenkins onto CircleCI, where developers already built and deployed. Jenkins ran out of memory, forced old report deletion, drifted Ruby versions, and duplicated every build-process change. The CircleCI move needed Python and pyenv setup, timezone config, environment variables, test data, and custom Allure reporting. Python version mismatches and session-grouping gaps showed up during the rewrite.

What they recommend
  • Inventory QA-only Jenkins jobs separately from the developer pipeline, then give each one an owner on CircleCI.
  • Rehearse mobile E2E on CircleCI with the same Ruby, Python, and report toolchain before you retire the Jenkins agents.
Worth noticing
  • The driver was one pipeline, not a feature-for-feature Jenkins clone.
  • On-prem memory, OS drift, and duplicated build steps were the daily cost of keeping Jenkins for QA only.
First-person accountNagata · KAYAC Engineers' Blog

How we moved Lobi CI from Jenkins to CircleCI2019

KAYAC's SRE team moved Lobi CI off a three-box Jenkins install on Amazon Linux 1 after the AMI end-of-life date approached. Perl, Go, and Node jobs moved onto CircleCI images, with a custom image for the older Perl app. They ran X-large containers at 20-way parallelism. Wall-clock CI fell from about 10 minutes to about 4 or 5 minutes, and queue wait dropped near zero. Visible CI spend roughly doubled from tens of thousands of yen to the low hundreds of thousands, which they judged cheaper than Jenkins maintenance.

What they recommend
  • Treat AMI or OS end-of-life as a reason to leave self-hosted Jenkins, not a reason to rebuild another Jenkins farm.
  • Raise CircleCI parallelism until setup time eats the gain, then stop. Lobi aimed at a five-minute target.
Worth noticing
  • Application code did not change. The work was images, parallelism, and giving up Jenkins plugin care.
  • Higher invoice cost can still be the cheaper move when you stop staffing Jenkins emergencies.
Sources and evidence

Verify against the primary material.

Platform behavior changes. Check these sources and the review dates above before executing a production migration.

  1. CircleCI: migrate from JenkinsAccessed 2026-10-29
  2. Jenkins: pipeline syntaxAccessed 2026-10-29
  3. CircleCI: configuration referenceAccessed 2026-10-29