×

Jenkins 和 OpenShift Pipelines 概念的比较

您可以查看和比较 Jenkins 和 OpenShift Pipelines 中使用的以下等效术语。

Jenkins 术语

Jenkins 提供声明式和脚本化流水线,这些流水线可以使用共享库和插件进行扩展。Jenkins 中的一些基本术语如下所示

  • 流水线:使用 Groovy 语法自动化构建、测试和部署应用程序的整个过程。

  • 节点:能够协调或执行脚本化流水线的机器。

  • 阶段:在流水线中执行的概念上不同的任务子集。插件或用户界面通常使用此块来显示任务的状态或进度。

  • 步骤:指定要采取的确切操作的单个任务,可以使用命令或脚本。

OpenShift Pipelines 术语

OpenShift Pipelines 使用 YAML 语法用于声明式流水线,并由任务组成。OpenShift Pipelines 中的一些基本术语如下所示

  • 流水线:一系列、并行或两者兼有的任务集。

  • 任务:一系列步骤,例如命令、二进制文件或脚本。

  • PipelineRun:具有一个或多个任务的流水线的执行。

  • TaskRun:具有一个或多个步骤的任务的执行。

    您可以使用一组输入(例如参数和工作区)启动 PipelineRun 或 TaskRun,执行结果是一组输出和工件。

  • 工作区:在 OpenShift Pipelines 中,工作区是具有以下用途的概念块

    • 存储输入、输出和构建工件。

    • 共享任务之间数据的公共空间。

    • 挂载点,用于存储在密钥中的凭据、存储在配置映射中的配置以及组织共享的常用工具。

    在 Jenkins 中,没有 OpenShift Pipelines 工作区的直接等效项。您可以将控制节点视为工作区,因为它存储克隆的代码存储库、构建历史记录和工件。当作业分配给不同的节点时,克隆的代码和生成的工件存储在该节点中,但控制节点维护构建历史记录。

概念映射

Jenkins 和 OpenShift Pipelines 的构建块并不等效,具体的比较不会提供技术上准确的映射。Jenkins 和 OpenShift Pipelines 中的以下术语和概念通常相关

表 1. Jenkins 和 OpenShift Pipelines - 基本比较
Jenkins OpenShift Pipelines

流水线

流水线和 PipelineRun

阶段

任务

步骤

任务中的步骤

将示例流水线从 Jenkins 迁移到 OpenShift Pipelines

您可以使用以下等效示例来帮助将构建、测试和部署流水线从 Jenkins 迁移到 OpenShift Pipelines。

Jenkins 流水线

考虑使用 Groovy 编写的 Jenkins 流水线,用于构建、测试和部署

pipeline {
   agent any
   stages {
       stage('Build') {
           steps {
               sh 'make'
           }
       }
       stage('Test'){
           steps {
               sh 'make check'
               junit 'reports/**/*.xml'
           }
       }
       stage('Deploy') {
           steps {
               sh 'make publish'
           }
       }
   }
}

OpenShift Pipelines 流水线

要创建与前面的 Jenkins 流水线等效的 OpenShift Pipelines 流水线,您可以创建以下三个任务

示例build 任务 YAML 定义文件
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: myproject-build
spec:
  workspaces:
  - name: source
  steps:
  - image: my-ci-image
    command: ["make"]
    workingDir: $(workspaces.source.path)
示例test 任务 YAML 定义文件
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: myproject-test
spec:
  workspaces:
  - name: source
  steps:
  - image: my-ci-image
    command: ["make check"]
    workingDir: $(workspaces.source.path)
  - image: junit-report-image
    script: |
      #!/usr/bin/env bash
      junit-report reports/**/*.xml
    workingDir: $(workspaces.source.path)
示例deploy 任务 YAML 定义文件
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: myprojectd-deploy
spec:
  workspaces:
  - name: source
  steps:
  - image: my-deploy-image
    command: ["make deploy"]
    workingDir: $(workspaces.source.path)

您可以按顺序组合这三个任务以在 OpenShift Pipelines 中形成一个流水线

示例:用于构建、测试和部署的 OpenShift Pipelines 流水线
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: myproject-pipeline
spec:
  workspaces:
  - name: shared-dir
  tasks:
  - name: build
    taskRef:
      name: myproject-build
    workspaces:
    - name: source
      workspace: shared-dir
  - name: test
    taskRef:
      name: myproject-test
    workspaces:
    - name: source
      workspace: shared-dir
  - name: deploy
    taskRef:
      name: myproject-deploy
    workspaces:
    - name: source
      workspace: shared-dir

从 Jenkins 插件迁移到 Tekton Hub 任务

您可以使用 插件 来扩展 Jenkins 的功能。为了在 OpenShift Pipelines 中实现类似的可扩展性,请使用 Tekton Hub 中提供的任何任务。

例如,考虑 Tekton Hub 中的 git-clone 任务,它对应于 Jenkins 的 git 插件

示例:来自 Tekton Hub 的git-clone 任务
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
 name: demo-pipeline
spec:
 params:
   - name: repo_url
   - name: revision
 workspaces:
   - name: source
 tasks:
   - name: fetch-from-git
     taskRef:
       name: git-clone
     params:
       - name: url
         value: $(params.repo_url)
       - name: revision
         value: $(params.revision)
     workspaces:
     - name: output
       workspace: source

使用自定义任务和脚本扩展 OpenShift Pipelines 功能

在 OpenShift Pipelines 中,如果您在 Tekton Hub 中找不到合适的任务,或者需要对任务进行更精细的控制,您可以创建自定义任务和脚本以扩展 OpenShift Pipelines 的功能。

示例:运行maven test命令的自定义任务
apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: maven-test
spec:
  workspaces:
  - name: source
  steps:
  - image: my-maven-image
    command: ["mvn test"]
    workingDir: $(workspaces.source.path)
示例:通过提供自定义 shell 脚本的路径来运行它
...
steps:
  image: ubuntu
  script: |
      #!/usr/bin/env bash
      /workspace/my-script.sh
...
示例:通过在 YAML 文件中编写自定义 Python 脚本来运行它
...
steps:
  image: python
  script: |
      #!/usr/bin/env python3
      print(“hello from python!”)
...

Jenkins 和 OpenShift Pipelines 执行模型的比较

Jenkins 和 OpenShift Pipelines 提供类似的功能,但在架构和执行方面有所不同。

表 2. Jenkins 和 OpenShift Pipelines 执行模型的比较
Jenkins OpenShift Pipelines

Jenkins 具有一个控制器节点。Jenkins 集中运行管道和步骤,或协调在其他节点上运行的作业。

OpenShift Pipelines 是无服务器和分布式的,执行没有中央依赖关系。

容器由 Jenkins 控制器节点通过管道启动。

OpenShift Pipelines 采用“容器优先”的方法,其中每个步骤都在 Pod 中作为容器运行(相当于 Jenkins 中的节点)。

可扩展性是通过使用插件实现的。

可扩展性是通过使用 Tekton Hub 中的任务或创建自定义任务和脚本实现的。

常见用例示例

Jenkins 和 OpenShift Pipelines 都为常见的 CI/CD 用例提供了功能,例如:

  • 使用 Apache Maven 编译、构建和部署镜像

  • 通过使用插件扩展核心功能

  • 重用可共享的库和自定义脚本

在 Jenkins 和 OpenShift Pipelines 中运行 Maven 管道

您可以在 Jenkins 和 OpenShift Pipelines 工作流程中使用 Maven 来编译、构建和部署镜像。要将您现有的 Jenkins 工作流程映射到 OpenShift Pipelines,请考虑以下示例:

示例:使用 Jenkins 中的 Maven 编译和构建镜像并将其部署到 OpenShift
#!/usr/bin/groovy
node('maven') {
    stage 'Checkout'
    checkout scm

    stage 'Build'
    sh 'cd helloworld && mvn clean'
    sh 'cd helloworld && mvn compile'

    stage 'Run Unit Tests'
    sh 'cd helloworld && mvn test'

    stage 'Package'
    sh 'cd helloworld && mvn package'

    stage 'Archive artifact'
    sh 'mkdir -p artifacts/deployments && cp helloworld/target/*.war artifacts/deployments'
    archive 'helloworld/target/*.war'

    stage 'Create Image'
    sh 'oc login https://kubernetes.default -u admin -p admin --insecure-skip-tls-verify=true'
    sh 'oc new-project helloworldproject'
    sh 'oc project helloworldproject'
    sh 'oc process -f helloworld/jboss-eap70-binary-build.json | oc create -f -'
    sh 'oc start-build eap-helloworld-app --from-dir=artifacts/'

    stage 'Deploy'
    sh 'oc new-app helloworld/jboss-eap70-deploy.json' }
示例:使用 OpenShift Pipelines 中的 Maven 编译和构建镜像并将其部署到 OpenShift。
apiVersion: tekton.dev/v1beta1
kind: Pipeline
metadata:
  name: maven-pipeline
spec:
  workspaces:
    - name: shared-workspace
    - name: maven-settings
    - name: kubeconfig-dir
      optional: true
  params:
    - name: repo-url
    - name: revision
    - name: context-path
  tasks:
    - name: fetch-repo
      taskRef:
        name: git-clone
      workspaces:
        - name: output
          workspace: shared-workspace
      params:
        - name: url
          value: "$(params.repo-url)"
        - name: subdirectory
          value: ""
        - name: deleteExisting
          value: "true"
        - name: revision
          value: $(params.revision)
    - name: mvn-build
      taskRef:
        name: maven
      runAfter:
        - fetch-repo
      workspaces:
        - name: source
          workspace: shared-workspace
        - name: maven-settings
          workspace: maven-settings
      params:
        - name: CONTEXT_DIR
          value: "$(params.context-path)"
        - name: GOALS
          value: ["-DskipTests", "clean", "compile"]
    - name: mvn-tests
      taskRef:
        name: maven
      runAfter:
        - mvn-build
      workspaces:
        - name: source
          workspace: shared-workspace
        - name: maven-settings
          workspace: maven-settings
      params:
        - name: CONTEXT_DIR
          value: "$(params.context-path)"
        - name: GOALS
          value: ["test"]
    - name: mvn-package
      taskRef:
        name: maven
      runAfter:
        - mvn-tests
      workspaces:
        - name: source
          workspace: shared-workspace
        - name: maven-settings
          workspace: maven-settings
      params:
        - name: CONTEXT_DIR
          value: "$(params.context-path)"
        - name: GOALS
          value: ["package"]
    - name: create-image-and-deploy
      taskRef:
        name: openshift-client
      runAfter:
        - mvn-package
      workspaces:
        - name: manifest-dir
          workspace: shared-workspace
        - name: kubeconfig-dir
          workspace: kubeconfig-dir
      params:
        - name: SCRIPT
          value: |
            cd "$(params.context-path)"
            mkdir -p ./artifacts/deployments && cp ./target/*.war ./artifacts/deployments
            oc new-project helloworldproject
            oc project helloworldproject
            oc process -f jboss-eap70-binary-build.json | oc create -f -
            oc start-build eap-helloworld-app --from-dir=artifacts/
            oc new-app jboss-eap70-deploy.json

通过使用插件扩展 Jenkins 和 OpenShift Pipelines 的核心功能

Jenkins 拥有庞大的插件生态系统,这些插件多年来由其广泛的用户群开发。您可以在Jenkins 插件索引中搜索和浏览插件。

OpenShift Pipelines 也拥有许多由社区和企业用户开发和贡献的任务。可在Tekton Hub中找到可重用的 OpenShift Pipelines 任务的公共目录。

此外,OpenShift Pipelines 将 Jenkins 生态系统中的许多插件集成到其核心功能中。例如,授权是 Jenkins 和 OpenShift Pipelines 中的关键功能。Jenkins 使用基于角色的授权策略插件来确保授权,而 OpenShift Pipelines 使用 OpenShift 的内置基于角色的访问控制系统。

在 Jenkins 和 OpenShift Pipelines 中共享可重用代码

Jenkins 的共享库为 Jenkins 管道的一部分提供了可重用的代码。这些库在Jenkinsfile之间共享,从而创建高度模块化的管道,避免代码重复。

虽然 OpenShift Pipelines 中没有 Jenkins 共享库的直接等效项,但您可以通过结合使用来自Tekton Hub的任务以及自定义任务和脚本,来实现类似的工作流程。