将 Harbor 集成到流水线

本文档演示如何将 Harbor 集成到 KubeSphere 流水线。

前提条件

  • KubeSphere 平台需要安装并启用 DevOps 扩展组件。

  • 已有一个企业空间、一个 DevOps 项目和一个用户 (例如 project-regular),并已邀请该用户至 DevOps 项目且授予 operator 角色。

安装 Harbor

执行以下命令,使用 Helm 3 安装 Harbor。

helm repo add harbor https://helm.goharbor.io
# 如需快速安装,您可以通过 NodePort 暴露 Harbor 并禁用 tls。
# 请将 externalURL 设置为您的一个节点 IP,并确保 Jenkins 能够访问它。
helm install harbor-release harbor/harbor --set expose.type=nodePort,externalURL=http://$ip:30002,expose.tls.enabled=false

获取 Harbor 凭证

  1. 安装 Harbor 后,访问 <NodeIP>:30002 并使用默认账户和密码 (admin/Harbor12345) 登录 Web 控制台。

  2. 在左侧导航栏中点击项目,然后点击新建项目

  3. 在弹出的对话框中,设置项目名称 ks-devops-harbor 并点击确定

  4. 点击刚刚创建的项目,在机器人账户页签下点击添加机器人账户

  5. 在弹出的对话框中,为机器人账户设置名称 robot-test过期时间。然后在权限中勾选制品(Artifact)和仓库的所有权限。点击完成

  6. 在弹出的对话框中,点击导出到文件中,保存该 Harbor 令牌。

启用 Insecure Registry

配置 Docker,使其忽略您 Harbor 仓库的安全性。

  1. 在所有集群节点上运行 vim /etc/docker/daemon.json 命令以编辑 daemon.json 文件,添加以下内容并保存更改。

      "insecure-registries" : ["103.61.38.55:30002"]
    说明
    • 请将 103.61.38.55:30002 替换为您自己的 Harbor 仓库地址。

    • 对于 Linux,daemon.json 文件的路径为 /etc/docker/daemon.json;对于 Windows,该文件的路径为 C:\ProgramData\docker\config\daemon.json

    文件内容应如下所示:

    {
      "log-opts": {
        "max-size": "5m",
        "max-file": "3"
      },
      // 注意添加逗号
      "exec-opts": ["native.cgroupdriver=systemd"],
      "insecure-registries": ["103.61.38.55:30002"]
    }
  2. 运行以下命令重启 Docker,使更改生效。

    sudo systemctl daemon-reload
    sudo systemctl restart docker
    说明

    建议您在隔离的测试环境或者严格控制的离线环境中使用该方案。有关更多信息,请参阅 Deploy a plain HTTP registry

    完成上述操作后,即可在项目中部署工作负载时使用您 Harbor 仓库中的镜像。您需要为自己的 Harbor 仓库创建一个镜像密钥,然后在部署工作负载添加容器时,点击 Docker Hub,选择您的 Harbor 仓库并输入镜像的绝对路径以搜索您的镜像。

创建凭证

  1. project-regular 用户登录 KubeSphere Web 控制台。

  2. 点击企业空间管理并进入您的 DevOps 项目。

  3. DevOps 项目设置下的凭证页面为 Harbor 创建凭证。

  4. 创建凭证页面,设置名称 (robot-test),类型选择用户名和密码,在用户名中输入刚刚导出的 Harbor 令牌文件中 name 的值,并在密码/令牌中输入 Harbor 令牌文件中 secret 的值。

  5. 点击确定以保存。

创建流水线

  1. 转到流水线页面,点击创建

  2. 基本信息页签,输入名称 demo-pipeline,然后点击下一步

  3. 高级设置中使用默认值,点击创建

编辑 Jenkinsfile

  1. 点击该流水线进入其详情页面,然后点击编辑 Jenkinsfile

  2. 将以下内容复制粘贴至 Jenkinsfile。注意,必须将 REGISTRYHARBOR_NAMESPACEAPP_NAMEHARBOR_CREDENTIAL 替换为您自己的值。

    pipeline {
      agent {
        node {
          label 'maven'
        }
      }
    
      environment {
        // 您 Harbor 仓库的地址。
        REGISTRY = '103.61.38.55:30002'
        // 项目名称。
        // 请确保您的机器人账户具有足够的项目访问权限。
        HARBOR_NAMESPACE = 'ks-devops-harbor'
        // Docker 镜像名称。
        APP_NAME = 'docker-example'
        // ‘robot-test’ 是您在 KubeSphere Web 控制台上创建的凭证 ID。
        HARBOR_CREDENTIAL = credentials('robot-test')
      }
    
      stages {
        stage('docker login') {
          steps{
            container ('maven') {
              // 请将 -u 后面的参数替换为 Harbor 令牌文件中 name 的值,不要忘记加上 ''
              sh '''echo $HARBOR_CREDENTIAL_PSW|docker login $REGISTRY -u 'robot$robot-test' --password-stdin'''
            }
          }
        }
    
         stage('build & push') {
           steps {
             container ('maven') {
               sh 'git clone https://github.com/kstaken/dockerfile-examples.git'
               sh 'cd dockerfile-examples/rethinkdb && docker build -t $REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:devops-test .'
               sh 'docker push$REGISTRY/$HARBOR_NAMESPACE/$APP_NAME:devops-test'
             }
           }
         }
      }
    }
    说明

    您可以通过带有环境变量的 Jenkins 凭证来传送参数至 docker login -u。但是,每个 Harbor 机器人账户的用户名都包含一个 $ 字符,当用于环境变量时,Jenkins 会将其转换为 $$(Harbor v2.2 以后可以自定义机器人后缀,避免此类问题)。了解更多

运行流水线

保存 Jenkinsfile 后,KubeSphere 会自动在图形编辑面板上创建所有阶段和步骤。点击运行来运行该流水线。如果一切运行正常,Jenkins 将推送镜像至您的 Harbor 仓库。

通过邮件接收 KubeSphere 最新的技术博客与产品更新的通知


感谢您的反馈。如果您有关于如何使用 KubeSphere 的具体问题,请在 Slack 上提问。如果您想报告问题或提出改进建议,请在 GitHub 存储库中打开问题。