Tracing Jenkins's history from the Hudson project in 2004 to the open source fork in 2011, why it remains dominant in enterprises with more than 1,800 plugins, and dissecting the controller and agent architecture.

In episode 0 we powered up Jenkins for the first time — it runs on port 8080, complete with plugins and an admin user. Now it's time to take a pause from typing and understand what you are actually running. This episode builds the context: where Jenkins comes from, why a tool over two decades old is still the backbone of CI/CD at large companies, and how its core architecture is designed.
This context is not just trivia. The architectural decisions you make as an engineer — such as where builds run, or choosing a Freestyle Project vs a Pipeline — are heavily influenced by this understanding. Let's start from the origin.
It all began in 2004, when Kohsuke Kawaguchi, an engineer at Sun Microsystems, created a project named Hudson — a continuous integration server that at the time was one of the first to make the concept of automated, always-monitored builds easy to use.
Historical milestones:
| Year | Event |
|---|---|
| 2004 | Kohsuke Kawaguchi started the Hudson project at Sun Microsystems |
| 2009 | Oracle acquired Sun, and Hudson changed hands |
| 2010 | The community began losing trust in Oracle's development direction and governance |
| 2011 | The majority of contributors forked Hudson and renamed it Jenkins |
| 2013 | Jenkins received a grant from the Oracle Foundation and became a fully community-managed project |
The fork happened because of a governance dispute: the community wanted open and fast development, while Oracle viewed Hudson as a commercial asset. It parallels OpenOffice being forked into LibreOffice — a fork does not always mean a weakening split; sometimes it gives birth to a healthier project because it is run by the people who use it every day. Hudson survived for a while, but Jenkins quickly captured almost the entire plugin ecosystem and user base.
Two decades later, dozens of competitors have emerged — GitLab CI, GitHub Actions, CircleCI, Buildkite. Yet Jenkins remains the top choice at many companies. The reason is not nostalgia but four structural factors:
1. Open source and self-hosted with full control. Jenkins runs on your own infrastructure. Pipeline data, build history, and artifacts never leave the internal network — this is a requirement for regulated industries (finance, healthcare, government) and for teams that want to minimize vendor dependency.
2. The 1,800+ plugin ecosystem. Almost every tool you've ever heard of has a Jenkins plugin: Git, Docker, Kubernetes, Ansible, SonarQube, Slack, and thousands more. It has grown organically for two decades, so it is very likely your needs already have a mature plugin.
3. Unlimited customization. Jenkins does not force a particular workflow. Through Groovy, Jenkins Pipeline, and Shared Libraries, you can build extremely complex flows — from triggers, quality gates, to staged deployment — that would be impossible with SaaS tools constrained by design limits.
4. Massive community and resources. There is an abundance of documentation, books, blog posts, and engineers with deep Jenkins experience. Hiring talent familiar with Jenkins is far easier than for newer tools.
Note
This does not mean Jenkins wins on every dimension. For small teams without an infrastructure administrator, GitLab CI or GitHub Actions are far easier to manage. Jenkins is the best choice when control, customization, and self-hosting are the priorities.
This is the most important concept in the entire series. Jenkins is designed with a controller-agent architecture:
JENKINS_HOME.The analogy: the controller is the restaurant manager who takes orders, arranges the queue, and distributes tasks to the kitchen; agents are the chefs who actually do the cooking. The manager should not cook if more chefs can be added — we will discuss why this is security rule number one in episode 3.
| Aspect | Controller | Agent |
|---|---|---|
| Role | Orchestration, scheduling, UI, plugins | Executing builds and jobs |
| Runs builds? | No (security rule) | Yes |
| Resource needs | Low-medium (web server + JVM) | Scales with build load |
| Production scale example | 1-2 nodes with few executors | Many nodes, possibly dynamic |
Communication between controller and agent can work in two directions: the agent outbound initiates a connection to the controller (via TCP port 50000 — remember we already opened this port in episode 0), or the controller inbound initiates an SSH connection to the agent. From a pipeline perspective, you don't need to care about the direction of communication — what matters is that jobs can be dispatched to any agent.
When a job is triggered, here is what happens:
At first glance this flow looks exactly like the pipeline we will write in episode 2 — and that is the point: the Jenkinsfile describes what needs to be done, and the controller-agent architecture executes it. Here is a minimal example of a pipeline that runs on an agent with a specific label:
pipeline {
agent { label 'linux' }
stages {
stage('Build') {
steps {
echo 'Dijalankan di agent berlabel linux'
}
}
}
}If you want to peek at the build queue contents from the terminal, Jenkins provides a REST API — for example curl http://localhost:8080/queue/api/json — which shows the queue of jobs waiting for a free executor. This is a quick way to see the scheduling part of the architecture we just discussed.
Besides the physical architecture (controller/agent), there is also a logical architecture for defining jobs: Freestyle Project and Jenkins Pipeline.
Freestyle Project is the classic way. Configuration is done through UI forms: filling in the repository URL, adding build steps one by one through dropdowns, configuring triggers through checkboxes. It is fast for simple jobs, but spread across the UI, hard to version, and nearly impossible to make complex.
Jenkins Pipeline defines the entire build as code inside a Jenkinsfile stored in the repository. All changes can be reviewed through pull requests, tested locally, and shared across projects via Shared Libraries.
| Aspect | Freestyle Project | Jenkins Pipeline |
|---|---|---|
| Definition | UI form (ClickOps) | Code (Jenkinsfile) |
| Versioning | None | Yes, in the Git repository |
| Complex structure | Limited | Highly flexible (stage, parallel, conditional) |
| Reusability | Almost zero | Shared Libraries |
| Recommended? | Only very simple jobs | Modern standard |
Tip
The rule of thumb: whatever can be written as a Jenkinsfile, write as a Jenkinsfile. Freestyle is only left for small cases like one-off admin jobs. Starting in episode 2, we will leave Freestyle behind and focus entirely on Jenkins Pipeline.
In episode 1 you have understood:
The key takeaway to carry with you: the controller manages, the agents work, and code is better than clicks. In episode 2 we will start writing that code — creating your first Jenkins Pipeline with a Jenkinsfile, understanding the difference between Declarative and Scripted syntax, and running it directly from Git via SCM checkout. See you in episode 2!