donal
2018-04-24 da614f523e78ce8ee1f274fb1a5623cdeb5f05b2
commit | author | age
5d0992 1 # The Manual Menace
7c832b 2 > In this lab learners will use Ansible to drive automated provisioning of Projects in Openshift, Git, Jenkins and Nexus.
c951f7 3
7c832b 4 ![automation-xkcd](https://imgs.xkcd.com/comics/automation.png)
D 5
6 ## Exercise Intro
7 In this exercise we will use automation tooling to create Project namespaces for our `CI/CD` tooling along with the `dev` and `test` namespaces for our deployments to live. We do this to manually using the OpenShift CLI; but as we go from cluster to cluster or project to project Dev and Ops teams often find themselves having to redo these tasks again and again. Configuring our cluster using code; we can easily store this in Git and repeat the process again and again. By minimising the time taken to do these repetitive tasks we can accelerate our ability to deliver value to our customers; working on the hard problems they face.
8
9 This exercise uses Ansible to drive the creation of the cluster content. In particular; we'll use a play book called the `OpenShift Applier`. Once the project namespace have been created; we will add some tools to support CI/CD such as Jenkins, Git and Nexus. These tools will be needed by later lessons to automate the build and deploy of our apps. Again; we will use OpenShift Templates and drive their creation in the cluster using Ansible. To prove things are working, finally we'll delete all our content and re-apply the inventory to re-create our clusters content.
5d0992 10
14cd2d 11 #### Why is config-as-code important? 
D 12 * Assurance - Prevents unwanted config changes from people making arbitrary changes to environments. No more Snowflake servers!
13 * Traceability - Commiting config as code means a user has approved and changes can be tracked.
14 * Phoenix Server -  Burn it all to the ground and bring it back; exactly the way it was!
15
5d0992 16 _____
c951f7 17
D 18 ## Learning Outcomes
19 As a learner you will be able to
5d0992 20
D 21 1. Run the OpenShift Applier to automate creating cluster content
22 1. Create and admin project namespaces in OpenShift
23 1. Deploy commonly used applications to support the development process
c951f7 24
D 25 ## Tools and Frameworks
26
5d0992 27 * [GitLab](https://about.gitlab.com/) - Community driven Git server now with integrated DevOps Toolchain.
D 28 * [Nexus](https://www.sonatype.com/nexus-repository-sonatype) - Repository manager for storing lots of application types. Can also host `npm` and `Docker` registries.
29 * [Jenkins](https://jenkins.io/) - OpenSource Build automation server. Highly customisable with plugins.
30 * [Ansible](https://www.ansible.com/) - IT Automation tool used to provision and manage state of cloud and physical infrastructure.
dba30b 31 * [OpenShift Applier](https://github.com/redhat-cop/openshift-applier) - used to apply OpenShift objects to an OpenShift Cluster.
A 32
33
c951f7 34
5d0992 35 ## Big Picture
D 36 This exercise begins with an empty Cluster
37 > TODO - add big picture here...
38
39 _____
c951f7 40
D 41 ## 10,000 Ft View
5d0992 42 > This lab is aimed at the creation of the tooling that will be used to support the rest of the Exercises. The highlevel goal is to create a collection of project namespaces and populate them with Git, Jenkins & Nexus.
D 43
44 If you're feeling confident and don't want to follow the step-by-step guide these highlevel instructions should provide a challenge for you:
45
da614f 46 2. Clone the repo `https://github.com/rht-labs/enablement-ci-cd` which contains the scaffold of the project. Ensure you get all remote branches.
3558ae 47
5d0992 48 2. Create `<your-name>-ci-cd`, `<your-name>-dev` and `<your-name>-test` project namespaces using the inventory and run them with the OpenShift Applier to populate the cluster
da614f 49
D 50 2. Use the templates provided to create build of the jenkins-s2i. The templates are in `exercise1/jenkins-s2i`
3558ae 51
D 52 2. Use the templates provided to create build and deployment configs in `<your-name>-ci-cd` for. Templates are on a branch called `exercise1/git-nexus` && `exercise1/jenkins`:
5d0992 53     * Nexus
D 54     * GitLab
3558ae 55     * Jenkins (using an s2i to pre-configure jenkins)
D 56
5d0992 57 2. Commit your `enablement-ci-cd` repository to the GitLab Instance you've created
3558ae 58
D 59 2. Burn it all down and re-apply your inventory proving config-as-code works. 
c951f7 60
D 61 ## Step by Step Instructions
bc2e43 62 > This is a structured guide with references to exact filenames and explanations.
c951f7 63
bc2e43 64 ### Part 1 - Create OpenShift Projects
de8ebb 65 > _Using the OpenShift Applier, we will add new project namespaces to the cluster which will be used throughout the exercise._
D 66
e7c877 67 3. Clone the scaffold project to your local machine and pull all remote branches for use in later labs. Open the repo in your favourite editor.
bc2e43 68 ```bash
e7c877 69 $ git clone https://github.com/rht-labs/enablement-ci-cd && cd enablement-ci-cd
RH 70 ```
71 Followed by;
72 ```
73 $ for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do
74    git branch --track ${branch#remotes/origin/} $branch
75 done
c951f7 76 ```
D 77
bc2e43 78 3. The project is laid out as follows
D 79 ```
80 .
81 ├── README.md
62db52 82 ├── apply.yml
bc2e43 83 ├── docker
62db52 84 │   └── jenkins-slave-npm
bc2e43 85 ├── inventory
62db52 86 │   ├── host_vars
D 87 │   │   ├── ci-cd-tooling.yml
88 │   │   └── projects-and-policies.yml
89 │   └── hosts
bc2e43 90 ├── jenkins-s2i
D 91 ├── params
62db52 92 │   └── project-requests-ci-cd
bc2e43 93 ├── requirements.yml
D 94 └── templates
62db52 95     └── project-requests.yml
bc2e43 96 ```
D 97  * `docker` folder contains our jenkins-slave images that will be used by the builds.
98  * `jenkins-s2i` contains the configuration and plugins we want to bring jenkins to life with
99  * `params` houses the variables we will load the templates with
100  * `templates` is a collection of OpenShift templates
62db52 101  * `inventory/host_vars/*.yml` is the collection of objects we want to insert into the cluster.
bc2e43 102  * `requirements.yml` is a manifest which contains the ansible modules needed to run the playbook
62db52 103  * `apply.yml` is a playbook that sets up some variables and runs the OpenShift Applier role.
bc2e43 104
da614f 105 3. Open the `apply.yml` file in the root of the project. Update the namespace variables by replacing the `<YOUR_NAME>` with your name or initials. Don't use uppercase or special characters. For example; my name is Dónal so I've created: 
62db52 106 ```yaml
e6805f 107   hosts: "{{ target }}"
62db52 108   vars:
D 109     ci_cd_namespace: donal-ci-cd
110     dev_namespace: donal-dev
111     test_namespace: donal-test
e6805f 112   tasks:
62db52 113 ```
e6805f 114 <p class="tip">
D 115 NOTE - yaml is indentation sensitive so keep things lined up properly!
116 </p>
62db52 117
D 118 3. Open the `inventory/host_vars/projects-and-policies.yml` file; you should see some variables setup already to create the `<YOUR_NAME>-ci-cd` namespace. This object is passed to the OpenShift Applier to call the `templates/project-requests.yml` template with the `params/project-requests-ci-cd` parameters. We will add some additional content here but first let's explore the parameters and the template
119
120 3. Open the `params/project-requests-ci-cd` and replace the `<YOUR_NAME>` with your name to create the correstponding projects in the cluster. 
ff1bd7 121 ![new-item](../images/exercise1/ci-cd-project-namespace.png)
bc2e43 122
62db52 123 3. Let's add two more param files to pass to our template to be able to create a `dev` and `test` project.
D 124   * Create another two params files `params/project-requests-dev` & `params/project-requests-test`. 
da614f 125 ```bash
D 126 $ touch params/project-requests-dev params/project-requests-test
127 ```
62db52 128   * Add to `params/project-requests-dev` the following; substituting `<YOUR_NAME>` accordingly
D 129 ```
130 NAMESPACE=<YOUR_NAME>-dev
131 NAMESPACE_DISPLAY_NAME=<YOUR-NAME> Dev
132 ```
133   * Add to `params/project-requests-test` the following; substituting `<YOUR_NAME>` accordingly
134 ```
135 NAMESPACE=<YOUR_NAME>-test
136 NAMESPACE_DISPLAY_NAME=<YOUR-NAME> Test
137 ```
bc2e43 138
62db52 139 3. In the `inventory/host_vars/projects-and-policies.yml` file; add the new objects for the projects you want to create (dev & test) by adding another object to the content array for each. You can copy and paste them from the `ci-cd` example and update them accordingly. If you do this; remember to change the params file! e.g.
bc2e43 140 ```yaml
62db52 141     - name: "{{ dev_namespace }}"
D 142       template: "{{ playbook_dir }}/templates/project-requests.yml"
ff1bd7 143       template_action: create
62db52 144       params: "{{ playbook_dir }}/params/project-requests-dev"
ff1bd7 145       tags:
D 146       - projects
62db52 147     - name: "{{ test_namespace }}"
D 148       template: "{{ playbook_dir }}/templates/project-requests.yml"
ff1bd7 149       template_action: create
62db52 150       params: "{{ playbook_dir }}/params/project-requests-test"
ff1bd7 151       tags:
D 152       - projects
bc2e43 153 ```
ff1bd7 154 ![project-request-yaml](../images/exercise1/project-request-yml.png)
bc2e43 155
D 156 3. With the configuration in place; install the OpenShift Applier dependency
157 ```bash
158 $ ansible-galaxy install -r requirements.yml --roles-path=roles
159 ```
160
f79b6f 161 3. Apply the inventory by logging into OpenShift and running the following: 
bc2e43 162 ```bash
D 163 $ oc login -p <password> -u <user> <cluster_url>
62db52 164 $ ansible-playbook apply.yml -i inventory/ -e target=bootstrap
D 165 ```
166 where the `-e target=bootstrap` is passing an additional variable specifying that we run the `bootstrap` inventory
bc2e43 167
f79b6f 168 3. Once successful you should see an output similar to this: ![playbook-success](../images/exercise1/play-book-success.png)
bc2e43 169
e6805f 170 3. You can check to see the projects have been created successfully by running 
D 171 ```bash
172 $ oc projects
173 ```
174 ![project-success](../images/exercise1/project-success.png)
175
bc2e43 176 ### Part 2 - Nexus and GitLab
3f16e0 177 > _Now that we have our Projects setup; we can start to populate them with Apps to be used in our dev lifecycle_
bc2e43 178
b43054 179 #### Part 2a - Nexus
3558ae 180 4. In the `enablement-ci-cd` repo, checkout the templates for Nexus by running
3f16e0 181 ```bash
3558ae 182 $ git checkout exercise1/git-nexus templates/nexus.yml
D 183 ```
f79b6f 184 The template contains all the things needed to setup a persistent nexus server, exposing a service and route while also creating the persistent volume needed. Have a read through the template; at the bottom you'll see a collection of parameters we will pass to the template.
3558ae 185
D 186 4. Add some parameters for running the template by creating a new file in the `params` directory. 
187 ```bash
188 $ touch params/nexus
3f16e0 189 ```
D 190
3558ae 191 4. The essential params to inclue in this file are: `params` directory. 
D 192 ```bash
193 VOLUME_CAPACITY=5Gi
194 MEMORY_LIMIT=2Gi
195 ```
196
f9e1bc 197 4. Create a new object in the inventory variables `inventory/host_vars/ci-cd-tooling.yml` called `ci-cd-tooling` and populate it's `content` is as follows
62db52 198
3558ae 199 ```yaml
62db52 200 ---
D 201 ansible_connection: local
202 openshift_cluster_content:
203 - object: ci-cd-tooling
204   content:
f9e1bc 205   - name: "nexus"
D 206     namespace: "{{ ci_cd_namespace }}"
207     template: "{{ playbook_dir }}/templates/nexus.yml"
208     params: "{{ playbook_dir }}/params/nexus"
209     tags:
210     - nexus
3558ae 211 ```
ff1bd7 212 ![ci-cd-deployments-yml](../images/exercise1/ci-cd-deployments-yml.png)
3558ae 213
06fc7b 214 4. Run the OpenShift applier, specifying the tag `nexus` to speed up it's execution (`-e target=tools` is to run the other inventory).
3558ae 215 ```bash
06fc7b 216 $ ansible-playbook apply.yml -e target=tools \
3558ae 217      -i inventory/ \
ff1bd7 218      -e "filter_tags=nexus"
3558ae 219 ```
D 220
b47510 221 4. Once successful; login to the cluster through the browser (using cluster URL) and navigate to the `<YOUR_NAME>-ci-cd`. You should see Nexus up and running. You can login with default credentials (admin / admin123) ![nexus-up-and-running](../images/exercise1/nexus-up-and-running.png)
3558ae 222
b43054 223 #### Part 2b - GitLab
D 224 <p class="tip">
225 NOTE - This section may already have been completed for you, please check with your tutor. If this is the case, skip to section 6 to add your code to GitLab.
226 </p>
227
f79b6f 228 4. Now let's do the same thing for GitLab to get it up and running. Checkout the template and params provided by running
3558ae 229 ```bash
aa106a 230 $ git checkout exercise1/git-nexus templates/gitlab.yml params/gitlab
3558ae 231 ``` 
D 232 Explore the template; it contains the PVC, buildConfig and services. The DeploymentConfig is made up of these apps
233  - Redis (3.2.3)
234  - PostgreSQL (9.4)
235  - GitLab CE (v10.2.3)
236
b47510 237 4. Open the `params/gitlab` file and complete the following params
RH 238 <p class="tip">
239 Note - The values here for the LDAP and BIND credentials will be provided by your tutor.
240 </p>
3558ae 241 ```
D 242 LDAP_BIND_DN=uid=<BIND_USER>,ou=People,dc=<YOUR_DOMAIN>,dc=com
243 LDAP_USER_FILTER=(memberof=CN=YourGroup,OU=Users,DC=<YOUR_DOMAIN>,DC=com)
244 LDAP_PASSWORD=<BIND_USER_PASSWORD>
245 LDAP_HOST=<LDAP_HOST>
246 LDAP_BASE=ou=People,dc=<YOUR_DOMAIN>,dc=com
247 LDAP_LABEL="<LDAP_DESCRIPTION>"
248 GITLAB_ROOT_PASSWORD=<GITLAB_ROOT_USER_PASSWORD>
249 GITLAB_DATA_VOL_SIZE=2Gi
250 POSTGRESQL_VOL_SIZE=1Gi
251 APPLICATION_HOSTNAME=<GITLAB_URL>
c41b51 252 NAMESPACE=<YOUR_NAME>-ci-cd
3558ae 253 ```
D 254 where the following need to be replaced by actual values:
255     * `<BIND_USER>` is the user used to query the LDAP
256     * `<BIND_USER_PASSWORD>` is the password used when querying the LDAP
257     * `<YOUR_DOMAIN>` is the domain the LDAP is hosted on
258     * `<LDAP_HOST>` is fqdn of the LDAP server
259     * `<LDAP_DESCRIPTION>` is the description to be used on the sign-in header for GitLab eg "Name LDAP Login"
260     * `<GITLAB_ROOT_USER_PASSWORD>` is the root user for GOD access on the GitLab instance eg password123
261     * `<GITLAB_URL>` is the endpoint for gitlab. It will take the form `gitlab-<YOUR_NAME>-ci-cd.apps.<ENV_ID>.<YOUR_DOMAIN>.com`
262
62db52 263 4. Create another object in the inventory `inventory/host_vars/ci-cd-tooling.yml` file to run the build & deploy of this template. Add the following and update the `namespace:` accordingly
3558ae 264 ```yaml
ff1bd7 265     - name: "gitlab"
62db52 266       namespace: "{{ ci_cd_namespace }}"
D 267       template: "{{ playbook_dir }}/templates/gitlab.yml"
268       params: "{{ playbook_dir }}/params/gitlab"
ff1bd7 269       tags:
D 270       - gitlab
3558ae 271 ```
D 272
273 4. Run the OpenShift applier, specifying the tag `gitlab` to speed up it's execution.
274 ```bash
06fc7b 275 $ ansible-playbook apply.yml -e target=tools \
3558ae 276      -i inventory/ \
ff1bd7 277      -e "filter_tags=gitlab"
3558ae 278 ```
D 279
ff1bd7 280 4. Once successful; login to the cluster and navigate to the `<YOUR_NAME>-ci-cd`. You should see GitLab up and running. ![gitlab-up-and-running](../images/exercise1/gitlab-up-and-running.png)
c41b51 281
f9e1bc 282 4. Navigate to gitlab (if you have just skipped straight to this step; ask your tutor for the URL). You can login using your cluster credentials using the LDAP tab
ff1bd7 283 ![gitlab-ui](../images/exercise1/gitlab-ui.png)
c41b51 284
f9e1bc 285 4. Once logged in create a new project called `enablement-ci-cd` and mark it as internal. Once created; copy out the `git url` for use on the next step.
ff1bd7 286 ![gitlab-new-project](../images/exercise1/gitlab-new-project.png)
D 287 <p class="tip">
de8ebb 288 Note - we would not normally make the project under your name but create an group and add the project there on residency but for simplicity of the exercise we'll do that here
ff1bd7 289 </p>
D 290
da614f 291 4. Commit your local project to this new origin by first removing the existing origin (github) where the the project was cloned from. Remember to substitute `<GIT_URL>` accordingly
ff1bd7 292 ```bash
da614f 293 $ git remote set-url origin <GIT_URL>
ff1bd7 294 $ git add . 
D 295 $ git commit -m "Adding git and nexus config"
296 $ git push -u origin --all
297 ```
06e3b4 298 **Note - When making changes to enablement-ci-cd you should frequently commit the changes to git.**
bc2e43 299
D 300 ### Part 3 - Jenkins & s2i
de8ebb 301 > _Create a build and deployment config for Jenkins. Add new configuration and plugins to the OCP Stock Jenkins using s2i_
bc2e43 302
ff1bd7 303 5. Add the Jenkins Build & Deployment configs to the `enablement-ci-cd` repo by merging the contents `exercise1/jenkins` in
D 304 ```bash
305 $ git checkout exercise1/jenkins templates/jenkins.yml
306 ```
307 The Jenkins template is essentially the standard persistent jenkins one with OpenShift.
308
2e44a7 309 5. As before; create a new set of params by creating a `params/jenkins` file and adding some overrides to the template and updating the `<YOUR_NAME>` value accordingly.
D 310 ```
ff1bd7 311 MEMORY_LIMIT=8Gi
f54f70 312 VOLUME_CAPACITY=10Gi
ff1bd7 313 JVM_ARCH=x86_64
D 314 NAMESPACE=<YOUR_NAME>-ci-cd
315 JENKINS_OPTS=--sessionTimeout=720
316 ```
62db52 317
2e44a7 318 5. Add a `jenkins` variable to the ansible inventory underneath the nexus (and git if you have it) in  `inventory/host_vars/ci-cd-tooling.yml`.
ff1bd7 319 ```yaml
D 320     - name: "jenkins"
62db52 321       namespace: "{{ ci_cd_namespace }}"
D 322       template: "{{ playbook_dir }}/templates/jenkins.yml"
323       params: "{{ playbook_dir }}/params/jenkins"
ff1bd7 324       tags:
D 325       - jenkins
326 ```
f79b6f 327 This configuration, if applied now, will create the deployment configuration needed for Jenkins but the `${NAMESPACE}:${JENKINS_IMAGE_STREAM_TAG}` in the template won't exist yet.
ff1bd7 328
D 329 5. To create this image we will take the supported OpenShift Jenkins Image and bake into it some extra configuration using an [s2i](https://github.com/openshift/source-to-image) builder image. More information on Jenkins s2i is found on the [openshift/jenkins](https://github.com/openshift/jenkins#installing-using-s2i-build) github page. To create an s2i configuration for jenkins, check out the pre-canned configuration source in the `enablement-ci-cd` repo
330 ```bash
331 $ git checkout exercise1/jenkins-s2i jenkins-s2i
332 ```
2e44a7 333 The structure of the jenkins s2i config is
ff1bd7 334 ```
D 335 jenkins-s2i
336 ├── README.md
337 ├── configuration
338 │   ├── build-failure-analyzer.xml
339 │   ├── init.groovy
340 │   ├── jenkins.plugins.slack.SlackNotifier.xml
2e44a7 341 │   ├── scriptApproval.xml
ff1bd7 342 │   └── jobs
D 343 │       └── seed-multibranch-job
344 │           └── config.xml
345 └── plugins.txt
346 ```
347  * `plugins.txt` is a list of `pluginId:version` for Jenkins to pre-install when starting
348  * `./configuration` contains content that is placed in `${JENKINS_HOME}`. A `config.xml` could be placed in here to control the bulk of Jenkins configuration.
349  * `./configuration/jobs/*` contains job names and xml config that jenkins loads when starting. The seed job in there we will return to in later lessons.
de8ebb 350  * `build-failure-analyzer.xml` is config for the plugin to read the logs and look for key items based on a Regex. More on this in later lessons.
ff1bd7 351  * `init.groovy` contains a collection of settings jenkins configures itself with when launching
D 352
2e44a7 353 5. Let's add a plugin for Jenkins to be started with, [green-balls](https://plugins.jenkins.io/greenballs). This simply changes the default `SUCCESS` status of Jenkins from Blue to Green. Append the `jenkins-s2i/plugins.txt` file with 
ff1bd7 354 ```txt
D 355 greenballs:1.15
356 ``` 
357 ![green-balls.png](../images/exercise1/green-balls.png)
358 Why does Jenkins have Blue Balls? More can be found [on reddit](https://www.reddit.com/r/programming/comments/4lu6q8/why_does_jenkins_have_blue_balls/) or the [jenkins blog](https://jenkins.io/blog/2012/03/13/why-does-jenkins-have-blue-balls/)
359
06e3b4 360 5. Before building and deploying the Jenkins s2i; add git credentials to it. These will be used by Jenkins to access the Git Repositories where our apps will be stored. We want Jenkins to be able to push tags to it so write access is required. There are a few ways we can do this; either adding them to the `template/jenkins.yml` as environment Variables and then including them in the `params/jenkins` file.  We could also create a token in GitLab and use it as the source secret in the jenkins template. 
RH 361 But for simplicity just replace the `<USERNAME>` && `<PASSWORD>` in the `jenkins-s2i/configuration/init.groovy` with your ldap credentials as seen below. This init file gets run when Jenkins launches and will setup the credentials for use in our Jobs in the next exercises
ff1bd7 362 ```groovy
D 363 gitUsername = System.getenv("GIT_USERNAME") ?: "<USERNAME>"
364 gitPassword = System.getenv("GIT_PASSWORD") ?: "<PASSWORD>"
365 ```
2e44a7 366 <p class="tip">
D 367 Note in a residency we would not use your GitCredentials for pushing and pulling from Git, A service user would be created for this.
368 </p>
ff1bd7 369
2e44a7 370 5. Checkout the parms and the templates for the `jenkins-s2i`
D 371 ```bash
372 $ git checkout exercise1/jenkins-s2i params/jenkins-s2i templates/jenkins-s2i.yml
373 ```
374
375 5. Open `params/jenkins-s2i` and add the following content; replacing variables as appropriate. 
ff1bd7 376 ```
da614f 377 SOURCE_REPOSITORY_URL=<GIT_URL>
ff1bd7 378 NAME=jenkins
D 379 SOURCE_REPOSITORY_CONTEXT_DIR=jenkins-s2i
380 IMAGE_STREAM_NAMESPACE=<YOUR_NAME>-ci-cd
da614f 381 SOURCE_REPOSITORY_USERNAME=<YOUR_LDAP_USERNAME>
D 382 SOURCE_REPOSITORY_PASSWORD=<YOUR_LDAP_PASSWORD>
ff1bd7 383 ```
D 384 where 
da614f 385     * `<GIT_URL>` is the full path clone path of the repo where this project is stored (including the https && .git)
de8ebb 386     * `<YOUR_NAME>` is the prefix for your `-ci-cd` project.
D 387     * Explore some of the other parameters in `templates/jenkins-s2i.yml`
da614f 388     * `<YOUR_LDAP_USERNAME>` is the username builder pod will use to login and clone the repo with
D 389     * `<YOUR_LDAP_PASSWORD>` is the password the builder pod will use to authenticate and clone the repo using
de8ebb 390 <p class="tip">
da614f 391 Note in a residency we would not use your GitCredentials for pushing and pulling from Git, A service user would be created or a token generated.
de8ebb 392 </p>
ff1bd7 393
62db52 394 5. Create a new object `ci-cd-builds` in the ansible `inventory/host_vars/ci-cd-tooling.yml` to drive the s2i build configuration.
ff1bd7 395 ```yaml
D 396   - object: ci-cd-builds
397     content:
398     - name: "jenkins-s2i"
62db52 399       namespace: "{{ ci_cd_namespace }}"
D 400       template: "{{ playbook_dir }}/templates/jenkins-s2i.yml"
401       params: "{{ playbook_dir }}/params/jenkins-s2i"
ff1bd7 402       tags:
D 403       - jenkins
404 ```
405
406 5. Commit your code to your GitLab instance
407 ```bash
de8ebb 408 $ git add .
ff1bd7 409 $ git commit -m "Adding Jenkins and Jenkins s2i"
D 410 $ git push
411 ```
412
413 5. When your code is commited; run the OpenShift Applier to add the config to the cluster
414 ```bash
06fc7b 415 $ ansible-playbook apply.yml -e target=tools \
ff1bd7 416      -i inventory/ \
D 417      -e "filter_tags=jenkins"
418 ```
419
de8ebb 420 5. This will trigger a build of the s2i and when it's complete it will add an imagestream of `<YOUR_NAME>-ci-cd/jenkins:latest` to the project. The Deployment config should kick in and deploy the image once it arrives. You can follow the build of the s2i by going to the OpenShift console's project
D 421 ![jenkins-s2i-log](../images/exercise1/jenkins-s2i-log.png)
bc2e43 422
de8ebb 423 5. When the Jenkins deployment has completed; login (using your openshift credentials) and accept the role permissions. You should now see a fairly empty Jenkins with just the seed job
3558ae 424
de8ebb 425 ### Part 4 - Jenkins Hello World 
D 426 > _To test things are working end-to-end; create a hello world job that doesn't do much but proves we can pull code from git and that our balls are green._
427
428 6. Log in to Jenkins and hit `New Item` ![new-item](../images/exercise1/new-item.png).
429
e90e9c 430 6. Create a freestyle job called `hello-world` ![jenkins-new-hello-world](../images/exercise1/jenkins-new-hello-world.png).
de8ebb 431
f79b6f 432 6. On the Source Code Management tab; add your `enablement-ci-cd` git repo and hit the dropdown to add your credentials we baked into the s2i on previous steps ![jenkins-scm-git](../images/exercise1/jenkins-scm-git.png)
de8ebb 433
D 434 6. On the build tab add an Execute Shell step and fill it with `echo "Hello World"` ![jenkins-hello-world](../images/exercise1/jenkins-hello-world.png).
435
436 6. Run the build and we should see if pass succesfully and with Green Balls! ![jenkins-green-balls](../images/exercise1/jenkins-green-balls.png)
437
438 ### Part 5 - Live, Die, Repeat
7c832b 439 > _In this section you will proove the infra as code is working by deleting your Cluster Content and recreating it all_
de8ebb 440
D 441 7. Commit your code to the new repo in GitLab
7c832b 442 ```bash
D 443 $ git add .
444 $ git commit -m "ADD - all ci/cd contents"
445 $ git push
446 ```
de8ebb 447
D 448 7. Burn your OCP content to the ground
7c832b 449 ```bash
D 450 $ oc delete project <YOUR_NAME>-ci-cd
451 $ oc delete project <YOUR_NAME>-dev
452 $ oc delete project <YOUR_NAME>-test
453 ```
de8ebb 454
da614f 455 7. Check to see the projects that were marked for deletion are removed.
D 456 ```bash
457 $ oc get projects | egrep '<YOUR_NAME>-ci-cd|<YOUR_NAME>-dev|<YOUR_NAME>-test'
458 ```
459
7c832b 460 7. Re-apply the inventory to re-create it all!
D 461 ```bash
462 $ oc login -p <password> -u <user> <cluster_url>
463 $ ansible-playbook apply.yml -i inventory/ -e target=bootstrap
464 $ ansible-playbook apply.yml -i inventory/ -e target=tools
465 ```
c951f7 466
5d0992 467 _____
D 468
c951f7 469 ## Extension Tasks
de8ebb 470 > _Ideas for go-getters. Advanced topic for doers to get on with if they finish early. These will usually not have a solution and are provided for additional scope._
c951f7 471
3558ae 472  - Add more secure access for Nexus (ie not admin / admin123) using the automation to drive secret creation
ff1bd7 473  - Add a SonarQube persistent deployment to the `ci-cd-deployments` section.
D 474  - Add `jenkins.plugins.slack.SlackNotifier.xml` to `jenkins-s2i/configuration` to include URL of Slack for team build notifications and rebuild Jenkins S2I
c951f7 475
5d0992 476 _____
D 477
c951f7 478 ## Additional Reading
7c832b 479 > List of links or other reading that might be of use / reference for the exercise
01c4da 480
RH 481 ## Slide links
482
483 - [Intro](https://docs.google.com/presentation/d/1LsfAkH8GfIhulEoy_yd-usWBfDHnZEyQdNvYeTmAg4A/)
484 - [Wrap-up](https://docs.google.com/presentation/d/1cfyJ6SHddZNbM61oz67r870rLYVKY335zGclXN2uLMY/)
5d4563 485 - [All Material](https://drive.google.com/drive/folders/13Bt4BXf9P2OB8VI4YQNcNONF1786dqOx)