main
1<!DOCTYPE html>
2<html lang="en">
3<head>
4<!-- Oct 07, 2022 -->
5<meta charset="utf-8" />
6<meta name="viewport" content="width=device-width, initial-scale=1" />
7<title>OpenShift Commons</title>
8<meta name="author" content="Vincent Demeester" />
9<meta name="keywords" content="article" />
10<meta name="generator" content="Org Mode" />
11<link rel='icon' type='image/x-icon' href='/images/favicon.ico'/>
12<meta name='viewport' content='width=device-width, initial-scale=1'>
13<link rel='stylesheet' href='/css/new.css' type='text/css'/>
14<link rel='stylesheet' href='/css/syntax.css' type='text/css'/>
15<link href='/index.xml' rel='alternate' type='application/rss+xml' title='Vincent Demeester' />
16</head>
17<body>
18<main id="content" class="content">
19<header>
20<h1 class="title">OpenShift Commons</h1>
21<p class="subtitle" role="doc-subtitle">Support for OpenShift Commons calls & demos</p>
22</header><nav id="table-of-contents" role="doc-toc">
23<h2>Table of Contents</h2>
24<div id="text-table-of-contents" role="doc-toc">
25<ul>
26<li><a href="#h:a5228f76-91f1-4e30-93a9-fe704230a561">Openshift Pipelines</a></li>
27</ul>
28</div>
29</nav>
30
31<section id="outline-container-h:a5228f76-91f1-4e30-93a9-fe704230a561" class="outline-2">
32<h2 id="h:a5228f76-91f1-4e30-93a9-fe704230a561">Openshift Pipelines</h2>
33<div class="outline-text-2" id="text-h:a5228f76-91f1-4e30-93a9-fe704230a561">
34<p>
35OpenShift Pipelines is a cloud-native, continuous integration and delivery (CI/CD)
36solution for building pipelines using [Tekton](<a href="https://tekton.dev">https://tekton.dev</a>). Tekton is a flexible,
37Kubernetes-native, open-source CI/CD framework that enables automating deployments across
38multiple platforms (Kubernetes, serverless, VMs, etc) by abstracting away the underlying
39details.
40</p>
41
42<p>
43OpenShift Pipelines features:
44</p>
45<ul class="org-ul">
46<li>Standard CI/CD pipeline definition based on Tekton</li>
47<li>Build images with Kubernetes tools such as S2I, Buildah, Buildpacks, Kaniko, etc</li>
48<li>Deploy applications to multiple platforms such as Kubernetes, serverless and VMs</li>
49<li>Easy to extend and integrate with existing tools</li>
50<li>Scale pipelines on-demand</li>
51<li>Portable across any Kubernetes platform</li>
52<li>Designed for microservices and decentralized teams</li>
53<li>Integrated with the OpenShift Developer Console</li>
54</ul>
55</div>
56
57<div id="outline-container-h:509fe8c1-2619-496f-b109-dfd67c0e47a1" class="outline-3">
58<h3 id="h:509fe8c1-2619-496f-b109-dfd67c0e47a1">Prerequisite</h3>
59<div class="outline-text-3" id="text-h:509fe8c1-2619-496f-b109-dfd67c0e47a1">
60<p>
61You need an OpenShift 4 cluster in order to complete this tutorial. If you don’t have an
62existing cluster, go to <a href="http://try.openshift.com">http://try.openshift.com</a> and register for free in order to get an
63OpenShift 4 cluster up and running on AWS within minutes.
64</p>
65
66<p>
67You will also use the Tekton CLI (<code>tkn</code>) through out this tutorial. Download the Tekton
68CLI and copy it to a location on your <code>PATH</code>.
69</p>
70</div>
71</div>
72
73<div id="outline-container-h:d958ae3b-de56-4b7c-9355-988579b57389" class="outline-3">
74<h3 id="h:d958ae3b-de56-4b7c-9355-988579b57389">Concepts</h3>
75<div class="outline-text-3" id="text-h:d958ae3b-de56-4b7c-9355-988579b57389">
76<p>
77Tekton defines a number of <a href="https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/">Kubernetes custom resources</a> as building blocks in order to
78standardize pipeline concepts and provide a terminology that is consistent across CI/CD
79solutions. These custom resources (CR) are an extension of Kubernetes that let users
80create and interact with these objects using <code>kubectl</code> and other Kubernetes tools.
81</p>
82
83<p>
84The custom resources needed to define a pipeline are:
85</p>
86<ul class="org-ul">
87<li><code>Task</code>: a reusable, loosely coupled number of steps that perform a specific task (e.g., building a container image)</li>
88<li><code>Pipeline</code>: the definition of the pipeline and the ~Task~s that it should perform</li>
89<li><code>PipelineResource</code>: inputs (e.g., git repository) and outputs (e.g., image registry) to and out of a pipeline or task</li>
90<li><code>TaskRun</code>: the result of running an instance of task</li>
91<li><code>PipelineRun</code>: the result of running an instance of pipeline, which includes a number of ~TaskRun~s</li>
92</ul>
93</div>
94</div>
95
96<div id="outline-container-h:d1d116fb-34e7-43d1-bf1b-2a4a8c3bcb65" class="outline-3">
97<h3 id="h:d1d116fb-34e7-43d1-bf1b-2a4a8c3bcb65">Deploy sample application</h3>
98<div class="outline-text-3" id="text-h:d1d116fb-34e7-43d1-bf1b-2a4a8c3bcb65">
99</div>
100<div id="outline-container-h:b7952df1-d635-4276-8186-b1c209aea268" class="outline-4">
101<h4 id="h:b7952df1-d635-4276-8186-b1c209aea268">Create the project</h4>
102<div class="outline-text-4" id="text-h:b7952df1-d635-4276-8186-b1c209aea268">
103<p>
104We are creating a project, <code>openshift-comons</code>. Building container images using build tools
105such as S2I, Buildah, Kaniko, etc require privileged access to the cluster. OpenShift
106default security settings do not allow privileged containers unless specifically
107configured. Create a service account for running pipelines and enable it to run privileged
108pods for building images.
109</p>
110
111<div class="org-src-container">
112<pre class="src src-bash">oc new-project pipeline-demo
113oc create serviceaccount pipeline
114oc adm policy add-scc-to-user privileged -z pipeline
115oc adm policy add-role-to-user edit -z pipeline
116</pre>
117</div>
118</div>
119</div>
120
121<div id="outline-container-h:070d48bb-7bfd-4cff-b709-60a825f0cab4" class="outline-4">
122<h4 id="h:070d48bb-7bfd-4cff-b709-60a825f0cab4">The application</h4>
123<div class="outline-text-4" id="text-h:070d48bb-7bfd-4cff-b709-60a825f0cab4">
124<p>
125We will use the <a href="https://github.com/spring-projects/spring-petclinic">Spring PetClinic</a> sample application during this tutorial, which is a
126simple Spring Boot application.
127</p>
128
129<div class="org-src-container">
130<pre class="src src-yaml"><span class="org-comment">---</span>
131<span class="org-variable-name">apiVersion</span>: image.openshift.io/v1
132<span class="org-variable-name">kind</span>: ImageStream
133<span class="org-variable-name">metadata</span>:
134 <span class="org-variable-name">labels</span>:
135 <span class="org-variable-name">app</span>: spring-petclinic
136 <span class="org-variable-name">name</span>: spring-petclinic
137<span class="org-comment">---</span>
138<span class="org-variable-name">apiVersion</span>: apps.openshift.io/v1
139<span class="org-variable-name">kind</span>: DeploymentConfig
140<span class="org-variable-name">metadata</span>:
141 <span class="org-variable-name">labels</span>:
142 <span class="org-variable-name">app</span>: spring-petclinic
143 <span class="org-variable-name">name</span>: spring-petclinic
144<span class="org-variable-name">spec</span>:
145 <span class="org-variable-name">replicas</span>: 1
146 <span class="org-variable-name">revisionHistoryLimit</span>: 10
147 <span class="org-variable-name">selector</span>:
148 <span class="org-variable-name">app</span>: spring-petclinic
149 <span class="org-variable-name">deploymentconfig</span>: spring-petclinic
150 <span class="org-variable-name">strategy</span>:
151 <span class="org-variable-name">activeDeadlineSeconds</span>: 21600
152 <span class="org-variable-name">resources</span>: {<span class="org-variable-name">}</span>
153<span class="org-variable-name"> rollingParams</span>:
154 <span class="org-variable-name">intervalSeconds</span>: 1
155 <span class="org-variable-name">maxSurge</span>: 25%
156 <span class="org-variable-name">maxUnavailable</span>: 25%
157 <span class="org-variable-name">timeoutSeconds</span>: 600
158 <span class="org-variable-name">updatePeriodSeconds</span>: 1
159 <span class="org-variable-name">type</span>: Rolling
160 <span class="org-variable-name">template</span>:
161 <span class="org-variable-name">metadata</span>:
162 <span class="org-variable-name">labels</span>:
163 <span class="org-variable-name">app</span>: spring-petclinic
164 <span class="org-variable-name">deploymentconfig</span>: spring-petclinic
165 <span class="org-variable-name">spec</span>:
166 <span class="org-variable-name">containers</span>:
167 - <span class="org-variable-name">image</span>: spring-petclinic:latest
168 <span class="org-variable-name">imagePullPolicy</span>: Always
169 <span class="org-variable-name">livenessProbe</span>:
170 <span class="org-variable-name">failureThreshold</span>: 3
171 <span class="org-variable-name">httpGet</span>:
172 <span class="org-variable-name">path</span>: /
173 <span class="org-variable-name">port</span>: 8080
174 <span class="org-variable-name">scheme</span>: HTTP
175 <span class="org-variable-name">initialDelaySeconds</span>: 45
176 <span class="org-variable-name">periodSeconds</span>: 10
177 <span class="org-variable-name">successThreshold</span>: 1
178 <span class="org-variable-name">timeoutSeconds</span>: 1
179 <span class="org-variable-name">name</span>: spring-petclinic
180 <span class="org-variable-name">ports</span>:
181 - <span class="org-variable-name">containerPort</span>: 8080
182 <span class="org-variable-name">protocol</span>: TCP
183 - <span class="org-variable-name">containerPort</span>: 8443
184 <span class="org-variable-name">protocol</span>: TCP
185 - <span class="org-variable-name">containerPort</span>: 8778
186 <span class="org-variable-name">protocol</span>: TCP
187 <span class="org-variable-name">readinessProbe</span>:
188 <span class="org-variable-name">failureThreshold</span>: 3
189 <span class="org-variable-name">httpGet</span>:
190 <span class="org-variable-name">path</span>: /
191 <span class="org-variable-name">port</span>: 8080
192 <span class="org-variable-name">scheme</span>: HTTP
193 <span class="org-variable-name">initialDelaySeconds</span>: 45
194 <span class="org-variable-name">periodSeconds</span>: 10
195 <span class="org-variable-name">successThreshold</span>: 1
196 <span class="org-variable-name">timeoutSeconds</span>: 5
197 <span class="org-variable-name">resources</span>: {<span class="org-variable-name">}</span>
198<span class="org-variable-name"> terminationMessagePath</span>: /dev/termination-log
199 <span class="org-variable-name">terminationMessagePolicy</span>: File
200 <span class="org-variable-name">dnsPolicy</span>: ClusterFirst
201 <span class="org-variable-name">restartPolicy</span>: Always
202 <span class="org-variable-name">schedulerName</span>: default-scheduler
203 <span class="org-variable-name">securityContext</span>: {<span class="org-variable-name">}</span>
204<span class="org-variable-name"> terminationGracePeriodSeconds</span>: 30
205 <span class="org-variable-name">test</span>: <span class="org-constant">false</span>
206 <span class="org-variable-name">triggers</span>:
207 - <span class="org-variable-name">imageChangeParams</span>:
208 <span class="org-variable-name">containerNames</span>:
209 - spring-petclinic
210 <span class="org-variable-name">from</span>:
211 <span class="org-variable-name">kind</span>: ImageStreamTag
212 <span class="org-variable-name">name</span>: spring-petclinic:latest
213 <span class="org-variable-name">namespace</span>: pipeline-demo
214 <span class="org-variable-name">type</span>: ImageChange
215<span class="org-comment">---</span>
216<span class="org-variable-name">apiVersion</span>: v1
217<span class="org-variable-name">kind</span>: Service
218<span class="org-variable-name">metadata</span>:
219 <span class="org-variable-name">labels</span>:
220 <span class="org-variable-name">app</span>: spring-petclinic
221 <span class="org-variable-name">name</span>: spring-petclinic
222<span class="org-variable-name">spec</span>:
223 <span class="org-variable-name">ports</span>:
224 - <span class="org-variable-name">name</span>: 8080-tcp
225 <span class="org-variable-name">port</span>: 8080
226 <span class="org-variable-name">protocol</span>: TCP
227 <span class="org-variable-name">targetPort</span>: 8080
228 - <span class="org-variable-name">name</span>: 8443-tcp
229 <span class="org-variable-name">port</span>: 8443
230 <span class="org-variable-name">protocol</span>: TCP
231 <span class="org-variable-name">targetPort</span>: 8443
232 - <span class="org-variable-name">name</span>: 8778-tcp
233 <span class="org-variable-name">port</span>: 8778
234 <span class="org-variable-name">protocol</span>: TCP
235 <span class="org-variable-name">targetPort</span>: 8778
236 <span class="org-variable-name">selector</span>:
237 <span class="org-variable-name">app</span>: spring-petclinic
238 <span class="org-variable-name">deploymentconfig</span>: spring-petclinic
239 <span class="org-variable-name">sessionAffinity</span>: None
240 <span class="org-variable-name">type</span>: ClusterIP
241<span class="org-comment">---</span>
242<span class="org-variable-name">apiVersion</span>: route.openshift.io/v1
243<span class="org-variable-name">kind</span>: Route
244<span class="org-variable-name">metadata</span>:
245 <span class="org-variable-name">labels</span>:
246 <span class="org-variable-name">app</span>: spring-petclinic
247 <span class="org-variable-name">name</span>: spring-petclinic
248<span class="org-variable-name">spec</span>:
249 <span class="org-variable-name">port</span>:
250 <span class="org-variable-name">targetPort</span>: 8080-tcp
251 <span class="org-variable-name">to</span>:
252 <span class="org-variable-name">kind</span>: Service
253 <span class="org-variable-name">name</span>: spring-petclinic
254 <span class="org-variable-name">weight</span>: 100
255</pre>
256</div>
257</div>
258</div>
259
260<div id="outline-container-h:9abbbf9d-553a-40a6-b9b1-bee2fc250f4e" class="outline-4">
261<h4 id="h:9abbbf9d-553a-40a6-b9b1-bee2fc250f4e">The tasks</h4>
262<div class="outline-text-4" id="text-h:9abbbf9d-553a-40a6-b9b1-bee2fc250f4e">
263<ul class="org-ul">
264<li><p>
265<code>openshift-client</code> from the <a href="https://github.com/tektoncd/catalog/">upstream catalog</a> (see <a href="https://raw.githubusercontent.com/tektoncd/catalog/658c021e86ce45c9396031a98df32ee50d2dc19e/openshift-client/openshift-client-task.yaml">here</a>)
266</p>
267<div class="org-src-container">
268<pre class="src src-yaml"><span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
269<span class="org-variable-name">kind</span>: Task
270<span class="org-variable-name">metadata</span>:
271 <span class="org-variable-name">name</span>: openshift-client
272<span class="org-variable-name">spec</span>:
273 <span class="org-variable-name">inputs</span>:
274 <span class="org-variable-name">params</span>:
275 - <span class="org-variable-name">name</span>: ARGS
276 <span class="org-variable-name">description</span>: The OpenShift CLI arguments to run
277 <span class="org-variable-name">default</span>: help
278 <span class="org-variable-name">steps</span>:
279 - <span class="org-variable-name">name</span>: oc
280 <span class="org-variable-name">image</span>: quay.io/openshift-pipeline/openshift-cli:0.5.0
281 <span class="org-variable-name">command</span>: [<span class="org-string">"/usr/local/bin/oc"</span>]
282 <span class="org-variable-name">args</span>:
283 - <span class="org-string">"${inputs.params.ARGS}"</span>
284</pre>
285</div></li>
286
287<li><p>
288<code>s2i-java</code> from our <a href="https://github.com/openshift/pipelines-catalog/">downstream catalog</a> (see <a href="https://raw.githubusercontent.com/openshift/pipelines-catalog/master/s2i-java-8/s2i-java-8-task.yaml">here</a>)
289</p>
290<div class="org-src-container">
291<pre class="src src-yaml"><span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
292<span class="org-variable-name">kind</span>: Task
293<span class="org-variable-name">metadata</span>:
294 <span class="org-variable-name">name</span>: s2i-java-8
295<span class="org-variable-name">spec</span>:
296 <span class="org-variable-name">inputs</span>:
297 <span class="org-variable-name">resources</span>:
298 - <span class="org-variable-name">name</span>: source
299 <span class="org-variable-name">type</span>: git
300 <span class="org-variable-name">params</span>:
301 - <span class="org-variable-name">name</span>: PATH_CONTEXT
302 <span class="org-variable-name">description</span>: The location of the path to run s2i from.
303 <span class="org-variable-name">default</span>: .
304 - <span class="org-variable-name">name</span>: TLSVERIFY
305 <span class="org-variable-name">description</span>: Verify the TLS on the registry endpoint (for push/pull to a non-TLS registry)
306 <span class="org-variable-name">default</span>: <span class="org-string">"true"</span>
307 <span class="org-variable-name">outputs</span>:
308 <span class="org-variable-name">resources</span>:
309 - <span class="org-variable-name">name</span>: image
310 <span class="org-variable-name">type</span>: image
311 <span class="org-variable-name">steps</span>:
312 - <span class="org-variable-name">name</span>: generate
313 <span class="org-variable-name">image</span>: quay.io/openshift-pipeline/s2i
314 <span class="org-variable-name">workingdir</span>: /workspace/source
315 <span class="org-variable-name">command</span>: [<span class="org-string">'s2i'</span>, <span class="org-string">'build'</span>, <span class="org-string">'${inputs.params.PATH_CONTEXT}'</span>, <span class="org-string">'registry.access.redhat.com/redhat-openjdk-18/openjdk18-openshift'</span>, <span class="org-string">'--image-scripts-url'</span>, <span class="org-string">'image:///usr/local/s2i'</span>, <span class="org-string">'--as-dockerfile'</span>, <span class="org-string">'/gen-source/Dockerfile.gen'</span>]
316 <span class="org-variable-name">volumeMounts</span>:
317 - <span class="org-variable-name">name</span>: gen-source
318 <span class="org-variable-name">mountPath</span>: /gen-source
319 - <span class="org-variable-name">name</span>: build
320 <span class="org-variable-name">image</span>: quay.io/buildah/stable
321 <span class="org-variable-name">workingdir</span>: /gen-source
322 <span class="org-variable-name">command</span>: [<span class="org-string">'buildah'</span>, <span class="org-string">'bud'</span>, <span class="org-string">'--tls-verify=${inputs.params.TLSVERIFY}'</span>, <span class="org-string">'--layers'</span>, <span class="org-string">'-f'</span>, <span class="org-string">'/gen-source/Dockerfile.gen'</span>, <span class="org-string">'-t'</span>, <span class="org-string">'${outputs.resources.image.url}'</span>, <span class="org-string">'.'</span>]
323 <span class="org-variable-name">volumeMounts</span>:
324 - <span class="org-variable-name">name</span>: varlibcontainers
325 <span class="org-variable-name">mountPath</span>: /var/lib/containers
326 - <span class="org-variable-name">name</span>: gen-source
327 <span class="org-variable-name">mountPath</span>: /gen-source
328 <span class="org-variable-name">securityContext</span>:
329 <span class="org-variable-name">privileged</span>: <span class="org-constant">true</span>
330 - <span class="org-variable-name">name</span>: push
331 <span class="org-variable-name">image</span>: quay.io/buildah/stable
332 <span class="org-variable-name">command</span>: [<span class="org-string">'buildah'</span>, <span class="org-string">'push'</span>, <span class="org-string">'--tls-verify=${inputs.params.TLSVERIFY}'</span>, <span class="org-string">'${outputs.resources.image.url}'</span>, <span class="org-string">'docker://${outputs.resources.image.url}'</span>]
333 <span class="org-variable-name">volumeMounts</span>:
334 - <span class="org-variable-name">name</span>: varlibcontainers
335 <span class="org-variable-name">mountPath</span>: /var/lib/containers
336 <span class="org-variable-name">securityContext</span>:
337 <span class="org-variable-name">privileged</span>: <span class="org-constant">true</span>
338 <span class="org-variable-name">volumes</span>:
339 - <span class="org-variable-name">name</span>: varlibcontainers
340 <span class="org-variable-name">emptyDir</span>: {<span class="org-variable-name">}</span>
341<span class="org-variable-name"> - name</span>: gen-source
342 <span class="org-variable-name">emptyDir</span>: {}
343</pre>
344</div></li>
345</ul>
346</div>
347</div>
348
349<div id="outline-container-h:6d4e1c61-9ae8-46f9-8917-e4a99ae59d2b" class="outline-4">
350<h4 id="h:6d4e1c61-9ae8-46f9-8917-e4a99ae59d2b">The pipeline</h4>
351<div class="outline-text-4" id="text-h:6d4e1c61-9ae8-46f9-8917-e4a99ae59d2b">
352<p>
353A pipeline defines a number of tasks that should be executed and how they interact with
354each other via their inputs and outputs.
355</p>
356
357<p>
358Here is the YAML file that represents the above pipeline:
359</p>
360
361<div class="org-src-container">
362<pre class="src src-yaml"><span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
363<span class="org-variable-name">kind</span>: Pipeline
364<span class="org-variable-name">metadata</span>:
365 <span class="org-variable-name">name</span>: petclinic-deploy-pipeline
366<span class="org-variable-name">spec</span>:
367 <span class="org-variable-name">resources</span>:
368 - <span class="org-variable-name">name</span>: app-git
369 <span class="org-variable-name">type</span>: git
370 - <span class="org-variable-name">name</span>: app-image
371 <span class="org-variable-name">type</span>: image
372 <span class="org-variable-name">tasks</span>:
373 - <span class="org-variable-name">name</span>: build
374 <span class="org-variable-name">taskRef</span>:
375 <span class="org-variable-name">name</span>: s2i-java-8
376 <span class="org-variable-name">params</span>:
377 - <span class="org-variable-name">name</span>: TLSVERIFY
378 <span class="org-variable-name">value</span>: <span class="org-string">"false"</span>
379 <span class="org-variable-name">resources</span>:
380 <span class="org-variable-name">inputs</span>:
381 - <span class="org-variable-name">name</span>: source
382 <span class="org-variable-name">resource</span>: app-git
383 <span class="org-variable-name">outputs</span>:
384 - <span class="org-variable-name">name</span>: image
385 <span class="org-variable-name">resource</span>: app-image
386 - <span class="org-variable-name">name</span>: deploy
387 <span class="org-variable-name">taskRef</span>:
388 <span class="org-variable-name">name</span>: openshift-client
389 <span class="org-variable-name">runAfter</span>:
390 - build
391 <span class="org-variable-name">params</span>:
392 - <span class="org-variable-name">name</span>: ARGS
393 <span class="org-variable-name">value</span>: <span class="org-string">"rollout latest spring-petclinic"</span>
394</pre>
395</div>
396
397<p>
398This pipeline performs the following:
399</p>
400<ol class="org-ol">
401<li>Clones the source code of the application from a Git repository (<code>app-git</code> resource)</li>
402<li>Builds the container image using the <code>s2i-java-8</code> task that generates a Dockerfile for the application and uses <a href="https://buildah.io/">Buildah</a> to build the image</li>
403<li>The application image is pushed to an image registry (<code>app-image</code> resource)</li>
404<li>The new application image is deployed on OpenShift using the <code>openshift-cli</code></li>
405</ol>
406
407<p>
408You might have noticed that there are no references to the PetClinic Git repository and
409its image in the registry. That’s because ~Pipeline~s in Tekton are designed to be
410generic and re-usable across environments and stages through the application’s
411lifecycle. ~Pipeline~s abstract away the specifics of the Git source repository and image
412to be produced as ~resource~s. When triggering a pipeline, you can provide different Git
413repositories and image registries to be used during pipeline execution. Be patient! You
414will do that in a little bit in the next section.
415</p>
416</div>
417</div>
418
419<div id="outline-container-h:3f4a9686-427f-455d-9fd3-aa3741bf089d" class="outline-4">
420<h4 id="h:3f4a9686-427f-455d-9fd3-aa3741bf089d">The resources</h4>
421<div class="outline-text-4" id="text-h:3f4a9686-427f-455d-9fd3-aa3741bf089d">
422<p>
423Now that the pipeline is created, you can trigger it to execute the tasks specified in the
424pipeline. Triggering pipelines is an area that is under development and in the next
425release it will be possible to be done via the OpenShift web console and Tekton CLI. In
426this tutorial, you will trigger the pipeline through creating the Kubernetes objects (the
427hard way!) in order to learn the mechanics of triggering.
428</p>
429
430<p>
431First, you should create a number of ~PipelineResource~s that contain the specifics of the
432Git repository and image registry to be used in the pipeline during execution. Expectedly,
433these are also reusable across multiple pipelines.
434</p>
435
436<div class="org-src-container">
437<pre class="src src-yaml"><span class="org-comment">---</span>
438<span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
439<span class="org-variable-name">kind</span>: PipelineResource
440<span class="org-variable-name">metadata</span>:
441 <span class="org-variable-name">name</span>: petclinic-image
442<span class="org-variable-name">spec</span>:
443 <span class="org-variable-name">type</span>: image
444 <span class="org-variable-name">params</span>:
445 - <span class="org-variable-name">name</span>: url
446 <span class="org-variable-name">value</span>: image-registry.openshift-image-registry.svc:5000/pipeline-demo/spring-petclinic
447<span class="org-comment">---</span>
448<span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
449<span class="org-variable-name">kind</span>: PipelineResource
450<span class="org-variable-name">metadata</span>:
451 <span class="org-variable-name">name</span>: petclinic-git
452<span class="org-variable-name">spec</span>:
453 <span class="org-variable-name">type</span>: git
454 <span class="org-variable-name">params</span>:
455 - <span class="org-variable-name">name</span>: url
456 <span class="org-variable-name">value</span>: https://github.com/spring-projects/spring-petclinic
457</pre>
458</div>
459</div>
460</div>
461
462<div id="outline-container-h:c3372a6a-f189-4029-a5ba-a40193dd42bd" class="outline-4">
463<h4 id="h:c3372a6a-f189-4029-a5ba-a40193dd42bd">Run the pipeline</h4>
464<div class="outline-text-4" id="text-h:c3372a6a-f189-4029-a5ba-a40193dd42bd">
465<p>
466A <code>PipelineRun</code> is how you can start a pipeline and tie it to the Git and image resources
467that should be used for this specific invocation. You can start the pipeline using the
468CLI:
469</p>
470
471<div class="org-src-container">
472<pre class="src src-bash">tkn pipeline start petclinic-deploy-pipeline <span class="org-sh-escaped-newline">\</span>
473 -r app-git=petclinic-git <span class="org-sh-escaped-newline">\</span>
474 -r app-image=petclinic-image <span class="org-sh-escaped-newline">\</span>
475 -s pipeline
476</pre>
477</div>
478</div>
479</div>
480
481<div id="outline-container-h:d33b093d-e6f0-4601-a9e6-0a669a4dcc2c" class="outline-4">
482<h4 id="h:d33b093d-e6f0-4601-a9e6-0a669a4dcc2c"><code>tkn</code> features</h4>
483<div class="outline-text-4" id="text-h:d33b093d-e6f0-4601-a9e6-0a669a4dcc2c">
484<div class="org-src-container">
485<pre class="src src-bash">tkn pipeline logs -f
486tkn pipeline start petclinic-deploy-pipeline --last
487
488tkn resource list
489tkn task list
490tkn taskrun list
491tkn pipeline list
492tkn pipelinerun list
493
494<span class="org-comment-delimiter"># </span><span class="org-comment">same with logs, descibe, …</span>
495</pre>
496</div>
497</div>
498</div>
499</div>
500
501<div id="outline-container-h:dc6a9055-eefc-4029-97c1-aab98f2147a0" class="outline-3">
502<h3 id="h:dc6a9055-eefc-4029-97c1-aab98f2147a0">Additionnals Tasks and Pipeline</h3>
503<div class="outline-text-3" id="text-h:dc6a9055-eefc-4029-97c1-aab98f2147a0">
504</div>
505<div id="outline-container-h:b5add1e6-379f-4442-87b9-d8800ef38481" class="outline-4">
506<h4 id="h:b5add1e6-379f-4442-87b9-d8800ef38481">Tasks</h4>
507<div class="outline-text-4" id="text-h:b5add1e6-379f-4442-87b9-d8800ef38481">
508<div class="org-src-container">
509<pre class="src src-yaml"><span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
510<span class="org-variable-name">kind</span>: Task
511<span class="org-variable-name">metadata</span>:
512 <span class="org-variable-name">name</span>: golangci-lint
513<span class="org-variable-name">spec</span>:
514 <span class="org-variable-name">inputs</span>:
515 <span class="org-variable-name">params</span>:
516 - <span class="org-variable-name">name</span>: package
517 <span class="org-variable-name">description</span>: base package (and its children) under validation
518 - <span class="org-variable-name">name</span>: flags
519 <span class="org-variable-name">description</span>: flags to use for the test command
520 <span class="org-variable-name">default</span>: --verbose
521 - <span class="org-variable-name">name</span>: version
522 <span class="org-variable-name">default</span>: golangci-lint version to use
523 <span class="org-variable-name">default</span>: <span class="org-string">"v1.17.1"</span>
524 - <span class="org-variable-name">name</span>: GOOS
525 <span class="org-variable-name">description</span>: <span class="org-string">"running operating system target"</span>
526 <span class="org-variable-name">default</span>: linux
527 - <span class="org-variable-name">name</span>: GOARCH
528 <span class="org-variable-name">description</span>: <span class="org-string">"running architecture target"</span>
529 <span class="org-variable-name">default</span>: amd64
530 - <span class="org-variable-name">name</span>: GO111MODULE
531 <span class="org-variable-name">description</span>: <span class="org-string">"value of module support"</span>
532 <span class="org-variable-name">default</span>: auto
533 <span class="org-variable-name">resources</span>:
534 - <span class="org-variable-name">name</span>: source
535 <span class="org-variable-name">type</span>: git
536 <span class="org-variable-name">targetPath</span>: src/${inputs.params.package}
537 <span class="org-variable-name">steps</span>:
538 - <span class="org-variable-name">name</span>: lint
539 <span class="org-variable-name">image</span>: golangci/golangci-lint:${inputs.params.version}
540 <span class="org-variable-name">workingdir</span>: /workspace/src/${inputs.params.package}
541 <span class="org-variable-name">command</span>:
542 - /bin/bash
543 <span class="org-variable-name">args</span>:
544 - -c
545 - <span class="org-string">"golangci-lint run ${inputs.params.flags}"</span>
546 <span class="org-variable-name">env</span>:
547 - <span class="org-variable-name">name</span>: GOPATH
548 <span class="org-variable-name">value</span>: /workspace
549 - <span class="org-variable-name">name</span>: GOOS
550 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GOOS}"</span>
551 - <span class="org-variable-name">name</span>: GOARCH
552 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GOARCH}"</span>
553 - <span class="org-variable-name">name</span>: GO111MODULE
554 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GO111MODULE}"</span>
555<span class="org-comment">---</span>
556<span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
557<span class="org-variable-name">kind</span>: Task
558<span class="org-variable-name">metadata</span>:
559 <span class="org-variable-name">name</span>: golang-test
560<span class="org-variable-name">spec</span>:
561 <span class="org-variable-name">inputs</span>:
562 <span class="org-variable-name">params</span>:
563 - <span class="org-variable-name">name</span>: package
564 <span class="org-variable-name">description</span>: package (and its children) under test
565 - <span class="org-variable-name">name</span>: packages
566 <span class="org-variable-name">description</span>: <span class="org-string">"packages to test (default: ./...)"</span>
567 <span class="org-variable-name">default</span>: <span class="org-string">"./..."</span>
568 - <span class="org-variable-name">name</span>: version
569 <span class="org-variable-name">description</span>: golang version to use for tests
570 <span class="org-variable-name">default</span>: <span class="org-string">"1.12"</span>
571 - <span class="org-variable-name">name</span>: flags
572 <span class="org-variable-name">description</span>: flags to use for the test command
573 <span class="org-variable-name">default</span>: -race -cover -v
574 - <span class="org-variable-name">name</span>: GOOS
575 <span class="org-variable-name">description</span>: <span class="org-string">"running program's operating system target"</span>
576 <span class="org-variable-name">default</span>: linux
577 - <span class="org-variable-name">name</span>: GOARCH
578 <span class="org-variable-name">description</span>: <span class="org-string">"running program's architecture target"</span>
579 <span class="org-variable-name">default</span>: amd64
580 - <span class="org-variable-name">name</span>: GO111MODULE
581 <span class="org-variable-name">description</span>: <span class="org-string">"value of module support"</span>
582 <span class="org-variable-name">default</span>: auto
583 <span class="org-variable-name">resources</span>:
584 - <span class="org-variable-name">name</span>: source
585 <span class="org-variable-name">type</span>: git
586 <span class="org-variable-name">targetPath</span>: src/${inputs.params.package}
587 <span class="org-variable-name">steps</span>:
588 - <span class="org-variable-name">name</span>: unit-test
589 <span class="org-variable-name">image</span>: golang:${inputs.params.version}
590 <span class="org-variable-name">workingdir</span>: /workspace/src/${inputs.params.package}
591 <span class="org-variable-name">command</span>:
592 - /bin/bash
593 <span class="org-variable-name">args</span>:
594 - -c
595 - <span class="org-string">"go test ${inputs.params.flags} ${inputs.params.packages}"</span>
596 <span class="org-variable-name">env</span>:
597 - <span class="org-variable-name">name</span>: GOPATH
598 <span class="org-variable-name">value</span>: /workspace
599 - <span class="org-variable-name">name</span>: GOOS
600 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GOOS}"</span>
601 - <span class="org-variable-name">name</span>: GOARCH
602 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GOARCH}"</span>
603 - <span class="org-variable-name">name</span>: GO111MODULE
604 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GO111MODULE}"</span>
605<span class="org-comment">---</span>
606<span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
607<span class="org-variable-name">kind</span>: Task
608<span class="org-variable-name">metadata</span>:
609 <span class="org-variable-name">name</span>: golang-build
610<span class="org-variable-name">spec</span>:
611 <span class="org-variable-name">inputs</span>:
612 <span class="org-variable-name">params</span>:
613 - <span class="org-variable-name">name</span>: package
614 <span class="org-variable-name">description</span>: base package to build in
615 - <span class="org-variable-name">name</span>: packages
616 <span class="org-variable-name">description</span>: <span class="org-string">"packages to build (default: ./cmd/...)"</span>
617 <span class="org-variable-name">default</span>: <span class="org-string">"./cmd/..."</span>
618 - <span class="org-variable-name">name</span>: version
619 <span class="org-variable-name">description</span>: golang version to use for builds
620 <span class="org-variable-name">default</span>: <span class="org-string">"1.12"</span>
621 - <span class="org-variable-name">name</span>: flags
622 <span class="org-variable-name">description</span>: flags to use for the test command
623 <span class="org-variable-name">default</span>: -v
624 - <span class="org-variable-name">name</span>: GOOS
625 <span class="org-variable-name">description</span>: <span class="org-string">"running program's operating system target"</span>
626 <span class="org-variable-name">default</span>: linux
627 - <span class="org-variable-name">name</span>: GOARCH
628 <span class="org-variable-name">description</span>: <span class="org-string">"running program's architecture target"</span>
629 <span class="org-variable-name">default</span>: amd64
630 - <span class="org-variable-name">name</span>: GO111MODULE
631 <span class="org-variable-name">description</span>: <span class="org-string">"value of module support"</span>
632 <span class="org-variable-name">default</span>: auto
633 <span class="org-variable-name">resources</span>:
634 - <span class="org-variable-name">name</span>: source
635 <span class="org-variable-name">type</span>: git
636 <span class="org-variable-name">targetPath</span>: src/${inputs.params.package}
637 <span class="org-variable-name">steps</span>:
638 - <span class="org-variable-name">name</span>: build
639 <span class="org-variable-name">image</span>: golang:${inputs.params.version}
640 <span class="org-variable-name">workingdir</span>: /workspace/src/${inputs.params.package}
641 <span class="org-variable-name">command</span>:
642 - /bin/bash
643 <span class="org-variable-name">args</span>:
644 - -c
645 - <span class="org-string">"go build ${inputs.params.flags} ${inputs.params.packages}"</span>
646 <span class="org-variable-name">env</span>:
647 - <span class="org-variable-name">name</span>: GOPATH
648 <span class="org-variable-name">value</span>: /workspace
649 - <span class="org-variable-name">name</span>: GOOS
650 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GOOS}"</span>
651 - <span class="org-variable-name">name</span>: GOARCH
652 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GOARCH}"</span>
653 - <span class="org-variable-name">name</span>: GO111MODULE
654 <span class="org-variable-name">value</span>: <span class="org-string">"${inputs.params.GO111MODULE}"</span>
655</pre>
656</div>
657</div>
658</div>
659
660<div id="outline-container-h:d29b2a8c-c139-49ec-9d1c-8c40ffd7983e" class="outline-4">
661<h4 id="h:d29b2a8c-c139-49ec-9d1c-8c40ffd7983e">Pipelines</h4>
662<div class="outline-text-4" id="text-h:d29b2a8c-c139-49ec-9d1c-8c40ffd7983e">
663<div class="org-src-container">
664<pre class="src src-yaml"><span class="org-comment">---</span>
665<span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
666<span class="org-variable-name">kind</span>: Pipeline
667<span class="org-variable-name">metadata</span>:
668 <span class="org-variable-name">name</span>: cli-build-pipeline
669<span class="org-variable-name">spec</span>:
670 <span class="org-variable-name">params</span>:
671 - <span class="org-variable-name">name</span>: package
672 <span class="org-variable-name">description</span>: package to release
673 <span class="org-variable-name">default</span>: github.com/tektoncd/cli
674 <span class="org-variable-name">resources</span>:
675 - <span class="org-variable-name">name</span>: source-repo
676 <span class="org-variable-name">type</span>: git
677 <span class="org-variable-name">tasks</span>:
678 - <span class="org-variable-name">name</span>: lint
679 <span class="org-variable-name">taskRef</span>:
680 <span class="org-variable-name">name</span>: golangci-lint
681 <span class="org-variable-name">params</span>:
682 - <span class="org-variable-name">name</span>: package
683 <span class="org-variable-name">value</span>: ${params.package}
684 - <span class="org-variable-name">name</span>: flags
685 <span class="org-variable-name">value</span>: -v
686 <span class="org-variable-name">resources</span>:
687 <span class="org-variable-name">inputs</span>:
688 - <span class="org-variable-name">name</span>: source
689 <span class="org-variable-name">resource</span>: source-repo
690 - <span class="org-variable-name">name</span>: unit-tests
691 <span class="org-variable-name">runAfter</span>: [lint]
692 <span class="org-variable-name">taskRef</span>:
693 <span class="org-variable-name">name</span>: golang-test
694 <span class="org-variable-name">params</span>:
695 - <span class="org-variable-name">name</span>: package
696 <span class="org-variable-name">value</span>: ${params.package}
697 <span class="org-variable-name">resources</span>:
698 <span class="org-variable-name">inputs</span>:
699 - <span class="org-variable-name">name</span>: source
700 <span class="org-variable-name">resource</span>: source-repo
701 - <span class="org-variable-name">name</span>: build
702 <span class="org-variable-name">runAfter</span>: [lint]
703 <span class="org-variable-name">taskRef</span>:
704 <span class="org-variable-name">name</span>: golang-build
705 <span class="org-variable-name">params</span>:
706 - <span class="org-variable-name">name</span>: package
707 <span class="org-variable-name">value</span>: ${params.package}
708 <span class="org-variable-name">resources</span>:
709 <span class="org-variable-name">inputs</span>:
710 - <span class="org-variable-name">name</span>: source
711 <span class="org-variable-name">resource</span>: source-repo
712</pre>
713</div>
714</div>
715</div>
716
717<div id="outline-container-h:04951c0d-64e7-43b7-aac4-37a383ad18e5" class="outline-4">
718<h4 id="h:04951c0d-64e7-43b7-aac4-37a383ad18e5">Resources</h4>
719<div class="outline-text-4" id="text-h:04951c0d-64e7-43b7-aac4-37a383ad18e5">
720<div class="org-src-container">
721<pre class="src src-yaml"><span class="org-variable-name">apiVersion</span>: tekton.dev/v1alpha1
722<span class="org-variable-name">kind</span>: PipelineResource
723<span class="org-variable-name">metadata</span>:
724 <span class="org-variable-name">name</span>: tektoncd-cli-git
725<span class="org-variable-name">spec</span>:
726 <span class="org-variable-name">type</span>: git
727 <span class="org-variable-name">params</span>:
728 - <span class="org-variable-name">name</span>: revision
729 <span class="org-variable-name">value</span>: master
730 - <span class="org-variable-name">name</span>: url
731 <span class="org-variable-name">value</span>: https://github.com/tektoncd/cli
732</pre>
733</div>
734</div>
735</div>
736</div>
737</section>
738</main>
739<footer id="postamble" class="status">
740<footer>
741 <small><a href="/" rel="history">Index</a> • <a href="/sitemap.html">Sitemap</a> • <a href="https://dl.sbr.pm/">Files</a></small><br/>
742 <small class='questions'>Questions, comments ? Please use my <a href="https://lists.sr.ht/~vdemeester/public-inbox">public inbox</a> by sending a plain-text email to <a href="mailto:~vdemeester/public-inbox@lists.sr.ht">~vdemeester/public-inbox@lists.sr.ht</a>.</small><br/>
743 <small class='copyright'>
744 Content and design by Vincent Demeester
745 (<a rel='licence' href='http://creativecommons.org/licenses/by-nc-sa/3.0/'>Some rights reserved</a>)
746 </small><br />
747</footer>
748</footer>
749</body>
750</html>