OpenShift CI/CD Operations - Collocated Persistent Jenkins Set Up: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
No edit summary
 
(71 intermediate revisions by the same user not shown)
Line 1: Line 1:
=External=
* https://github.com/openshift/origin/blob/master/examples/jenkins/README.md
=Internal=
=Internal=


* [[OpenShift_CI/CD_Operations#Set_Up_a_Jenkins_CI.2FCD_Pipeline|OpenShift CI/CD Operations]]
* [[OpenShift_CI/CD_Concepts#Collocated_Jenkins|OpenShift CI/CD Concepts]]
 
{{Error|TO REMOVE}}


=Overview=
=Overview=


This is the procedure to install a CI/CD pipeline based on Jenkins. The CI/CD pipeline will execute in the project that need CI/CD services: the Jenkins pod will be created in the same project it triggers builds and deployments for.
This is the procedure to deploy a persistent Jenkins instance in the same project as the application that intends to use it, and configure it to build and deploy the application.
 
=Pre-Requisites=
 
Create the project to host the Jenkins instance and the application instance:
 
oc new-project os3-jenkins-example
 
[[OpenShift_PersistentVolume_Operations#Create_a_NFS_Persistent_Volume|Provision]] a 2Gi persistent volume to be used by Jenkins.
 
Verify that the persistent Jenkins template is available.
 
  oc get template/jenkins-persistent -n openshift
 
=Deploy Persistent Jenkins=
 
oc new-app \
  -p VOLUME_CAPACITY=2Gi \
  -p MEMORY_LIMIT=1Gi \
  -e INSTALL_PLUGINS=analysis-core:1.92,findbugs:4.71,pmd:3.49,checkstyle:3.49,dependency-check-jenkins-plugin:2.1.1,htmlpublisher:1.14,jacoco:2.2.1,analysis-collector:1.52 \
  jenkins-persistent
 
By default, the template enables OAuth integration.
 
After the deployment completes, you should be left with a Jenkins pod that can be accessed with the public URL https://jenkins-os3-jenkins-example.apps.openshift.novaordis.io, using OpenShift credentials, since OAuth integration is supposed to be active.
 
The installation procedure should have created a "system:serviceaccount:os3-jenkins-example:jenkins" service account and given it the "edit" role. Jenkins will authenticate as "system:serviceaccount:os3-jenkins-example:jenkins" to the OpenShift master and will need these permissions to perform its functions. For more security details, see [[OpenShift_CI/CD_Concepts#Security_Considerations|OpenShift CI/CD Security Considerations]].
 
Various configuration adjustments can be performed after installation:
 
====Adjust Readiness Probe Timeout====
 
  [[Oc_set#probe|oc set probe]] dc jenkins --readiness --initial-delay-seconds=500
 
The same effect can be achieved with
 
oc edit dc/jenkins
 
and changing spec/template/spec/containers/name=jenkins/livenessProbe/initialDelaySeconds
 
====Adjust Memory====
 
[[Oc_set#resources|oc set resources]] dc/jenkins --limits=memory=3Gi
 
=Deploy a Sample Application=
 
This is a standard node.js HelloWorld OpenShift example: https://raw.githubusercontent.com/openshift/origin/master/examples/jenkins/application-template.json
 
If can be downloaded locally, inspected, edited, and then instantiated:
 
oc new-app -f ./application-template.json
 
Without additional configuration, the application will create all OpenShift objects required to do a source-to-image build and to deploy and expose the final artifact as https://nodejs-helloworld-sample-os3-jenkins-example.apps.openshift.novaordis.io. However, neither the build nor the deployment start automatically, as the application "expects" its release procedure to be driven by Jenkins.
 
=Configure a Jenkins Project=
 
New Item -> Freestyle project -> "os3-jenkins-example" -> Save.
 
Source Code Management: None.
 
Build:
 
* Scale OpenShift Deployment:
 
Then name of the DeploymentConfig to scale: frontend
 
The number of replicas to scale the deployment to: 0
 
Verify whether the specified number of replicas are up: No
 
* Trigger OpenShift Build
 
The name of the BuildConfig to trigger: frontend
 
* Trigger OpenShift Deployment
 
The name of the DeploymentConfig to trigger a deployment of: frontend
 
* Verify OpenShift Service
 
The name of the Service to verify: frontend
 
* Tag OpenShift Image
 
The name of the ImageStream for the current image tag: origin-nodejs-sample
 
The name of the current image tag or actual image ID: latest
 
The name of the ImageStream for the new image tag: origin-nodejs-sample
 
The name of the new image tag: prod
 
* Verify OpenShift Deployment:


The pipeline is created based on the OpenShift "jenkins-persistent" template, available in the "openshift" project:
The name of the DeploymentConfig to validate: frontend-prod


  oc get templates -n openshift | grep jenkins
The number of replicas you expect the deployment to scale to: 1


NAME                  DESCRIPTION                                    PARAMETERS      OBJECTS
Save
...
jenkins-persistent    Jenkins service, with persistent storage....  8 (all set)      7


No special service account will be created for Jenkins, it will be configured to use the default service account "system:service account:<''project-name''>:default"
=Build=


=Grant Required Permissions=
The build should trigger an OpenShift build of the application, wait for the build to result in a deployment, confirm that the new deployment works, and then tag the image for production.
Tagging the image will trigger the production deployment, which was configured in dc/frontend-prod. In the end, we should get a "frontend" and a "frontend-prod" being deployed and running (for the "prod" pod, the route must be created manually).


Jenkins components need to access the OpenShift API, so the service account that will run the Jenkins pod ("") must be given appropriate permissions:
=Use of Kubernetes Plugin=


oc policy add-role-to-user admin system:service account:<''project-name''>:default
<font color=red>


More details about Jenkins security considerations:
The Jenkins instance was used so far without a [[OpenShift_CI/CD_Concepts#Kubernetes_Plugin|Kubernetes plugin]]. This means <font color=red>?what?</font>.


{{Jenkins_and_OpenShift#Security_Considerations|Jenkins Security Considerations}}
</font>

Latest revision as of 18:34, 12 December 2017

External

Internal


TO REMOVE

Overview

This is the procedure to deploy a persistent Jenkins instance in the same project as the application that intends to use it, and configure it to build and deploy the application.

Pre-Requisites

Create the project to host the Jenkins instance and the application instance:

oc new-project os3-jenkins-example

Provision a 2Gi persistent volume to be used by Jenkins.

Verify that the persistent Jenkins template is available.

 oc get template/jenkins-persistent -n openshift

Deploy Persistent Jenkins

oc new-app \
  -p VOLUME_CAPACITY=2Gi \
  -p MEMORY_LIMIT=1Gi \
  -e INSTALL_PLUGINS=analysis-core:1.92,findbugs:4.71,pmd:3.49,checkstyle:3.49,dependency-check-jenkins-plugin:2.1.1,htmlpublisher:1.14,jacoco:2.2.1,analysis-collector:1.52 \
 jenkins-persistent

By default, the template enables OAuth integration.

After the deployment completes, you should be left with a Jenkins pod that can be accessed with the public URL https://jenkins-os3-jenkins-example.apps.openshift.novaordis.io, using OpenShift credentials, since OAuth integration is supposed to be active.

The installation procedure should have created a "system:serviceaccount:os3-jenkins-example:jenkins" service account and given it the "edit" role. Jenkins will authenticate as "system:serviceaccount:os3-jenkins-example:jenkins" to the OpenShift master and will need these permissions to perform its functions. For more security details, see OpenShift CI/CD Security Considerations.

Various configuration adjustments can be performed after installation:

Adjust Readiness Probe Timeout

 oc set probe dc jenkins --readiness --initial-delay-seconds=500

The same effect can be achieved with

oc edit dc/jenkins

and changing spec/template/spec/containers/name=jenkins/livenessProbe/initialDelaySeconds

Adjust Memory

oc set resources dc/jenkins --limits=memory=3Gi

Deploy a Sample Application

This is a standard node.js HelloWorld OpenShift example: https://raw.githubusercontent.com/openshift/origin/master/examples/jenkins/application-template.json

If can be downloaded locally, inspected, edited, and then instantiated:

oc new-app -f ./application-template.json

Without additional configuration, the application will create all OpenShift objects required to do a source-to-image build and to deploy and expose the final artifact as https://nodejs-helloworld-sample-os3-jenkins-example.apps.openshift.novaordis.io. However, neither the build nor the deployment start automatically, as the application "expects" its release procedure to be driven by Jenkins.

Configure a Jenkins Project

New Item -> Freestyle project -> "os3-jenkins-example" -> Save.

Source Code Management: None.

Build:

  • Scale OpenShift Deployment:

Then name of the DeploymentConfig to scale: frontend

The number of replicas to scale the deployment to: 0

Verify whether the specified number of replicas are up: No

  • Trigger OpenShift Build

The name of the BuildConfig to trigger: frontend

  • Trigger OpenShift Deployment

The name of the DeploymentConfig to trigger a deployment of: frontend

  • Verify OpenShift Service

The name of the Service to verify: frontend

  • Tag OpenShift Image

The name of the ImageStream for the current image tag: origin-nodejs-sample

The name of the current image tag or actual image ID: latest

The name of the ImageStream for the new image tag: origin-nodejs-sample

The name of the new image tag: prod

  • Verify OpenShift Deployment:

The name of the DeploymentConfig to validate: frontend-prod

The number of replicas you expect the deployment to scale to: 1

Save

Build

The build should trigger an OpenShift build of the application, wait for the build to result in a deployment, confirm that the new deployment works, and then tag the image for production. Tagging the image will trigger the production deployment, which was configured in dc/frontend-prod. In the end, we should get a "frontend" and a "frontend-prod" being deployed and running (for the "prod" pod, the route must be created manually).

Use of Kubernetes Plugin

The Jenkins instance was used so far without a Kubernetes plugin. This means ?what?.