This documentation is for a release that is no longer maintained
See documentation for the latest supported version 3 or the latest supported version 4.이 콘텐츠는 선택한 언어로 제공되지 않습니다.
Chapter 4. Creating applications with OpenShift Pipelines
With OpenShift Pipelines, you can create a customized CI/CD solution to build, test, and deploy your application.
To create a full-fledged, self-serving CI/CD Pipeline for an application, you must perform the following tasks:
- Create custom Tasks, or install existing reusable Tasks.
- Create a Pipeline and PipelineResources to define the delivery Pipeline for your application.
- Create a PipelineRun to instantiate and invoke the Pipeline.
- Add Triggers to capture any events in the source repository.
This section uses the pipelines-tutorial
example to demonstrate the preceding tasks. The example uses a simple application which consists of:
-
A front-end interface
vote-ui
, with the source code inui-repo
Git repository. -
A back-end interface
vote-api
, with the source code inapi-repo
Git repository. -
apply_manifest
andupdate-deployment
Tasks inpipelines-tutorial
Git repository.
Prerequisites
- You have access to an OpenShift Container Platform cluster.
- You have installed OpenShift Pipelines using the OpenShift Pipelines Operator listed in the OpenShift OperatorHub. Once installed, it is applicable to the entire cluster.
- You have installed OpenShift Pipelines CLI.
-
You have forked the front-end
ui-repo
and back-endapi-repo
Git repositories using your GitHub ID. - You have Administrator access to your repositories.
4.1. Creating a project and checking your Pipeline ServiceAccount 링크 복사링크가 클립보드에 복사되었습니다!
Procedure
Log in to your OpenShift Container Platform cluster:
oc login -u <login> -p <password> https://openshift.example.com:6443
$ oc login -u <login> -p <password> https://openshift.example.com:6443
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a project for the sample application. For this example workflow, create the
pipelines-tutorial
project:oc new-project pipelines-tutorial
$ oc new-project pipelines-tutorial
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NoteIf you create a project with a different name, be sure to update the resource URLs used in the example with your project name.
View the
pipeline
ServiceAccount:OpenShift Pipelines Operator adds and configures a ServiceAccount named
pipeline
that has sufficient permissions to build and push an image. This ServiceAccount is used by PipelineRun.oc get serviceaccount pipeline
$ oc get serviceaccount pipeline
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.2. About Tasks 링크 복사링크가 클립보드에 복사되었습니다!
Tasks are the building blocks of a Pipeline and consist of sequentially executed Steps. Steps are a series of commands that achieve a specific goal, such as building an image.
Every Task runs as a pod and each Step runs in its own container within the same pod. Because Steps run within the same pod, they have access to the same volumes for caching files, configmaps, and secrets.
A Task uses inputs
parameters, such as a Git resource, and outputs
parameters, such as an image in a registry, to interact with other Tasks. They are reusable and can be used in multiple Pipelines.
Here is an example of a Maven Task with a single Step to build a Maven-based Java application.
This Task starts the pod and runs a container inside that pod using the maven:3.6.0-jdk-8-slim
image to run the specified commands. It receives an input directory called workspace-git
that contains the source code of the application.
The Task only declares the placeholder for the Git repository, it does not specify which Git repository to use. This allows Tasks to be reusable for multiple Pipelines and purposes.
4.3. Creating Pipeline Tasks 링크 복사링크가 클립보드에 복사되었습니다!
Procedure
Install the
apply-manifests
andupdate-deployment
Tasks from thepipelines-tutorial
repository, which contains a list of reusable Tasks for Pipelines:oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/01_pipeline/01_apply_manifest_task.yaml oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/01_pipeline/02_update_deployment_task.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/01_pipeline/01_apply_manifest_task.yaml $ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/01_pipeline/02_update_deployment_task.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Use the
tkn task list
command to list the Tasks you created:tkn task list
$ tkn task list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output verifies that the
apply-manifests
andupdate-deployment
Tasks were created:NAME DESCRIPTION AGE apply-manifests 1 minute ago update-deployment 48 seconds ago
NAME DESCRIPTION AGE apply-manifests 1 minute ago update-deployment 48 seconds ago
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Use the
tkn clustertasks list
command to list the Operator-installed additional ClusterTasks, for example --buildah
ands2i-python-3
:NoteYou must use a privileged Pod container to run the
buildah
ClusterTask because it requires a privileged security context. To learn more about security context constraints (SCC) for pods, see the Additional resources section.tkn clustertasks list
$ tkn clustertasks list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output lists the Operator-installed ClusterTasks:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.4. Defining and creating PipelineResources 링크 복사링크가 클립보드에 복사되었습니다!
PipelineResources are artifacts that are used as inputs or outputs of a Task.
After you create Tasks, create PipelineResources that contain the specifics of the Git repository and the image registry to be used in the Pipeline during execution:
If you are not in the pipelines-tutorial
namespace, and are using another namespace, ensure you update the front-end and back-end image resource to the correct URL with your namespace in the steps below. For example:
image-registry.openshift-image-registry.svc:5000/<namespace-name>/vote-api:latest
image-registry.openshift-image-registry.svc:5000/<namespace-name>/vote-api:latest
Procedure
Create a PipelineResource that defines the Git repository for the front-end application:
tkn resource create
$ tkn resource create ? Enter a name for a pipeline resource : ui-repo ? Select a resource type to create : git ? Enter a value for url : http://github.com/openshift-pipelines/vote-ui.git ? Enter a value for revision : release-tech-preview-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output verifies that the
ui-repo
PipelineResource was created.New git resource "ui-repo" has been created
New git resource "ui-repo" has been created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a PipelineResource that defines the OpenShift Container Platform internal image registry to where you want to push the front-end image:
tkn resource create
$ tkn resource create ? Enter a name for a pipeline resource : ui-image ? Select a resource type to create : image ? Enter a value for url : image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/ui:latest ? Enter a value for digest :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output verifies that the
ui-image
PipelineResource was created.New image resource "ui-image" has been created
New image resource "ui-image" has been created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a PipelineResource that defines the Git repository for the back-end application:
tkn resource create
$ tkn resource create ? Enter a name for a pipeline resource : api-repo ? Select a resource type to create : git ? Enter a value for url : http://github.com/openshift-pipelines/vote-api.git ? Enter a value for revision : release-tech-preview-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output verifies that the
api-repo
PipelineResource was created.New git resource "api-repo" has been created
New git resource "api-repo" has been created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create a PipelineResource that defines the OpenShift Container Platform internal image registry to where you want to push the back-end image:
tkn resource create
$ tkn resource create ? Enter a name for a pipeline resource : api-image ? Select a resource type to create : image ? Enter a value for url : image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/api:latest ? Enter a value for digest :
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output verifies that the
api-image
PipelineResource was created.New image resource "api-image" has been created
New image resource "api-image" has been created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow View the list of
resources
created:tkn resource list
$ tkn resource list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output lists all the PipelineResource that were created.
NAME TYPE DETAILS api-repo git url: http://github.com/openshift-pipelines/vote-api.git ui-repo git url: http://github.com/openshift-pipelines/vote-ui.git api-image image url: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/api:latest ui-image image url: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/ui:latest
NAME TYPE DETAILS api-repo git url: http://github.com/openshift-pipelines/vote-api.git ui-repo git url: http://github.com/openshift-pipelines/vote-ui.git api-image image url: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/api:latest ui-image image url: image-registry.openshift-image-registry.svc:5000/pipelines-tutorial/ui:latest
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.5. Assembling a Pipeline 링크 복사링크가 클립보드에 복사되었습니다!
A Pipeline represents a CI/CD flow and is defined by the Tasks to be executed. It specifies how the Tasks interact with each other and their order of execution using the inputs
, outputs
, and runAfter
parameters. It is designed to be generic and reusable in multiple applications and environments.
In this section, you will create a Pipeline that takes the source code of the application from GitHub and then builds and deploys it on OpenShift Container Platform.
The Pipeline performs the following tasks for the back-end application vote-api
and front-end application vote-ui
:
-
Clones the source code of the application from the Git repositories
api-repo
andui-repo
. -
Builds the container images
api-image
andui-image
using thebuildah
ClusterTask. -
Pushes the
api-image
andui-image
images to the internal image registry. -
Deploys the new images on OpenShift Container Platform using the
apply-manifests
andupdate-deployment
Tasks.
Procedure
Copy the contents of the following sample Pipeline YAML file and save it:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Notice that the Pipeline definition abstracts away the specifics of the Git source repository and image registries to be used during the Pipeline execution.
Create the Pipeline:
oc create -f <pipeline-yaml-file-name.yaml>
$ oc create -f <pipeline-yaml-file-name.yaml>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alternatively, you can also execute the YAML file directly from the Git repository:
oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/01_pipeline/04_pipeline.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/01_pipeline/04_pipeline.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Use the
tkn pipeline list
command to verify that the Pipeline is added to the application:tkn pipeline list
$ tkn pipeline list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output verifies that the
build-and-deploy
Pipeline was created:NAME AGE LAST RUN STARTED DURATION STATUS build-and-deploy 1 minute ago --- --- --- ---
NAME AGE LAST RUN STARTED DURATION STATUS build-and-deploy 1 minute ago --- --- --- ---
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.6. Running a Pipeline 링크 복사링크가 클립보드에 복사되었습니다!
A PipelineRun starts a Pipeline and ties it to the Git and image resources that should be used for the specific invocation. It automatically creates and starts the TaskRuns for each Task in the Pipeline.
Procedure
Start the Pipeline for the back-end application:
tkn pipeline start build-and-deploy -r git-repo=api-repo -r image=api-image -p deployment-name=vote-api
$ tkn pipeline start build-and-deploy -r git-repo=api-repo -r image=api-image -p deployment-name=vote-api
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note the PipelineRun ID returned in the command output.
Track the PipelineRun progress:
tkn pipelinerun logs <pipelinerun ID> -f
$ tkn pipelinerun logs <pipelinerun ID> -f
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Start the Pipeline for the front-end application:
tkn pipeline start build-and-deploy -r git-repo=ui-repo -r image=ui-image -p deployment-name=vote-ui
$ tkn pipeline start build-and-deploy -r git-repo=ui-repo -r image=ui-image -p deployment-name=vote-ui
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note the PipelineRun ID returned in the command output.
Track the PipelineRun progress:
tkn pipelinerun logs <pipelinerun ID> -f
$ tkn pipelinerun logs <pipelinerun ID> -f
Copy to Clipboard Copied! Toggle word wrap Toggle overflow After a few minutes, use
tkn pipelinerun list
command to verify that the Pipeline ran successfully by listing all the PipelineRuns:tkn pipelinerun list
$ tkn pipelinerun list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow The output lists the PipelineRuns:
NAME STARTED DURATION STATUS build-and-deploy-run-xy7rw 1 hour ago 2 minutes Succeeded build-and-deploy-run-z2rz8 1 hour ago 19 minutes Succeeded
NAME STARTED DURATION STATUS build-and-deploy-run-xy7rw 1 hour ago 2 minutes Succeeded build-and-deploy-run-z2rz8 1 hour ago 19 minutes Succeeded
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Get the application route:
oc get route vote-ui --template='http://{{.spec.host}}'
$ oc get route vote-ui --template='http://{{.spec.host}}'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note the output of the previous command. You can access the application using this route.
To rerun the last PipelineRun, using the PipelineResources and ServiceAccount of the previous Pipeline, run:
tkn pipeline start build-and-deploy --last
$ tkn pipeline start build-and-deploy --last
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7. About Triggers 링크 복사링크가 클립보드에 복사되었습니다!
Use Triggers in conjunction with Pipelines to create a full-fledged CI/CD system where the Kubernetes resources define the entire CI/CD execution. Pipeline Triggers capture the external events and process them to extract key pieces of information. Mapping this event data to a set of predefined parameters triggers a series of tasks that can then create and deploy Kubernetes resources.
For example, you define a CI/CD workflow using OpenShift Pipelines for your application. The PipelineRun must start for any new changes to take effect in the application repository. Triggers automate this process by capturing and processing any change events, and by triggering a PipelineRun that deploys the new image with the latest changes.
Triggers consist of the following main components that work together to form a reusable, decoupled, and self-sustaining CI/CD system:
- EventListeners provide endpoints, or an event sink, that listen for incoming HTTP-based events with a JSON payload. The EventListener performs lightweight event processing on the payload using Event Interceptors, which identify the type of payload and optionally modify it. Currently, Pipeline Triggers support four types of Interceptors: Webhook Interceptors, GitHub Interceptors, GitLab Interceptors, and Common Expression Language (CEL) Interceptors.
- TriggerBindings extract the fields from an event payload and store them as parameters.
- TriggerTemplates specify how to use the parameterized data from the TriggerBindings. A TriggerTemplate defines a resource template that receives input from the TriggerBindings, while then performing a series of actions that result in creation of new PipelineResources and initiation of a new PipelineRun.
EventListeners tie the concepts of TriggerBindings and TriggerTemplates together. The EventListener listens for the incoming event, handles basic filtering using Interceptors, extracts data using TriggerBindings, and then processes this data to create Kubernetes resources using TriggerTemplates.
4.8. Adding Triggers to a Pipeline 링크 복사링크가 클립보드에 복사되었습니다!
After you have assembled and started the Pipeline for the application, add TriggerBindings, TriggerTemplates, and an EventListener to capture GitHub events.
Procedure
Copy the content of the following sample
TriggerBinding
YAML file and save it:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
TriggerBinding
:oc create -f <triggerbinding-yaml-file-name.yaml>
$ oc create -f <triggerbinding-yaml-file-name.yaml>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alternatively, you can create the
TriggerBinding
directly from thepipelines-tutorial
Git repository:oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/03_triggers/01_binding.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/03_triggers/01_binding.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the content of the following sample
TriggerTemplate
YAML file and save it:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
TriggerTemplate
:oc create -f <triggertemplate-yaml-file-name.yaml>
$ oc create -f <triggertemplate-yaml-file-name.yaml>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alternatively, you can create the
TriggerTemplate
directly from thepipelines-tutorial
Git repository:oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/03_triggers/02_template.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/03_triggers/02_template.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy the contents of the following sample
EventListener
YAML file and save it:Copy to Clipboard Copied! Toggle word wrap Toggle overflow Create the
EventListener
:oc create -f <eventlistener-yaml-file-name.yaml>
$ oc create -f <eventlistener-yaml-file-name.yaml>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alternatively, you can create the
EvenListener
directly from thepipelines-tutorial
Git repository:oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/03_triggers/03_event_listener.yaml
$ oc create -f https://raw.githubusercontent.com/openshift/pipelines-tutorial/release-tech-preview-1/03_triggers/03_event_listener.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Expose the EventListener service as an OpenShift Container Platform route to make it publicly accessible:
oc expose svc el-vote-app
$ oc expose svc el-vote-app
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.9. Creating Webhooks 링크 복사링크가 클립보드에 복사되었습니다!
Webhooks are HTTP POST messages that are received by the EventListeners whenever a configured event occurs in your repository. The event payload is then mapped to TriggerBindings, and processed by TriggerTemplates. The TriggerTemplates eventually start one or more PipelineRuns, leading to the creation and deployment of Kubernetes resources.
In this section, you will configure a Webhook URL on your forked Git repositories vote-ui
and vote-api
. This URL points to the publicly accessible EventListener service route.
Adding Webhooks requires administrative privileges to the repository. If you do not have administrative access to your repository, contact your system administrator for adding Webhooks.
Procedure
Get the Webhook URL:
echo "URL: $(oc get route el-vote-app --template='http://{{.spec.host}}')"
$ echo "URL: $(oc get route el-vote-app --template='http://{{.spec.host}}')"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Note the URL obtained in the output.
Configure Webhooks manually on the front-end repository:
-
Open the front-end Git repository
vote-ui
in your browser. -
Click Settings
Webhooks Add Webhook On the Webhooks/Add Webhook page:
- Enter the Webhook URL from step 1 in Payload URL field
- Select application/json for the Content type
- Specify the secret in the Secret field
- Ensure that the Just the push event is selected
- Select Active
- Click Add Webhook
-
Open the front-end Git repository
-
Repeat step 2 for the back-end repository
vote-api
.
4.10. Triggering a PipelineRun 링크 복사링크가 클립보드에 복사되었습니다!
Whenever a push
event occurs in the Git repository, the configured Webhook sends an event payload to the publicly exposed EventListener service route. The EventListener service of the application processes the payload, and passes it to the relevant TriggerBindings and TriggerTemplates pair. The TriggerBinding extracts the parameters and the TriggerTemplate uses these parameters to create resources. This may rebuild and redeploy the application.
In this section, you will push an empty commit to the front-end vote-api
repository, which will trigger the PipelineRun.
Procedure
From the terminal, clone your forked Git repository
vote-api
:git clone git@github.com:<your GitHub ID>/vote-api.git -b release-tech-preview-1
$ git clone git@github.com:<your GitHub ID>/vote-api.git -b release-tech-preview-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Push an empty commit:
git commit -m "empty-commit" --allow-empty && git push origin release-tech-preview-1
$ git commit -m "empty-commit" --allow-empty && git push origin release-tech-preview-1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Check if the PipelineRun was triggered:
tkn pipelinerun list
$ tkn pipelinerun list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Notice that a new PipelineRun was initiated.
Additional resources
- For more details on pipelines in the Developer perspective, see the working with Pipelines in the Developer perspective section.
- To learn more about Security Context Constraints (SCCs), see Managing Security Context Constraints section.
- For more examples of reusable Tasks, see the OpenShift Catalog repository. Additionally, you can also see the Tekton Catalog in the Tekton project.