使用OpenShift Pipeline入门:从Pipeline开始使用模板

本次我们将执行以下Pipeline的教程。
这些是在OpenShift文档中列出的。
5.4. Pipeline构建 4.2 | 红帽客户门户

介绍如何使用nodejs-mongodb.json模板构建、部署和验证OpenShift流水线来创建Node.js/MongoDB应用程序的方法。

创建 Jenkins Pipeline 的示例。创建一个Pipeline的yaml文件(nodejs-sample-pipeline.yaml),并创建BuildConfig。(假设已经配置好Jenkins Master)

>oc create -f nodejs-sample-pipeline.yaml
buildconfig.build.openshift.io/nodejs-sample-pipeline created

nodejs-sample-pipeline.yaml文件的内容如下所示。尽管Jenkinsfile部分很长,但将其保持原样。


kind: "BuildConfig"
apiVersion: "v1"
metadata:
  name: "nodejs-sample-pipeline"
spec:
  strategy:
    jenkinsPipelineStrategy:
      jenkinsfile: |-
        def templatePath = 'https://raw.githubusercontent.com/openshift/nodejs-ex/master/openshift/templates/nodejs-mongodb.json' 
        def templateName = 'nodejs-mongodb-example' 
        pipeline {
          agent {
            node {
              label 'nodejs' 
            }
          }
          options {
            timeout(time: 20, unit: 'MINUTES') 
          }
          stages {
            stage('preamble') {
                steps {
                    script {
                        openshift.withCluster() {
                            openshift.withProject() {
                                echo "Using project: ${openshift.project()}"
                            }
                        }
                    }
                }
            }
            stage('cleanup') {
              steps {
                script {
                    openshift.withCluster() {
                        openshift.withProject() {
                          openshift.selector("all", [ template : templateName ]).delete() 
                          if (openshift.selector("secrets", templateName).exists()) { 
                            openshift.selector("secrets", templateName).delete()
                          }
                        }
                    }
                }
              }
            }
            stage('create') {
              steps {
                script {
                    openshift.withCluster() {
                        openshift.withProject() {
                          openshift.newApp(templatePath) 
                        }
                    }
                }
              }
            }
            stage('build') {
              steps {
                script {
                    openshift.withCluster() {
                        openshift.withProject() {
                          def builds = openshift.selector("bc", templateName).related('builds')
                          timeout(5) { 
                            builds.untilEach(1) {
                              return (it.object().status.phase == "Complete")
                            }
                          }
                        }
                    }
                }
              }
            }
            stage('deploy') {
              steps {
                script {
                    openshift.withCluster() {
                        openshift.withProject() {
                          def rm = openshift.selector("dc", templateName).rollout()
                          timeout(5) { 
                            openshift.selector("dc", templateName).related('pods').untilEach(1) {
                              return (it.object().status.phase == "Running")
                            }
                          }
                        }
                    }
                }
              }
            }
            stage('tag') {
              steps {
                script {
                    openshift.withCluster() {
                        openshift.withProject() {
                          openshift.tag("${templateName}:latest", "${templateName}-staging:latest") 
                        }
                    }
                }
              }
            }
          }
        }
    type: JenkinsPipeline

重点是通过指定以下阶段和模板来创建新的应用程序。所需资源的构建和部署将通过此模板进行。

   stage('create') {
      steps {
        script {
            openshift.withCluster() {
                openshift.withProject() {
                  openshift.newApp(templatePath) 
                }
            }
        }
      }
    }

执行示例管道
执行已创建的BuildConfig。

>oc start-build nodejs-sample-pipeline
build.build.openshift.io/nodejs-sample-pipeline-1 started
image.png


image.png

image.png

image.png

image.png

image.png

image.png看起来不存在指定的 ImageStreamTag。
使用 oc get imagestreamtag 进行查找,

>oc get imagestreamtag -n openshift |findstr nodejs
jenkins-agent-nodejs:latest                  image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-nodejs@sha256:8fa18b9fd93cac72f3d9f356fe3633c42e080940ebe53eb14a00551d7db10148                  8 weeks ago
jenkins-agent-nodejs:v4.0                    image-registry.openshift-image-registry.svc:5000/openshift/jenkins-agent-nodejs@sha256:8fa18b9fd93cac72f3d9f356fe3633c42e080940ebe53eb14a00551d7db10148                  8 weeks ago
nodejs:10                                    image-registry.openshift-image-registry.svc:5000/openshift/nodejs@sha256:74a3ef2964efc03dfc239da3f09691b720ce54ff4bb47588864adb222133f0fc                                8 months ago
nodejs:8                                     image-registry.openshift-image-registry.svc:5000/openshift/nodejs@sha256:bf4030ac45b8b3ff0ea2892261f1fb5df5b077a67ef717836ac0de879cc775d9                                5 months ago
nodejs:8-RHOAR                               image-registry.openshift-image-registry.svc:5000/openshift/nodejs@sha256:7f4b9099ea7e1ba5b2be98304c2d0c2eb1d738d8ceee9d9a1464e71a08d78dd4                                6 months ago
nodejs:latest                                image-registry.openshift-image-registry.svc:5000/openshift/nodejs@sha256:74a3ef2964efc03dfc239da3f09691b720ce54ff4bb47588864adb222133f0fc                                8 months ago

所以,确实不存在所指定的nodejs:12标签。


让我们将“tag”的部分更改为“latest”(在现有的ImageStreamTag中存在)。

image.png

image.png

image.png原来的流程仍然失败,但是Node.js和MongoDB的示例Pod已经部署了。

>oc get all
NAME                                  READY   STATUS      RESTARTS   AGE
pod/mongodb-1-8r2jx                   1/1     Running     0          67m
pod/mongodb-1-deploy                  0/1     Completed   0          67m
pod/nodejs-mongodb-example-1-build    0/1     Completed   0          4m50s
pod/nodejs-mongodb-example-1-deploy   0/1     Completed   0          3m42s
pod/nodejs-mongodb-example-1-mb9zx    1/1     Running     0          3m39s
・・・・

对Pipeline进行修正和重新执行。
在这种情况下,要成功运行示例Pipeline,应该怎么做呢?
(即使直接重新执行,由于手动修改过的BuildConfig将再次从模板重新创建,所以会再次失败)

我会检查使用的模板的内容(在Jenkinsfile的开头处定义),链接为https://raw.githubusercontent.com/openshift/nodejs-ex/master/openshift/templates/nodejs-mongodb.json。

以下是摘要

    {
      "kind": "BuildConfig",
      "apiVersion": "v1",
      "metadata": {
        "name": "${NAME}",
        "annotations": {
          "description": "Defines how to build the application",
          "template.alpha.openshift.io/wait-for-ready": "true"
        }
      },
      "spec": {
        "source": {
          "type": "Git",
          "git": {
            "uri": "${SOURCE_REPOSITORY_URL}",
            "ref": "${SOURCE_REPOSITORY_REF}"
          },
          "contextDir": "${CONTEXT_DIR}"
        },
        "strategy": {
          "type": "Source",
          "sourceStrategy": {
            "from": {
              "kind": "ImageStreamTag",
              "namespace": "${NAMESPACE}",
              "name": "nodejs:${NODEJS_VERSION}"
            },
            "env": [
              {
                "name": "NPM_MIRROR",
                "value": "${NPM_MIRROR}"
              }
            ]
          }
        },
・・・
  "parameters": [
    {
      "name": "NAME",
      "displayName": "Name",
      "description": "The name assigned to all of the frontend objects defined in this template.",
      "required": true,
      "value": "nodejs-mongodb-example"
    },
    {
      "name": "NAMESPACE",
      "displayName": "Namespace",
      "description": "The OpenShift Namespace where the ImageStream resides.",
      "required": true,
      "value": "openshift"
    },
    {
      "name": "NODEJS_VERSION",
      "displayName": "Version of NodeJS Image",
      "description": "Version of NodeJS image to be used (10, 12, or latest).",
      "value": "12",
      "required": true
    },
    {
      "name": "MONGODB_VERSION",
      "displayName": "Version of MongoDB Image",
      "description": "Version of MongoDB image to be used (3.6 or latest).",
      "value": "3.6",
      "required": true
    },
・・・

根据这个,看起来在相关的BuildConfig中,用于使用nodejs ImageStreamTag的变量是NODEJS_VERSION参数化的。
因此,在使用模板时,可以通过指定这个参数存在的版本的ImageStreamTag来实现。

在原有的Pipelie用BuildConfig中,我们将修正Jenkinsfile部分的create阶段(刚刚摘录的部分)如下所示。
–param以下的指定是oc new-app命令的选项,在执行模板时可以使用这种方式传递参数。
这一点与Helm的模板非常相似。

    stage('create') {
      steps {
        script {
            openshift.withCluster() {
                openshift.withProject() {
                  openshift.newApp(templatePath, "--param=NODEJS_VERSION=latest") 
                }
            }
        }
      }
    }
image.png

image.png通过标签阶段的处理,也对ImageStream进行了标记。

>oc get imagestream
NAME                             IMAGE REPOSITORY                                                                                   TAGS     UPDATED
nodejs-mongodb-example           default-route-openshift-image-registry.apps-crc.testing/nkproject/nodejs-mongodb-example           latest   38 minutes ago
nodejs-mongodb-example-staging   default-route-openshift-image-registry.apps-crc.testing/nkproject/nodejs-mongodb-example-staging   latest   38 minutes ago

>oc get imagestreamtag
NAME                                    IMAGE REF                                                                                                                                                           UPDATED
nodejs-mongodb-example:latest           image-registry.openshift-image-registry.svc:5000/nkproject/nodejs-mongodb-example@sha256:be25fa2653adde1b9ee70ac82cd8bba9f717ad128635640a4db659c07d44b402           38 minutes ago
nodejs-mongodb-example-staging:latest   image-registry.openshift-image-registry.svc:5000/nkproject/nodejs-mongodb-example-staging@sha256:be25fa2653adde1b9ee70ac82cd8bba9f717ad128635640a4db659c07d44b402   38 minutes ago

image.png

最后我們這次確認了從Jenkins Pipeline使用模板。如果將常見的資源配置模式定義為模板,Pipeline的設置會變得簡單,並且擴展也會更容易。

bannerAds