From 81a8286699a5d869302a3c7faf6fb2aa3ed74133 Mon Sep 17 00:00:00 2001 From: Daniel Brintzinger Date: Mon, 4 Jul 2022 10:29:24 +0200 Subject: [PATCH] fixes --- content/14-advanced-pipeline/_index.md | 4 ++ content/2-prepare-cluster/_index.md | 4 +- content/3-inner-loop/_index.md | 22 ++++++-- content/5-gitops/_index.md | 73 ++++++++++++++----------- static/images/pipeline1.png | Bin 0 -> 26195 bytes 5 files changed, 64 insertions(+), 39 deletions(-) create mode 100644 static/images/pipeline1.png diff --git a/content/14-advanced-pipeline/_index.md b/content/14-advanced-pipeline/_index.md index c797443..5d01e75 100644 --- a/content/14-advanced-pipeline/_index.md +++ b/content/14-advanced-pipeline/_index.md @@ -98,6 +98,10 @@ ACS is now able to detect and enforce the vulnerability. It is time now to imple ### Let's go: Create our advanced Pipeline +Our current pipeline is quite simple. In production you will have more complex flows with conditionals and parallel execution. To learn more abou these have a look a the [Tekton Documentation]{https://tekton.dev/docs/}. + +To make it bit easier we have prepared a pipeline for you. But do take the time to look at the genera flow and tasks. + In the **OpenShift Web Console**: - Make sure you are in the `workshop-int` Project diff --git a/content/2-prepare-cluster/_index.md b/content/2-prepare-cluster/_index.md index 72389f3..7b26e05 100644 --- a/content/2-prepare-cluster/_index.md +++ b/content/2-prepare-cluster/_index.md @@ -60,6 +60,8 @@ In the cloned repository you'll find a `devfile.yml`. We will need the URL to th ## Install and Prepare CodeReady Workspaces (CRW) +**Codeready Workspaces** is a browser-based IDE for Cloud Native Development. All the heavy lifting is done though a container running your workpsace on OpenShift. All you really need is a laptop. You can easily switch and setup customized environment, plugin, build tools and runtimes. So switching from one project context to another is as easy a switching a website. No more endless installation and configuration marathons on your dev laptop. It is already part your OpenShift subscription. If you want to find out more have a look [here]{https://www.redhat.com/en/technologies/jboss-middleware/codeready-workspaces} + - Install the **Red Hat CodeReady Workspaces for Devfile v1 and v2** Operator from OperatorHub (not the Tech Preview one!) with default settings - Go to **Installed Operators -> CodeReady Workspaces** and create a new instance (**CodeReady Workspaces instance Specification**) using the default settings in the project `openshift-workspaces` - Wait until deployment has finished. This may take a couple of minutes as several components will be deployed. @@ -73,7 +75,7 @@ We could create a workspace from one of the templates that come with CodeReady W {{% /notice %}} - At the top click on **Custom Workspace** -- Copy the **raw**(!) URL of the `devfile.yml` file in your `Gitea` repository by clicking on the file and then on the **Raw** button (or **Originalversion** in German). +- Copy the **raw**(Klick in the **Raw** Button) URL of the `devfile.yml` file in your `Gitea` repository by clicking on the file and then on the **Raw** button (or **Originalversion** in German). - Paste the full URL into the **Enter devfile URL** field and click **Load Devfile** ![Gitea](../images/crw.png) - Once the content of the devfile is loaded click on **Create & Open** at the button diff --git a/content/3-inner-loop/_index.md b/content/3-inner-loop/_index.md index d727aee..2ffc2d5 100644 --- a/content/3-inner-loop/_index.md +++ b/content/3-inner-loop/_index.md @@ -11,10 +11,11 @@ In this part of the workshop you'll experience how modern software development u As an example you'll create a new Java application. You don't need to have prior experience programming in Java as this will be kept really simple. {{% notice tip %}} -We will use a Java application based on the [Quarkus](https://quarkus.io/) stack. Quarkus enables you to create much smaller and faster containerized Java applications than ever before. You can even transcompile these apps to native Linux binaries that start blazingly fast. The app that we will use is just a starter sample created with the [Quarkus Generator](https://code.quarkus.io/) with a simple RESTful API that answers to http Requests. But at the end of the day this setup will work with any Java application. **Fun fact:** Every OpenShift Subscription already comes with a Quarkus Subscription. +We will use a Java application based on the [Quarkus](https://quarkus.io/) stack. Quarkus enables you to create much smaller and faster containerized Java applications than ever before. You can even transcompile these apps to native Linux binaries that start blazingly fast. The app that we will use is just a starter sample created with the [Quarkus Generator](https://code.quarkus.io/) with a simple RESTful API that answers to http Requests. But at the end of the day this setup will work with any Java application. **Fun fact:** Every OpenShift Subscription already comes with a Quarkus Subscription. {{% /notice %}} Let's clone our project into our workspace : + - Bring up your `CodeReady Workspaces` in your browser - In the bottom left click on **Clone Repository** and then enter the `Git URL` to your `Gitea` Repo (You can copy the URL by clicking on the clipboard icon) - Press enter and select the default location. @@ -23,6 +24,8 @@ You should be greeted by the `README.md` file. ## Install odo +**odo** or 'OpenShift do' is a cli that enables developers to get started quickly with cloud native app development without being a Kubernetes expert. It offers support for multiple runtimes and you can easily setup microservice components, push code changes into running containers and debug remotely with just a few simple commands. To find out more, have look [here]{https://odo.dev/} + To install the `odo` cli into your workspace, run the following steps: - From the CRW shortcuts menu to the right (the "cube icon") run `install odo` @@ -41,6 +44,7 @@ Now we want to create a new OpenShift project for our app: - In **My Workspace** (cube icon) to the right click `New Terminal` - Copy the `oc login` command from your OpenShift cluster (At the top right **Username > Copy login command**) and execute in the `terminal` to log into the OpenShift cluster - Create a new project `workshop-dev` + ``` oc new-project workshop-dev ``` @@ -48,31 +52,37 @@ oc new-project workshop-dev ## Use odo to Deploy and Update our Application First use `odo` ("OpenShift Do") to list the programming languages/frameworks it supports + ``` ./odo catalog list components ``` + Now initialize a new Quarkus application + ``` ./odo create java-quarkus ``` -Make the app accessible via http (create a Route) -``` -./odo url create workshop-app -``` + And finally push the app to OpenShift + ``` ./odo push ``` + To test the app: + - In OpenShift open the `workshop-dev` project and switch to the **Developer Console** - Open the **Topology** view and click on the top right link of Application icon to display the website of the app - Your app should show up as a simple web page. In the `RESTEasy JAX-RS` section click the `@Path` endpoint `/hello` to see the result. Now for the fun part: Using `odo` you can just dynamically change your code and push it out again without doing a new image build! No dev magic involved: + - In your CRW Workspace on the left, expand the file tree to open file `src/main/java/org/acme/GreetingRessource.java` and change the string "Hello RESTEasy" to "Hello Workshop" (CRW saves every edit directly. No need to save) - Push the code to OpenShift again + ``` ./odo push ``` + - And reload the app webpage. -- Bam! The change should be there in a matter of seconds +- Bam! The change should be there in a matter of seconds diff --git a/content/5-gitops/_index.md b/content/5-gitops/_index.md index 3c4efd3..c6430c7 100644 --- a/content/5-gitops/_index.md +++ b/content/5-gitops/_index.md @@ -3,26 +3,27 @@ title = "Configure GitOps" weight = 10 +++ -Now that our CI/CD build and integration stage is ready we could promote the app version directly to a production stage. But with the help of the GitOps approach, we can leverage our Git System to handle promotion that is tracked through commits and can deploy and configure the whole production environment. This stage is just too critical to configure manually and without audit. +Now that our CI/CD build and integration stage is ready we could promote the app version directly to a production stage. But with the help of the GitOps approach, we can leverage our Git System to handle promotion that is tracked through commits and can deploy and configure the whole production environment. This stage is just too critical to configure manually and without audit. -## Install OpenShift GitOps +## Install OpenShift GitOps -So let's start be installing the OpenShift GitOps Operator based on project ArgoCD. +So let's start be installing the OpenShift GitOps Operator based on project ArgoCD. - Install the **Red Hat OpenShift GitOps** Operator from OperatorHub with default settings -{{% notice tip %}} -The installation of the GitOps Operator will give you a clusterwide ArgoCD instance available at the link in the top right menu, but since we want to have an instance to manage just our prod namespaces we will create another ArgoCD in that specific namespace. -{{% /notice %}} + {{% notice tip %}} + The installation of the GitOps Operator will give you a clusterwide ArgoCD instance available at the link in the top right menu, but since we want to have an instance to manage just our prod namespaces we will create another ArgoCD in that specific namespace. + {{% /notice %}} - Create a new OpenShift Project `workshop-prod` - Then in the project `workshop-prod` click on **Installed Operators** and then **Red Hat OpenShift GitOps**. - On the **ArgoCD** "tile" click on **Create instance** to create an ArgoCD instance in the `workshop-prod` project. + {{< figure src="../images/argo.png?width=50pc&classes=border,shadow" title="Click image to enlarge" >}} -- Keep the settings as they are and click **Create** +- Keep the settings as they are and click **Create** -## Prepare the GitOps Config Repository +## Prepare the GitOps Config Repository - In `Gitea` create a **New Migration** and clone the Config GitOps Repo which will be the repository that contains our GitOps infrastructure components and state - The URL is https://github.com/devsecops-workshop/openshift-gitops-getting-started.git @@ -33,21 +34,25 @@ Have quick look at the structure of this project : **environments/dev** - contains the `kustomization.yaml` which will be modified by our builds with new Image versions. ArgoCD will pick up these changes and trigger new deployments. - ## Setup GitOps Project -Let's setup the project that tells ArgoCD to watch our config repo and updated resources in the `workshop-prod` project accordingly. +Let's setup the project that tells ArgoCD to watch our config repo and updated resources in the `workshop-prod` project accordingly. - Give namespace `workshop-prod` permissions to pull images from `workshop-int` + ``` oc policy add-role-to-user \ system:image-puller system:serviceaccount:workshop-prod:default \ --namespace=workshop-int ``` + - Find the local **ArgoCD URL** by going to **Networking > Routes** in namespace `workshop-prod` - Open the ArgoCD website ignoring the certificate warning - Don't login with OpenShift but with username and password - User is `admin` and password will be in Secret `argocd-cluster` + +ArgoCD works with the concept of **Apps**. We will create an App and point it to the Config Git Repo. ArgoCD will look for k8s yaml files in the repo and path and deploy them to the defined namespace. Additionally ArgoCD will also react to changes to the repo and reflect these to the namespace. You can also enable self-healing to prevent configuration drift. If you want find out more about OpenShift GitOps have look [here]{https://docs.openshift.com/container-platform/4.10/cicd/gitops/understanding-openshift-gitops.html} : + - Create App - Click the **Manage your applications** icon on the left - Click **Create Application** @@ -59,13 +64,14 @@ oc policy add-role-to-user \ - **Cluster URL**: https://kubernetes.default.svc - **Namespace**: workshop-prod - Click **Create** - - Click on **Sync** and then **Synchronize** to manually trigger the first sync + - Click on **Sync** and then **Synchronize** to manually trigger the first sync + - Click on the `workshop` to show the deployment graph -Watch the resources (`Deployment`, `Service`, `Route`) get rolled out to the namespace `workshop-prod`. Notice we have also scaled our app to 2 pods in the prod stage as we want some HA. +Watch the resources (`Deployment`, `Service`, `Route`) get rolled out to the namespace `workshop-prod`. Notice we have also scaled our app to 2 pods in the prod stage as we want some HA. -Our complete prod stage is now configured and controlled though GitOps. But how do we tell ArgoCD that there is a new version of our app to deploy? Well, we will add a step to our build pipeline updating the config repo. +Our complete prod stage is now configured and controlled though GitOps. But how do we tell ArgoCD that there is a new version of our app to deploy? Well, we will add a step to our build pipeline updating the config repo. -As we do not want to modify our original repo file we will use a tool called [Kustomize](https://kustomize.io/) that can add incremental change layers to YAML files. Since ArgoCD permanently watches this repo it will pick up these Kustomize changes. +As we do not want to modify our original repo file we will use a tool called [Kustomize](https://kustomize.io/) that can add incremental change layers to YAML files. Since ArgoCD permanently watches this repo it will pick up these Kustomize changes. {{% notice tip %}} It is also possible to update the repo with a Pull request. Then you have an approval process for your prod deployment. @@ -77,6 +83,7 @@ Let's add a new custom Tekton task that can update the Image `tag` via Kustomize - In the namespace `workshop-int` switch to the **Administrator** Perspective and go to **Pipelines > Tasks > Create Task** - Replace the YAML definition with the following and click **Create**: + ```yaml apiVersion: tekton.dev/v1beta1 kind: Task @@ -87,7 +94,7 @@ metadata: name: git-update-deployment namespace: workshop-int labels: - app.kubernetes.io/version: '0.1' + app.kubernetes.io/version: "0.1" operator.tekton.dev/provider-type: community spec: description: This Task can be used to update image digest in a Git repo using kustomize @@ -110,14 +117,14 @@ spec: - description: The commit SHA name: commit steps: - - image: 'docker.io/alpine/git:v2.26.2' + - image: "docker.io/alpine/git:v2.26.2" name: git-clone resources: {} script: | rm -rf git-update-digest-workdir git clone $(params.GIT_REPOSITORY) git-update-digest-workdir workingDir: $(workspaces.workspace.path) - - image: 'quay.io/wpernath/kustomize-ubi:latest' + - image: "quay.io/wpernath/kustomize-ubi:latest" name: update-digest resources: {} script: > @@ -159,7 +166,7 @@ spec: cat kustomization.yaml workingDir: $(workspaces.workspace.path) - - image: 'docker.io/alpine/git:v2.26.2' + - image: "docker.io/alpine/git:v2.26.2" name: git-commit resources: {} script: > @@ -225,7 +232,6 @@ spec: workspaces: - description: The workspace consisting of maven project. name: workspace - ``` ## Add Tekton Task to Your Pipeline @@ -233,11 +239,12 @@ spec: - Go to **Pipeline > Pipelines > workshop** and then YAML {{% notice tip %}} -You can edit pipelines either directly in YAML or in the visual **Pipeline Builder**. We will see how to use the Builder later on so let's edit the YAML for now. +You can edit pipelines either directly in YAML or in the visual **Pipeline Builder**. We will see how to use the Builder later on so let's edit the YAML for now. {{% /notice %}} - + Add the new Task to your Pipeline by adding it to the YAML like this: -- In the YAML view insert it at the **tasks** level after the `deploy` task + +- In the YAML view insert it at the **tasks** level after the `deploy` task - For the `param` `GIT_REPOSITORY` use your git config repo url (eg. replace {YOUR DOMAIN}) - Make sure to fix indentation after pasting into the YAML! @@ -275,13 +282,16 @@ In the OpenShift YAML viewer/editor you can mark multiple lines and use **tab** workspace: workspace ``` + The `Pipeline` should now look like this -{{< figure src="../images/tekton.png?width=50pc&classes=border,shadow" title="Click image to enlarge" >}} + +{{< figure src="../images/pipeline1.png?width=50pc&classes=border,shadow" title="Click image to enlarge" >}} - Create a secret with credentials for your `Gitea` repository, so the `task` can authenticate and push to `Gitea`. Replace {YOUR DOMAIN} here to match your `Gitea`URL - You can add this by clicking on the **+** on the top right ob the Web Console + ```yaml kind: Secret apiVersion: v1 @@ -289,31 +299,30 @@ metadata: name: gitea namespace: workshop-int annotations: - tekton.dev/git-0: 'https://repository-git.apps.{YOUR DOMAIN}' + tekton.dev/git-0: "https://repository-git.apps.{YOUR DOMAIN}" data: password: Z2l0ZWE= username: Z2l0ZWE= type: kubernetes.io/basic-auth ``` -Now we need to add the secret to the `serviceaccount` that runs our pipelines so the `task` can push to our config repo. + +Now we need to add the secret to the `serviceaccount` that runs our pipelines so the `task` can push to our config repo. - Go to **User Management > ServiceAccounts > pipeline** - To make the secret available during a pipeline run: Open the YAML and in the `secrets` section add: ```yaml - - name: gitea +- name: gitea ``` + - Save and ignore the warning ## Update our Prod Stage via Pipeline and GitOps - Run the pipeline and see that in your Gitea repo `/environment/dev/kustomize.yaml` is updated with the new image version -{{% notice tip %}} -Notice that the `deploy` and the `git-update` steps now run in parallel. This is one of the powers of Tekton. It can scale natively with pods on OpenShift. -{{% /notice %}} - + {{% notice tip %}} + Notice that the `deploy` and the `git-update` steps now run in parallel. This is one of the powers of Tekton. It can scale natively with pods on OpenShift. + {{% /notice %}} - This will tell ArgoCD to update the `Deployment` with this new image version - Check that the new image is rolled out (you may need to sync manually in ArgoCD to speed things up) - - diff --git a/static/images/pipeline1.png b/static/images/pipeline1.png new file mode 100644 index 0000000000000000000000000000000000000000..cecffe22eef2fc79811339136c08e61ae8390fe7 GIT binary patch literal 26195 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 literal 0 HcmV?d00001