将 Harbor 集成到流水线
本教程演示如何将 Harbor 集成到 KubeSphere 流水线。
准备工作
- 您需要启用 KubeSphere DevOps 系统。
- 您需要创建一个企业空间、一个 DevOps 项目和一个用户 (
project-regular
)。需要邀请该用户至 DevOps 项目并赋予operator
角色。如果尚未创建,请参见创建企业空间、项目、用户和角色。
安装 Harbor
强烈建议您通过 KubeSphere 应用商店安装 Harbor。或者,您可以使用 Helm3 手动安装 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 凭证
安装 Harbor 后,请访问
<NodeIP>:30002
并使用默认帐户和密码 (admin/Harbor12345
) 登录控制台。在左侧导航栏中点击项目并在项目页面点击新建项目。在弹出的对话框中,设置项目名称 (
ks-devops-harbor
) 并点击确定。点击刚刚创建的项目,在机器人帐户选项卡下点击添加机器人帐户。
在弹出的对话框中,为机器人帐户设置名称 (
robot-test
) 并点击添加。请确保在权限中勾选推送制品的权限选框。在弹出的对话框中,点击导出到文件中,保存该令牌。
启用 Insecure Registry
您需要配置 Docker,使其忽略您 Harbor 仓库的安全性。
在您的主机上运行
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
。运行以下命令重启 Docker,使更改生效。
sudo systemctl daemon-reload
sudo systemctl restart docker
备注
建议您在隔离的测试环境或者严格控制的离线环境中使用该方案。有关更多信息,请参考 Deploy a plain HTTP registry。完成上述操作后,即可在项目中部署工作负载时使用您 Harbor 仓库中的镜像。您需要为自己的 Harbor 仓库创建一个镜像密钥,然后在容器镜像选项卡下的容器设置中,选择您的 Harbor 仓库并输入镜像的绝对路径以搜索您的镜像。
创建凭证
以
project-regular
身份登录 KubeSphere 控制台,转到您的 DevOps 项目,在 DevOps 项目设置下的凭证页面为 Harbor 创建凭证。在创建凭证页面,设置凭证 ID (
robot-test
),类型选择用户名和密码。用户名字段必须和您刚刚下载的 JSON 文件中name
的值相同,并在密码/令牌中输入该文件中token
的值。点击确定以保存。
创建流水线
转到流水线页面,点击创建。在基本信息选项卡,输入名称 (
demo-pipeline
),然后点击下一步。高级设置中使用默认值,点击创建。
编辑 Jenkinsfile
点击该流水线进入其详情页面,然后点击编辑 Jenkinsfile。
将以下内容复制粘贴至 Jenkinsfile。请注意,您必须将
REGISTRY
、HARBOR_NAMESPACE
、APP_NAME
和HARBOR_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 控制台上创建的凭证 ID。
HARBOR_CREDENTIAL = credentials('robot-test')
}
stages {
stage('docker login') {
steps{
container ('maven') {
// 请替换 -u 后面的 Docker Hub 用户名,不要忘记加上 ''。您也可以使用 Docker Hub 令牌。
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以后可以自定义机器人后缀,避免此类问题)[了解更多](https://number1.co.za/rancher-cannot-use-harbor-robot-account-imagepullbackoff-pull-access-denied/)。
运行流水线
保存该 Jenkinsfile,KubeSphere 会自动在图形编辑面板上创建所有阶段和步骤。点击运行来运行该流水线。如果一切运行正常,Jenkins 将推送镜像至您的 Harbor 仓库。