This post explains two of the ways to create an OpenShift project-inside the Jenkinsfile and using a template.
While working on a demo, I came across a use case where I need to create an OpenShift project via a Jenkinsfile. So, I started exploring various ways to create a project. This post explains two of the ways-one inside the Jenkinsfile and other using a template.
If you are new to the OpenShift world, a project is a Kubernetes namespace with additional annotations.
The easiest way to create a project is by using the oc command:
Creating an OpenShift project in a Jenkinsfile
Jenkinsfiles are written in Groovy Domain Specific Language (DSL) syntax. The Jenkins Pipeline execution engine supports two DSL syntaxes: Declarative and Scripted. A part of the declarative pipeline syntax looks as shown below:
stage('preamble') { steps { script { openshift.withCluster() { sh 'oc new-project development' sh 'oc new-project testing' sh 'oc new-project production' openshift.withProject() { echo "Using project: ${openshift.project()}" } } } } } As you can see, the shline in the syntax above is an indication that shell commands can be executed inside the Jenkinsfile. You can also execute a shell script file.
Refer to this link to see a sample Jenkinsfile with declarative syntax.
Before using the above syntax, the Jenkins service account needs to have self-provisioner permission:
oc adm policy add-cluster-role-to-user self-provisioner -z jenkins This is the simple and straightforward. The other way to create a project is using a template, which I’ll detail in the following section.
Creating an OpenShift project using templates
A template describes a set of objects that can be parameterized and processed to produce a list of objects for creation by the OpenShift Container Platform. A template can be processed to create anything you have permission to create within a project, such as services, build configurations, and deployment configurations. A template can also define a set of labels to apply to every object defined in the template.
The OpenShift cluster comes with built-in templates. To check all of them, run the following command:
oc get templates -n openshift Let’s start by creating a bootstrap template file:
oc adm create-bootstrap-project-template -o yaml > template.yaml The generated template.yaml should look like this:
apiVersion: template.openshift.io/v1 kind: Template metadata: creationTimestamp: null name: project-request objects: - apiVersion: project.openshift.io/v1 kind: Project metadata: annotations: openshift.io/description: ${PROJECT\_DESCRIPTION} openshift.io/display-name: ${PROJECT\_DISPLAYNAME} openshift.io/requester: ${PROJECT\_REQUESTING\_USER} creationTimestamp: null name: ${PROJECT\_NAME} spec: {} status: {} - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: annotations: openshift.io/description: Allows all pods in this namespace to pull images from this namespace. It is auto-managed by a controller; remove subjects to disable. creationTimestamp: null name: system:image-pullers namespace: ${PROJECT\_NAME} roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:image-puller subjects: - apiGroup: rbac.authorization.k8s.io kind: Group name: system:serviceaccounts:${PROJECT\_NAME} - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: annotations: openshift.io/description: Allows builds in this namespace to push images to this namespace. It is auto-managed by a controller; remove subjects to disable. creationTimestamp: null name: system:image-builders namespace: ${PROJECT\_NAME} roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:image-builder subjects: - kind: ServiceAccount name: builder namespace: ${PROJECT\_NAME} - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: annotations: openshift.io/description: Allows deploymentconfigs in this namespace to rollout pods in this namespace. It is auto-managed by a controller; remove subjects to disable. creationTimestamp: null name: system:deployers namespace: ${PROJECT\_NAME} roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:deployer subjects: - kind: ServiceAccount name: deployer namespace: ${PROJECT\_NAME} - apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: creationTimestamp: null name: admin namespace: ${PROJECT\_NAME} roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: admin subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: ${PROJECT\_ADMIN\_USER} parameters: - name: PROJECT\_NAME - name: PROJECT\_DISPLAYNAME - name: PROJECT\_DESCRIPTION - name: PROJECT\_ADMIN\_USER - name: PROJECT\_REQUESTING\_USER If you observe closely, there are few parameters that needs to be passed, and you can do that with the following command. This command created a project called dev:
oc process -f template.yaml -p PROJECT\_NAME=dev -p PROJECT\_DESCRIPTION=development -p PROJECT\_DISPLAYNAME=dev -p PROJECT\_REQUESTING\_USER=vidya | oc create -f - Now, when you run the below command you should see a new project dev in the list of projects:
oc projects See the solution tutorial to learn more
Experience all of this by creating a Red Hat OpenShift cluster on IBM Cloud by following the step-by-step instructions mentioned in this solution tutorial: “ Scalable web application on OpenShift.”
Originally published at https://www.ibm.com on October 25, 2019.
Top comments (0)