Continuous Integration with Jenkins
This example deploys a container running the Jenkins continuous integration system onto a running
Kubernetes cluster using Pulumi and @pulumi/kubernetes
.
Running the App
Follow the steps in Pulumi Installation and Setup and Configuring Pulumi Kubernetes to get setup with Pulumi and Kubernetes.
Note: The code in this repo assumes you are deploying to a cluster that supports the
LoadBalancer
service type. This includes most cloud providers as well as Docker for Mac Edge w/ Kubernetes. If not (for example if you are targetingminikube
or your own custom Kubernetes cluster), replacetype: "LoadBalancer"
withtype: "ClusterIP"
injenkins.ts
. See the Kubernetes Services docs for more details.
Create a new stack:
$ pulumi stack init dev
Create configuration keys for the root username and password for the Jenkins instance we are about to create:
$ pulumi config set username <your desired username>
$ pulumi config set password <your desired password> --secret
Configure Kubernetes to run without Minikube:
$ pulumi config set isMinikube false
Preview the deployment of the application:
$ pulumi preview
Previewing update (dev):
Type Name Plan
+ pulumi:pulumi:Stack kubernetes-py-jenkins-dev create
+ └─ jenkins:jenkins:Instance dev create
+ ├─ kubernetes:core:Service dev-service create
+ ├─ kubernetes:core:PersistentVolumeClaim dev-pvc create
+ ├─ kubernetes:core:Secret dev-secret create
+ └─ kubernetes:apps:Deployment dev-deploy create
Resources:
+ 6 to create
Perform the deployment:
$ pulumi up --skip-preview
Updating (dev):
Type Name Status
+ pulumi:pulumi:Stack kubernetes-py-jenkins-dev created
+ └─ jenkins:jenkins:Instance dev created
+ ├─ kubernetes:core:PersistentVolumeClaim dev-pvc created
+ ├─ kubernetes:core:Service dev-service created
+ ├─ kubernetes:core:Secret dev-secret created
+ └─ kubernetes:apps:Deployment dev-deploy created
Outputs:
external_ip: "35.239.72.50"
Resources:
+ 6 created
Duration: 1m57s
The deployment is complete! Use pulumi stack output external_ip
to see the IP of the Service that we just deployed:
$ pulumi stack output external_ip
35.239.72.50
The Jenkins instance we just deployed is reachable through port 80 of the external IP address. You can now
visit http://35.239.72.50/login
in a Web browser to begin the first-install flow for your new Jenkins instance.
You can use the username and password that you saved in your Pulumi config to log in to your new Jenkins instance.
Note: If you are deploying to a cluster that does not support
type: "LoadBalancer"
, and deployed the example usingtype: "ClusterIP"
instead, runkubectl port-forward svc/jenkins 8080:80
to forward the cluster port to the local machine and access the service vialocalhost:8080
.
When you’re ready to be done with Jenkins, you can destroy the instance:
$ pulumi destroy
Destroying (dev):
Type Name Status
- pulumi:pulumi:Stack kubernetes-py-jenkins-dev deleted
- └─ jenkins:jenkins:Instance dev deleted
- ├─ kubernetes:core:Secret dev-secret deleted
- ├─ kubernetes:core:Service dev-service deleted
- ├─ kubernetes:core:PersistentVolumeClaim dev-pvc deleted
- └─ kubernetes:apps:Deployment dev-deploy deleted
Outputs:
- external_ip: "35.239.72.50"
Resources:
- 6 deleted
Duration: 33s