基于Kubesphere实现DevOps
一、DevOps介绍
1.1 项目开发需要考虑的维度
-
dev 怎么开发
-
ops 怎么运维
参考项目链接:https://github.com/kubesphere/devops-maven-sample
1.2 DevOps是什么
二、CI/CD介绍
2.1 持续集成(Continuous Integration)
持续集成是指软件个人的部分向软件整体部分交付,频繁进行集成以便更快地发现其中错误。
CI需要具备这些:
- 全面的自动化测试
这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也很重要
- 灵活的基础设施
容器、虚拟机的存在让开发人员和QA人员不必再大费周张去做IT基础设施环境的准备
- 版本控制工具
如:Git、SNV、Gitlab等
- 自动化的构建和软件发布流程工具
如:Jenkins Gitlab Tekton等
- 反馈机制
如果构建/测试失败,可以快速地反馈到相关负责人,以尽快速度解决问题,实现软件开发稳定版本推出。
2.2 持续交付(Continuous Delivery )
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的类生产环境中,持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
- 快速发布
能够应对业务需求,并更快地实现软件价值,实现编码、测试、上线、交付的频繁迭代周期缩短,同时获得迅速反馈
- 高质量软件发布标准
整个交付过程标准化、可重复、可靠
- 整个交付过程进度可视化
方便团队成员了解项目成熟度
- 更先进的团队协作方式
从需求分析、产品的用户体验到交互设计、开发、测试、运维等角色密切协作,相比于传统的的开发模式,减少浪费
2.3 持续部署(Continuous Deployment)
持续部署是指当交付的代码通过评审之后,自动部署到生产环境中。
持续部署是持续交付的最高阶段。这就意味着,所有通过了一系列的自动化测试的发动都将自动部署到生产环境。它也可以被称为Continuous Release
持续部署主要好处是,可以相对独立地部署新的功能,并能快速地收集真实用户的反馈。
三、KubeSphere DevOps凭证管理
3.1 凭证介绍
凭证是包含敏感信息的对象,例如用户名和密码、SSH 密钥和令牌 (Token)。当 KubeSphere DevOps 流水线运行时,会与外部环境中的对象进行交互,以执行一系列任务,包括拉取代码、推送和拉取镜像以及运行脚本等。此过程中需要提供相应的凭证,而这些凭证不会明文出现在流水线中。
具有必要权限的 DevOps 项目用户可以为 Jenkins 流水线配置凭证。用户在 DevOps 项目中添加或配置这些凭证后,便可以在 DevOps 项目中使用这些凭证与第三方应用程序进行交互。
目前,您可以在 DevOps 项目中创建以下 4 种类型的凭证:
-
用户名和密码:用户名和密码,可以作为单独的组件处理,或者作为用冒号分隔的字符串(格式为
username:password
)处理,例如 GitHub、GitLab 和 Docker Hub 的帐户。 - SSH 密钥:带有私钥的用户名,SSH 公钥/私钥对。
- 访问令牌:具有访问权限的令牌。
- kubeconfig:用于配置跨集群认证。如果选择此类型,将自动获取当前 Kubernetes 集群的 kubeconfig 文件内容,并自动填充在当前页面对话框中。
本教程演示如何在 DevOps 项目中创建和管理凭证。有关如何使用凭证的更多信息,请参见使用 Jenkinsfile 创建流水线和使用图形编辑面板创建流水线。
3.2 准备工作
- 您已启用 KubeSphere DevOps 系统。
- 您需要有一个企业空间、一个 DevOps 项目和一个用户 (
project-regular
),并已邀请此帐户至 DevOps 项目中且授予operator
角色。如果尚未准备好,请参见创建企业空间、项目、用户和角色。
3.3 创建凭证
以 project-regular
身份登录 KubeSphere 控制台。进入您的 DevOps 项目,选择凭证,然后点击创建。
3.3.1 创建 Docker Hub 凭证
- 首先需要在Docker Hub官网注册账号,需要关联dockerhub上传拉做镜像取等
- 在弹出的对话框中输入以下信息。
-
名称:设置可以在流水线中使用的 ID,例如
dockerhub-id
。 - 类型:选择用户名和密码。
- 用户名:您的 Docker Hub 帐户(即 Docker ID)。
- 密码/令牌:您的 Docker Hub 密码。
- 描述信息:凭证的简介。
-
名称:设置可以在流水线中使用的 ID,例如
- 完成操作后点击确定。
3.3.2 创建 GitHub 凭证
- 首先要注册github账号
同样地,按照上述相同步骤创建 GitHub 凭证。设置不同的名称(例如 github-id
),类型同样选择用户名和密码。分别在用户名和 密码/令牌中输入您的 GitHub 用户名和令牌。
- 自 2021 年 8 月起,GitHub 要求使用基于令牌的身份验证,此处需要输入令牌,而非 GitHub 密码。关于如如何生成令牌,请参阅创建个人访问令牌。
- 如果您的帐户或密码中包含任何特殊字符,例如
@
和$
,可能会因为无法识别而在流水线运行时导致错误。在这种情况下,您需要先在一些第三方网站(例如 urlencoder)上对帐户或密码进行编码,然后将输出结果复制粘贴作为您的凭证信息。
3.3.3 创建 kubeconfig 凭证
同样地,按照上述相同步骤创建 kubeconfig 凭证。设置不同的凭证 ID(例如 demo-kubeconfig
)并选择 kubeconfig。
用于配置集群访问的文件称为 kubeconfig 文件。这是引用配置文件的通用方法。有关更多信息,请参见 Kubernetes 官方文档。您可以创建 kubeconfig 凭证来访问当前 Kubernetes 集群,该凭证将在流水线中使用。您不需要更改该文件,因为 KubeSphere 会自动使用当前 Kubernetes 集群的 kubeconfig 填充该字段。访问其他集群时,您可能需要更改 kubeconfig。
3.3.4 查看和管理凭证
- 凭证创建后,会在列表中显示。
- 点击任意一个凭证,进入其详情页面,您可以查看帐户详情和与此凭证相关的所有事件。
- 您也可以在此页面上编辑或删除凭证。请注意,编辑凭证时,KubeSphere 不会显示现有用户名或密码信息。如果输入新的用户名和密码,则前一个将被覆盖。
四、将SonarQube集成到流水线
SonarQube 是一种主流的代码质量持续检测工具。您可以将其用于代码库的静态和动态分析。SonarQube 集成到 KubeSphere 流水线后,如果在运行的流水线中检测到问题,您可以直接在仪表板上查看常见代码问题,例如 Bug 和漏洞。
4.1 准备工作
您需要启用 KubeSphere DevOps 系统。
4.2 安装 SonarQube 服务器
要将 SonarQube 集成到您的流水线,必须先安装 SonarQube 服务器。
1.请先安装 Helm,以便后续使用该工具安装 SonarQube。例如,运行以下命令安装 Helm 3:
- master节点运行
# curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
2.查看helm版本
# helm version
version.BuildInfo{Version:"v3.10.1", GitCommit:"9f88ccb6aee40b9a0535fcc7efea6055e1ef72c9", GitTreeState:"clean", GoVersion:"go1.18.7"}
3.执行以下命令安装 SonarQube 服务器
# helm upgrade --install sonarqube sonarqube --repo https://charts.kubesphere.io/main -n kubesphere-devops-system --create-namespace --set service.type=NodePort
- 查看服务是否运行起来了:# kubectl get pods -n kubesphere-devops-system
4.您会获取以下提示内容
[root@k8s-master01 ~]# kubectl get svc -n kubesphere-devops-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
devops-apiserver ClusterIP 10.96.2.56 <none> 9090/TCP 5d16h
devops-jenkins NodePort 10.96.1.111 <none> 80:30180/TCP 5d16h
devops-jenkins-agent ClusterIP 10.96.2.94 <none> 50000/TCP 5d16h
s2ioperator-metrics-service ClusterIP 10.96.2.41 <none> 8080/TCP 5d16h
s2ioperator-trigger-service ClusterIP 10.96.2.217 <none> 8081/TCP 5d16h
sonarqube-postgresql ClusterIP 10.96.2.172 <none> 5432/TCP 3m38s
sonarqube-postgresql-headless ClusterIP None <none> 5432/TCP 3m38s
sonarqube-sonarqube NodePort 10.96.0.120 <none> 9000:30058/TCP 3m38s
webhook-server-service ClusterIP 10.96.3.74 <none> 443/TCP 5d16h
4.3 获取 SonarQube 控制台地址
1.执行以下命令以获取 SonarQube NodePort
# export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services sonarqube-sonarqube)
# export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
# echo http://$NODE_IP:$NODE_PORT
2.您可以获得如下输出(本示例中端口号为 30058
,可能与您的端口号不同)
http://192.168.10.141:30058
4.4 配置 SonarQube 服务器
4.4.1 访问 SonarQube 控制台
1.执行以下命令查看 SonarQube 的状态。请注意,只有在 SonarQube 启动并运行后才能访问 SonarQube 控制台。
[root@k8s-master01 ~]# kubectl get pods -n kubesphere-devops-system
NAME READY STATUS RESTARTS AGE
sonarqube-postgresql-0 1/1 Running 0 37m
sonarqube-sonarqube-df8d79d5c-hxxbx 1/1 Running 10 (2m34s ago) 37m
2.在浏览器中访问 SonarQube 控制台 http://<Node IP>:<NodePort>
。
3.点击右上角的 Log in,然后使用默认帐户 admin/admin
登录。
取决于您的实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行该端口,以便访问 SonarQube。
4.4.2 创建 SonarQube 管理员令牌 (Token)
1.点击右上角字母 A,然后从菜单中选择 My Account 以转到 Profile 页面。
2.点击 Security 并输入令牌名称,例如 kubesphere
。
3.点击 Generate 并复制此令牌。
c3ee79a4c4b25bd03867db735dc439e3bb726426
如提示所示,您无法再次查看此令牌,因此请确保复制成功。
4.4.3 创建 Webhook 服务器
1.执行以下命令获取 SonarQube Webhook 的地址
# export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)
# export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
# echo http://$NODE_IP:$NODE_PORT/sonarqube-webhook/
2.输出结果
http://192.168.10.141:30180/sonarqube-webhook/
3.依次点击 Administration、Configuration 和 Webhooks 创建一个 Webhook
4.点击 Create
5.在弹出的对话框中输入 Name 和 Jenkins Console URL(即 SonarQube Webhook 地址)。点击 Create 完成操作。
4.4.4 将 SonarQube 配置添加到 ks-installer
1.执行以下命令编辑 ks-installer
# kubectl edit cc -n kubesphere-system ks-installer
2.搜寻至 devops
。添加字段 sonarqube
并在其下方指定 externalSonarUrl
和 externalSonarToken
。
devops:
enabled: true
jenkinsJavaOpts_MaxRAM: 2g
jenkinsJavaOpts_Xms: 512m
jenkinsJavaOpts_Xmx: 512m
jenkinsMemoryLim: 2Gi
jenkinsMemoryReq: 1500Mi
jenkinsVolumeSize: 8Gi
sonarqube:
externalSonarUrl: http://192.168.10.141:30058
externalSonarToken: c3ee79a4c4b25bd03867db735dc439e3bb726426
3.完成操作后保存此文件
4.4.5 将 SonarQube 服务器添加至 Jenkins
1.执行以下命令获取 Jenkins 的地址
# export NODE_PORT=$(kubectl get --namespace kubesphere-devops-system -o jsonpath="{.spec.ports[0].nodePort}" services devops-jenkins)
# export NODE_IP=$(kubectl get nodes --namespace kubesphere-devops-system -o jsonpath="{.items[0].status.addresses[0].address}")
# echo http://$NODE_IP:$NODE_PORT
2.可以获得以下输出,获取 Jenkins 的端口号
http://192.168.10.141:30180
3.请使用地址 http://<Node IP>:30180
访问 Jenkins。安装 KubeSphere 时,默认情况下也会安装 Jenkins 仪表板。此外,Jenkins 还配置有 KubeSphere LDAP,这意味着您可以直接使用 KubeSphere 帐户(例如 admin/P@88w0rd
)登录 Jenkins。有关配置 Jenkins 的更多信息,请参见 Jenkins 系统设置。
取决于您的实例的部署位置,您可能需要设置必要的端口转发规则,并在您的安全组中放行端口
30180
,以便访问 Jenkins。
4.可以前往系统管理下的 Manage Credentials 并点击 Stores scoped to Jenkins 下的 Jenkins,再点击全局凭据 (unrestricted),然后点击左侧导航栏的添加凭据,参考上方第二张截图用 SonarQube 管理员令牌添加凭证。添加凭证后,从 Server authentication token 旁边的下拉列表中选择该凭证。
5.点击左侧导航栏中的系统管理
6.向下翻页找到并点击系统配置
6.搜寻到SonarQube Server,然后点击Add SonarQube
7.输入 Name 和 Server URL (http://<Node IP>:<NodePort>
)。点击添加,选择 Jenkins,然后在弹出的对话框中用 SonarQube 管理员令牌创建凭证(如下方第二张截图所示)。创建凭证后,从 Server authentication token 旁边的下拉列表中选择该凭证。点击应用完成操作。
4.4.6 将 sonarqubeURL 添加到 KubeSphere 控制台
您需要指定 sonarqubeURL
,以便可以直接从 KubeSphere 控制台访问 SonarQube
1.执行以下命令
# kubectl edit cm -n kubesphere-system ks-console-config
2.搜寻到 data.client.enableKubeConfig
,在下方添加 devops
字段并指定 sonarqubeURL
apiVersion: v1
data:
local_config.yaml: |
server:
http:
hostname: localhost
port: 8000
static:
production:
/public: server/public
/assets: dist/assets
/dist: dist
redis:
port: 6379
host: redis.kubesphere-system.svc
redisTimeout: 5000
sessionTimeout: 7200000
client:
version:
kubesphere: v3.1.0
kubernetes: v1.24.0
openpitrix: v3.1.0
enableKubeConfig: true
devops: 手动添加
sonarqubeURL: http://192.168.10.141:30058
defaultClusterName: default
3.保存该文件
4.4.7 重启服务
# kubectl -n kubesphere-devops-system rollout restart deploy devops-apiserver
# kubectl -n kubesphere-system rollout restart deploy ks-console
4.4.8 为新项目创建 SonarQube Token
需要一个 SonarQube 令牌,以便您的流水线可以在运行时与 SonarQube 通信。
1.在 SonarQube 控制台上,点击 Create new project。
4c5c650e18a80f699d5301773230773ad6e17924
2.创建令牌后,点击 Continue
3.分别选择 Java 和 Maven。
复制下图所示绿色框中的序列号,如果要在流水线中使用,则需要在凭证中添加此序列号。
mvn sonar:sonar \
-Dsonar.projectKey=java-demo \
-Dsonar.host.url=http://192.168.10.141:30058 \
-Dsonar.login=4c5c650e18a80f699d5301773230773ad6e17924
五、为 KubeSphere 流水线设置电子邮件服务器
内置 Jenkins 无法与平台通知系统共享相同的电子邮件配置。因此,您需要单独为 KubeSphere DevOps 流水线配置电子邮件服务器设置。
5.1 准备工作
- 您需要启用 KubeSphere DevOps 系统。
- 您需要一个具有集群管理权限的帐户。例如,您可以直接以
admin
身份登录控制台或者创建具有该权限的新角色并将该角色分配给一个用户。
5.2 设置电子邮件服务器
1.点击左上角的平台管理,然后选择集群管理。
2.如果您已经启用多集群功能并已导入成员集群,那么您可以选择一个特定集群以查看其节点。如果尚未启用该功能,请直接参考下一步。
3.转到应用负载下的工作负载,然后从下拉列表中选择 kubesphere-devops-system 项目。点击 devops-jenkins
右侧的 并选择编辑 YAML 以编辑其 YAML 配置文件。
4.向下滚动到下图所示的需要指定的字段。完成修改后,点击确定以保存。
在
devops-jenkins
部署 (Deployment) 中修改电子邮件服务器后,它会重新启动。因此,DevOps 系统将在几分钟内不可用,请在适当的时候进行此类修改。
环境变量名称 | 描述信息 |
---|---|
EMAIL_SMTP_HOST | SMTP 服务器地址 |
EMAIL_SMTP_PORT | SMTP 服务器端口(如:25) |
EMAIL_FROM_ADDR | 电子邮件发件人地址 |
EMAIL_FROM_NAME | 电子邮件发件人姓名 |
EMAIL_FROM_PASS | 电子邮件发件人密码 |
EMAIL_USE_SSL | 是否启用 SSL 配置 |
实际配置:
六、使用图形编辑面板创建流水线
KubeSphere 中的图形编辑面板包含用于 Jenkins 阶段 (Stage) 和步骤 (Step) 的所有必要操作。您可以直接在交互式面板上定义这些阶段和步骤,无需创建任何 Jenkinsfile。
本教程演示如何在 KubeSphere 中使用图形编辑面板创建流水线。KubeSphere 在整个过程中将根据您在编辑面板上的设置自动生成 Jenkinsfile,您无需手动创建 Jenkinsfile。待流水线成功运行,它会相应地在您的开发环境中创建一个部署 (Deployment) 和一个服务 (Service),并将镜像推送至 Docker Hub。
6.1 准备工作
- 您需要启用 KubeSphere DevOps 系统。
- 您需要有一个 Docker Hub 帐户。
- 您需要创建一个企业空间、一个 DevOps 项目和一个用户 (
project-regular
),必须邀请该用户至 DevOps 项目中并赋予operator
角色。如果尚未创建,请参见创建企业空间、项目、用户和角色。 - 设置 CI 专用节点来运行流水线(可选)。有关更多信息,请参见为缓存依赖项设置 CI 节点。
- 配置您的电子邮件服务器用于接收流水线通知(可选)。有关更多信息,请参见为 KubeSphere 流水线设置电子邮件服务器。
- 配置 SonarQube 将代码分析纳入流水线中(可选)。有关更多信息,请参见将 SonarQube 集成到流水线。
6.2 流水线概述
本示例流水线包括以下六个阶段。
- 阶段 1:Checkout SCM:从 GitHub 仓库拉取源代码。
- 阶段 2:单元测试:待该测试通过后才会进行下一阶段。
- 阶段 3:代码分析:配置 SonarQube 用于静态代码分析。
-
阶段 4:构建并推送:构建镜像并附上标签
snapshot-$BUILD_NUMBER
推送至 Docker Hub,其中$BUILD_NUMBER
是流水线活动列表中的记录的序列号。 - 阶段 5:制品:生成一个制品(JAR 文件包)并保存。
- 阶段 6:部署至开发环境:在开发环境中创建一个部署和一个服务。该阶段需要进行审核,部署成功运行后,会发送电子邮件通知。
6.3 流水线设置
6.3.1 创建凭证
1.以 project-regular
身份登录 KubeSphere 控制台。转到您的 DevOps 项目,在 DevOps 项目设置下的凭证页面创建以下凭证。有关如何创建凭证的更多信息,请参见凭证管理。
如果您的帐户或密码中有任何特殊字符,例如
@
和$
,可能会因为无法识别而在流水线运行时导致错误。在这种情况下,您需要先在一些第三方网站(例如 urlencoder)上对帐户或密码进行编码,然后将输出结果复制粘贴作为您的凭证信息。
凭证 ID | 类型 | 用途 |
---|---|---|
dockerhub-id | 用户名和密码 | Docker Hub |
demo-kubeconfig | kubeconfig | Kubernetes |
2.您还需要为 SonarQube 创建一个凭证 ID (sonar-token
),用于上述的阶段 3(代码分析)。请参阅为新项目创建 SonarQube 令牌 (Token),在访问令牌类型的凭证的令牌字段中输入 SonarQube 令牌。点击确定完成操作。
3.你在列表中可以看到4个凭证
6.3.2 创建项目
在本教程中,示例流水线会将 sample 应用部署至一个项目。因此,您必须先创建一个项目(例如 kubesphere-sample-dev
)。待流水线成功运行,会在该项目中自动创建该应用的部署和服务。
您可以使用 project-admin
帐户创建项目。此外,该用户也是 CI/CD 流水线的审核员。请确保将 project-regular
帐户邀请至该项目并授予 operator
角色。有关更多信息,请参见创建企业空间、项目、用户和角色。
6.3.3 创建流水线
1.请确保以 project-regular
身份登录 KubeSphere 控制台,转到您的 DevOps 项目。在流水线页面点击创建。
2.在弹出的对话框中,将它命名为 graphical-pipeline
,点击下一步。
3.在高级设置页面,点击添加,添加以下三个字符串参数。这些参数将用于流水线的 Docker 命令。添加完成后,点击创建。
参数类型 | 名称 | 值 | 描述信息 |
---|---|---|---|
字符串 | REGISTRY | docker.io |
镜像仓库地址。本示例使用 docker.io 。 |
字符串 | DOCKERHUB_NAMESPACE | Docker ID | 您的 Docker Hub 帐户或该帐户下的组织名称。 |
字符串 | APP_NAME | devops-sample |
应用名称。 |
有关其他字段,请直接使用默认值或者参考流水线设置以自定义配置。
4.创建的流水线会显示在列表中
6.3.4 编辑流水线
- 点击流水线进入其详情页面。要使用图形编辑面板,请点击任务状态选项卡下的编辑流水线。在弹出的对话框中,点击自定义流水线。该流水线包括六个阶段,请按照以下步骤设置每个阶段。
- 您也可以点击持续集成 (CI) 和持续集成&交付 (CI/CD) 来使用 KubeSphere 提供的内置流水线模板。
流水线详情页面会显示同步状态,它是 KubeSphere 和 Jenkins 之间的同步结果。若同步成功,您会看到成功图标。您也可以点击编辑 Jenkinsfile 手动为流水线创建一个 Jenkinsfile。
6.3.4.1 阶段 1:拉取源代码 (Checkout SCM)
图形编辑面板包括两个区域:左侧的画布和右侧的内容。它会根据您对不同阶段和步骤的配置自动生成一个 Jenkinsfile,为开发者提供更加用户友好的操作体验。
流水线包括声明式流水线和脚本化流水线。目前,您可以使用该面板创建声明式流水线。有关流水线语法的更多信息,请参见 Jenkins 文档。
1.在图形编辑面板上,从类型下拉列表中选择 node,从 Label 下拉列表中选择 maven。
agent
用于定义执行环境。agent
指令指定 Jenkins 执行流水线的位置和方式。有关更多信息,请参见选择 Jenkins Agent。
2.请点击左侧的加号图标来添加阶段。点击添加步骤上方的文本框,然后在右侧的名称字段中为该阶段设置名称(例如 Checkout SCM
)。
3.点击添加步骤。在列表中选择 git,以从 GitHub 拉取示例代码。在弹出的对话框中,填写必需的字段。点击确定完成操作。
-
URL:输入 GitHub 仓库地址
https://github.com/kubesphere/devops-maven-sample.git
。请注意,这里是示例地址,您需要使用您自己的仓库地址。 - 凭证 ID:本教程中无需输入凭证 ID。
-
分支:如果您将其留空,则默认为 master 分支。请输入
sonarqube
,或者如果您不需要代码分析阶段,请将其留空。
https://github.com/nextgomsb/devops-maven-sample.git
后续执行过程中有问题时,可以尝试修改容器基础镜像
创建流水线
4.第一阶段设置完成
6.3.4.2 阶段 2:单元测试
1.点击阶段 1 右侧的加号图标添加新的阶段,以在容器中执行单元测试。将它命名为 Unit Test
。
2.点击添加步骤,在列表中选择指定容器。将其命名为 maven
然后点击确定。
3.点击添加嵌套步骤,在 maven
容器下添加一个嵌套步骤。在列表中选择 shell 并在命令行中输入以下命令。点击确定保存操作。
mvn clean package
您可以在图形编辑面板上指定在给定阶段指令中执行的一系列步骤。
6.3.4.3 阶段 3:代码分析(可选)
本阶段使用 SonarQube 来测试您的代码。如果您不需要代码分析,可以跳过该阶段。
1.点击 Unit Test
阶段右侧的加号图标添加一个阶段,以在容器中进行 SonarQube 代码分析。将它命名为 Code Analysis
。
2.在 Code Analysis 中,点击任务下的添加步骤,选择指定容器。将其命名为 maven
然后点击确定。
3.点击 maven
容器下的添加嵌套步骤,以添加一个嵌套步骤。点击添加凭证并从凭证 ID 列表中选择 SonarQube 令牌 (sonar-token
)。在文本变量中输入 SONAR_TOKEN
,然后点击确定。
4.在添加凭证步骤下,点击添加嵌套步骤为其添加一个嵌套步骤。
5.点击 Sonarqube 配置,在弹出的对话框中保持默认名称 sonar
不变,点击确定保存操作
6.在 Sonarqube 配置步骤下,点击添加嵌套步骤为其添加一个嵌套步骤。
7.点击 shell 并在命令行中输入以下命令,用于 sonarqube 分支和认证,点击确定完成操作。
mvn sonar:sonar -Dsonar.login=$SONAR_TOKEN
8.点击指定容器步骤下的添加嵌套步骤(第三个),选择超时。在时间中输入 1
并将单位选择为小时,点击确定完成操作。
9.点击超时步骤下的添加嵌套步骤,选择代码质量检查 (SonarQube)。在弹出的对话框中选择检查通过后开始后续任务。点击确定保存操作。
6.3.4.4 阶段 4:构建并推送镜像
点击前一个阶段右侧的加号图标添加一个新的阶段,以构建并推送镜像至 Docker Hub。将其命名为 Build and Push
。
2.点击任务下的添加步骤,选择指定容器,将其命名为 maven
,然后点击确定。
3.点击 maven
容器下的添加嵌套步骤添加一个嵌套步骤。在列表中选择 shell 并在弹出窗口中输入以下命令,点击确定完成操作。
mvn -Dmaven.test.skip=true clean package
4.再次点击添加嵌套步骤,选择 shell。在命令行中输入以下命令,以根据 Dockerfile 构建 Docker 镜像。点击确定确认操作。
请勿遗漏命令末尾的点
.
docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER .
- 这里构建的镜像文件格如果是第一次即为: SNAPSHOT-1,第二次则是SNAPSHOT-2
- 注意如果构建失败,把可以SNAPSHOT- 改成 v
docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER .
5.再次点击添加嵌套步骤,选择添加凭证。在弹出的对话框中填写以下字段,点击确定确认操作。
-
凭证名称:选择您创建的 Docker Hub 凭证,例如
dockerhub-id
。 -
密码变量:输入
DOCKER_PASSWORD
。 -
用户名变量:输入
DOCKER_USERNAME
。
出于安全原因,帐户信息在脚本中显示为变量。
6.在添加凭证步骤中点击添加嵌套步骤(第一个)。选择 shell 并在弹出窗口中输入以下命令,用于登录 Docker Hub。点击确定确认操作。
echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin
7.在添加凭证步骤中点击添加嵌套步骤。选择 shell 并输入以下命令,将 SNAPSHOT 镜像推送至 Docker Hub。点击确定完成操作。
docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER
- 注意如果构建失败,把可以SNAPSHOT- 改成 v
docker build -f Dockerfile-online -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER .
6.3.4.5 阶段 5:生成制品
1.点击 Build and Push 阶段右侧的加号图标添加一个新的阶段,以保存制品,将其命名为 Artifacts
。本示例使用 JAR 文件包。
2.选中 Artifacts 阶段,点击任务下的添加步骤,选择保存制品。在弹出的对话框中输入 target/*.jar
,用于设置 Jenkins 中制品的保存路径。点击确定完成操作。
target/*.jar
6.3.4.6 阶段 6:部署至开发环境
1.点击 Artifacts 阶段右侧的加号图标添加最后一个阶段,将其命名为 Deploy to Dev
。该阶段用于将资源部署至您的开发环境(即 kubesphere-sample-dev
项目)。
2.点击 Deploy to Dev 阶段下的添加步骤,在列表中选择审核,然后在消息字段中填入 @project-admin
,即 project-admin
帐户在流水线运行到该阶段时会进行审核。点击确定保存操作。
在 KubeSphere 3.2.x 中,能够运行流水线的帐户也能够继续或终止该流水线。此外,流水线创建者、拥有该项目管理员角色的用户或者您指定的帐户也有权限继续或终止流水线。
3.再次点击 Deploy to Dev 阶段下的添加步骤。在列表中选择指定容器,将其命名为 maven
然后点击确定。
4.点击 maven
容器步骤下的添加嵌套步骤。在列表中选择添加凭证,在弹出的对话框中填写以下字段,然后点击确定。
- 凭证名称:选择您创建的 kubeconfig 凭证,例如
demo-kubeconfig
。 - kubeconfig 变量:输入
KUBECONFIG_CONTENT
。
5.点击添加凭证步骤下的添加嵌套步骤。在列表中选择 shell,在弹出的对话框中输入以下命令,然后点击确定。
mkdir ~/.kube
echo "$KUBECONFIG_CONTENT" > ~/.kube/config
envsubst < deploy/dev-ol/devops-sample-svc.yaml | kubectl apply -f -
envsubst < deploy/dev-ol/devops-sample.yaml | kubectl apply -f -
- 注意:devops-sample.yaml中的镜像值要与前面配置的一致
spec.container.image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER
6.如果您想在流水线成功运行时接收电子邮件通知,请点击添加步骤,选择邮件,以添加电子邮件信息。请注意,配置电子邮件服务器是可选操作,如果您跳过该步骤,依然可以运行流水线。
7.待您完成上述步骤,请在右下角点击保存。随后,您可以看到该流水线有完整的工作流,并且每个阶段也清晰列示。当您用图形编辑面板定义流水线时,KubeSphere 会自动创建相应的 Jenkinsfile。点击编辑 Jenkinsfile 查看该 Jenkinsfile。
在流水线页面,您可以点击该流水线右侧的
,然后选择复制来创建该流水线的副本。如果您需要同时运行多个不包含多分支的流水线,您可以全部选中这些流水线,然后点击运行来批量运行它们。
6.4 运行流水线
1.您需要手动运行使用图形编辑面板创建的流水线。点击运行,您可以在弹出的对话框中看到步骤 3 中已定义的三个字符串参数。点击确定来运行流水线。
2.要查看流水线的状态,请转到运行记录选项卡,点击您想查看的记录。
3.稍等片刻,流水线如果成功运行,则会在 Deploy to Dev 阶段停止。project-admin
作为流水线的审核员,需要进行审批,然后资源才会部署至开发环境。
6.5 下载制品
点击制品选项卡,然后点击右侧的图标下载该制品。
6.6 查看代码分析结果
在代码检查页面,可以查看由 SonarQube 提供的本示例流水线的代码分析结果。如果您没有事先配置 SonarQube,则该部分不可用。有关更多信息,请参见将 SonarQube 集成到流水线。
6.7 验证 Kubernetes 资源
1.如果流水线的每个阶段都成功运行,则会自动构建一个 Docker 镜像并推送至您的 Docker Hub 仓库。最终,流水线将在您事先设置的项目中自动创建一个部署和一个服务。
2.前往该项目(本教程中即 kubesphere-sample-dev
),请点击应用负载下的工作负载,您可以看到列表中显示的部署。
3.在服务页面,您可以看到示例服务通过 NodePort 暴露其端口号。要访问服务,请访问 <Node IP>:<NodePort>
。
访问服务前,您可能需要配置端口转发规则并在安全组中放行该端口。
4.现在流水线已成功运行,将会推送一个镜像至 Docker Hub。登录 Docker Hub 查看结果。
5.该应用的名称为 devops-sample
,即 APP_NAME
的值,标签即 SNAPSHOT-$BUILD_NUMBER
的值。$BUILD_NUMBER
即运行记录选项卡列示的记录的序列号。
6.如果您在最后一个阶段设置了电子邮件服务器并添加了电子邮件通知的步骤,您还会收到电子邮件消息。
七、配置流水线把项目发布到生产环境
7.1 创建GitHub tekens
如需创建 GitHub 个人访问令牌,请转到您 GitHub 帐户的 Settings,点击 Developer settings,选择 Personal access tokens,然后点击 Generate new token。
以project-regular用户登录后创建github访问凭证
7.2 GitHub创建代码仓库
7.3 创建项目
使用project-admin用户登录WEB控制器,创建kubesphere-sample-prod项目,并邀请project-regular用户成为项目成员,并为operator角色。
7.4 为发布到生产环境准备TAG_NAME变量
使用project-regular用户登录,并编辑graphical-pipeline
,添加TAG_NAME,值为v0.0.1, GITHUB_ACCOUNT,值为nextgomsb
7.5 阶段7: 提交镜像和代码至仓库(push with tag)
7.5.1 添加阶段名称:push with tag,添加条件 -> expression
scriptBlock return params.TAG_NAME =~ /v.*/
7.5.2 添加步骤-> 指定容器-> maven
7.5.2.1 添加嵌套步骤-> 审核
release image with tag?
@project-admin
7.5.2.2 容器maven中添加步骤 -> 添加凭证
- 名称:github-token 变量: GITHUB_TOKEN
7.5.2.3 凭证中添加嵌套步骤->shell->GitHub配置
-分别添加三次
git config --global user.email "nextgo@126.com"
git config --global user.name "nextgo"
git tag -a $TAG_NAME -m "$TAG_NAME"
提前编辑流水线,添加如下变量
-
流水线右侧点击编辑 字符串类型: 名称:GIT_USERNAME 默认值:nextgomsb
-
凭证中添加嵌套步骤->shell->命令如下 推送代码到指定的仓库devops-java-sample.git文章来源:https://www.toymoban.com/news/detail-766075.html
git push http://$GIT_USERNAME:$GITHUB_TOKEN@github.com/$GITHUB_ACCOUNT/devops-java-sample.git --tags --ipv4
7.5.2.4 添加DockerHub配置
- 容器中添加嵌套步骤-> shell tag标记镜像
docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:v$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME
- 容器中添加嵌套步骤-> shell->推送镜像
docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$TAG_NAME
7.6 阶段8: 发布到生产环境(deploy to production)
7.6.1 添加阶段名称:deploy to production,添加条件 -> expression添加条件
scriptBlock return params.TAG_NAME =~ /v.*/
7.6.2 添加步骤-审核
deploy to production?
@project-admin
7.6.3 添加步骤
- 指定容器 maven
7.6.3.1 添加凭证
- 添加嵌套步骤-> 添加凭证 名称: demo-kubeconfig 变量:KUBECONFIG_CONTENT
7.6.3.2 添加执行步骤
- 在凭证下 添加嵌套步骤 -> shell
envsubst < deploy/prod-all-in-one/devops-sample.yaml | kubectl apply -f -
7.7 执行流水线
• 执行流水线前,可以登录k8s集群master节点,将前面执行开发环境流水线的发布应用删了,避免有太多历史的应用存放在节点中
• kubectl get all -n kubesphere-sample-dev //查看该开发环境所存在的应用
• 我们需要将其deployment和service名称的资源删除
• kubectl delete deployment ks-sample-dev -n kubesphere-sample-dev
• kubectl delete svc ks-sample-dev -n kubesphere-sample-dev文章来源地址https://www.toymoban.com/news/detail-766075.html
到了这里,关于【业务功能115】微服务-springcloud-springboot-Kubernetes-k8s集群-Kubesphere实现DevOps流水线-CI/CD-SonarQube- Jenkins的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!