使用Jenkins整合Sonarqube/Gitlab/Harbor/Kubernetes实现CICD

1.完整流程如下

2.安装Jenkins/Sonarqube/Gitlab/Harbor/Kubernetes

  1. GitLab
  2. Harbor
  3. Sonarqube
  4. Jenkins

3.准备工程

使用Jenkins整合Sonarqube/Gitlab/Harbor/Kubernetes的Demo工程

4. 配置GitLab

  1. gitlab-user-pass
bash 复制代码
mkdir gitlab
cd gitlab
# 创建 gitlab 默认用户名密码 secret
echo root > ./username
echo wolfcode > password
kubectl create secret generic git-user-pass --from-file=./username --from-file=./password -n kube-devops

5. 配置Harbor

修改/etc/containerd/config.toml,在 [plugins."io.containerd.grpc.v1.cri".registry]之下

添加如下配置

json 复制代码
		[plugins."io.containerd.grpc.v1.cri".registry.mirrors."{harbor-ip}:{harbor-port}"]
          endpoint = ["http://{ip}:{port}"]
		[plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."{harbor-ip}:{harbor-port}".tls]
          insecure_skip_verify = true

然后再重启containerd

bash 复制代码
sudo systemctl restart containerd

6. 配置Jenkins的访问凭据

6.1. 配置sonarqube-token全局凭据

  1. 获取sonarqube的token
    登录sonarqube
    点击右上角用户图标,点击MyAccount,点击Security,找到Generate Tokens
    Name输入jenkins,Type选择User,Expires in选择No Expiration,点击Generate
    生成之后立即复制token
  2. 在jenkins中配置全局凭据sonarqube-token
    登录jenkins
    点击右上角齿轮图标,进入系统管理,点击凭据管理,进入凭据管理界面
    点击Add Credentials,在Add Credentials界面选择类型为Secret text,点击Next
    在Add Secret text界面,输入Secret为上一步在sonarqube创建的token,ID为sonarqube-token,点击Create。

6.2. 配置Gitlab访问凭证

登录jenkins

点击右上角齿轮图标,进入系统配置界面,点击凭据管理,进入凭据管理界面

点击Add Credentials,在Add Credentials界面选择类型为Username with password,点击Next

在Add Username with password界面,输入用户名为root,密码为wolfcode,ID为git-user-pass

6.3. 配置Harbor的访问凭证

登录jenkins

点击右上角齿轮图标,进入系统配置界面,点击凭据管理,进入凭据管理界面

点击Add Credentials,在Add Credentials界面选择类型为Username with password,点击Next

在Add Username with password界面,输入用户名为root,密码为wolfcode,ID为harbor-user-pass

6.4. 配置kubeconfig的Config File

登录jenkins

点击右上角齿轮图标,进入系统配置界面,点击Managed files

在Config File Management界面,点击Add a new config

在New configuration界面,选择Type为Custom file,点击Next,

在Edit Configuration File界面,输入Name为kubeconfig,输入Content为k8s master节点的~/.kube/config的文件内容

点击Submit

7. 配置Jenkins

7.1. 配置SonarQube servers

登录jenkins

点击右上角齿轮图标,点击系统配置,在系统配置界面找到SonarQube servers,点击Add Sonarqube

Name:sonarqube # 注意这个名字要在 Jenkinsfile 中用到

Server URL:http://sonarqube:9000

Server authentication token:选择sonarqube-token

7.2. 配置Kubernetes

登录jenkins

点击右上角齿轮图标,进入系统配置界面,点击Clouds

在Clouds界面点击New Cloud

在New Cloud界面,输入Cloud Name为kubernetes,Type选择Kubernetes,点击Create

在New Cloud界面,输入Kubernetes 地址为https://kubernetes.default,并且禁用HTTPS证书检查,Jenkins地址输入http://jenkins-svc:8080

点击应用

回到系统配置界面,点击节点和云管理,在节点和云管理界面,找到master节点,进入master节点,点击配置从节点,在标签输入框输入maven,点击应用

8. 创建Jenkins的Job

8.1. 创建Job

登录jenkins

点击新建任务,在新建任务界面,输入任务名称为k8s-cicd-demo,Select an item type选择流水线,点击确定

8.2. 配置Job的Triggers

在General界面,找到Triggers构建触发器,勾选Build when a change is pushed to GitLab. GitLab webhook URL,勾选Push Event,勾选Opened Merge Request Events,点击高级,在Secret token下面点击Generate按钮,复制这个token,且复制Build when a change is pushed to GitLab. GitLab webhook URL后面的地址

8.3. 配置GitLab的Webhooks

登录GitLab

进入工程 http://{gitlab-host}:{gitlab-port}/root/k8s-cicd-demo

点击左侧菜单Settings > Webhooks

在Webhooks界面点击Add new webhook按钮

在Webhooks输入界面,输入URL为上一步复制的Build when a change is pushed to GitLab. GitLab webhook URL后面的地址,输入Secret token为上一步复制的Jenkins的job生成的Secret token,Trigger的Push Event勾选All branches,Trigger勾选Tag push events,Trigger勾选Merge request events,SSL verification的Enable SSL verification取消勾选。

然后点击Save

8.4. 配置Job的流水线

在General界面,找到流水线,勾选Pipeline script from SCM

在SCM中勾选Git,Repository URL输入框输入http://{gitlab-host}:{gitlab-port}/root/k8s-cicd-demo.git

Credentials选择gitlab的用户名密码凭据

Branches to build的指定分支输入*/main或者输入空白

脚本路径输入Jenkinsfile

勾选轻量级检出

8. 配置Jenkinsfile

找到源代码文件Jenkinsfile

修改environment.DOCKER_CREDENTIAL_ID为Jenkins创建Harbor的访问凭证名

修改environment.GIT_REPO_URL为{gitlab-host}:{gitlab-port}

修改environment.GIT_CREDENTIAL_ID为Jenkins创建Gitlab访问凭证名

修改environment.GIT_ACCOUNT为gitlab的登录用户名

修改environment.KUBECONFIG_CREDENTIAL_ID为Jenkins创建的kubeconfig的Config File

修改environment.REGISTRY为{harbor-host}:{harbor-port}

修改environment.DOCKERHUB_NAMESPACE为harbor仓库的项目名wolfcode

修改environment.APP_NAME为源代码项目名k8s-cicd-demo

修改environment.SONAR_SERVER_URL为{sonar-host}:{sonar-port}

修改environment.SONAR_CREDENTIAL_ID为Jenkins创建的sonarqube-token全局凭据名

9. 测试部署到dev

  1. 修改任意代码文件,并commit,且push到gitlab
  2. 登录Jenkins,找到k8s-cicd-demo这个job,点击进入
  3. 查看当前流水线的阶段视图是否为绿色(注意由于deploy to dev/push with tag/deploy to production三个阶段都配置了input这个输入,因此需要手动确认)
  4. 如果所有阶段全为绿色通过,那么打开k8s的命令行
bash 复制代码
kubectl get deploy,pod,svc -n k8s-cicd-dev
bash 复制代码
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/k8s-cicd-demo   1/1     1            1           24h

NAME                                 READY   STATUS    RESTARTS   AGE
pod/k8s-cicd-demo-86c6c88644-kwl5v   1/1     Running   0          115s

NAME                    TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/k8s-cicd-demo   NodePort   x.x.x.x   <none>        8080:30708/TCP   24h

可以看到service的nodeport为30708

  1. 打开浏览器,输入{k8s-master-host}:{service/k8s-cicd-demo-port}/users
  2. 如果看到

    则说明部署到dev成功

10. 测试部署到production

  1. 登录Jenkins,找到k8s-cicd-demo这个job,点击进入
  2. 点击Build with Parameters
  3. 在TAG_NAME中输入v1.2.0
  4. 点击Build
  5. 查看新的流水线的阶段视图是否为绿色,(注意由于deploy to dev/push with tag/deploy to production三个阶段都配置了input这个输入,因此需要手动确认)
  6. 如果所有阶段全为绿色通过,那么打开k8s的命令行
bash 复制代码
kubectl get deploy,pod,svc -n k8s-cicd
bash 复制代码
NAME                            READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/k8s-cicd-demo   1/1     1            1           24h

NAME                                 READY   STATUS    RESTARTS   AGE
pod/k8s-cicd-demo-5ccf6dc8bb-g79r2   1/1     Running   0          24h

NAME                    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/k8s-cicd-demo   NodePort   x.x.x.x   <none>        8080:31383/TCP   24h

可以看到service的nodeport为30708

  1. 打开浏览器,输入{k8s-master-host}:{service/k8s-cicd-demo-port}/users
  2. 如果看到

    则说明部署成功
相关推荐
运维开发故事4 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson6 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生6 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
Java之美7 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
java_cj14 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes
醉颜凉14 天前
Elasticsearch高性能优化:Bulk API大规模数据导入性能调优全攻略
elasticsearch·性能优化·jenkins
qq_4523962314 天前
第十三篇:《K8s 安全基础:RBAC、ServiceAccount、Pod Security》
java·安全·kubernetes
睡不醒男孩03082314 天前
云原生运维实战:高并发架构下的云原生可观测性、韧性降级与自动化干预体系
数据库·kubernetes·高并发·prometheus·devops·sre·缓存调优
qq_4523962314 天前
第十四篇:《K8s 网络模型与 CNI 插件(Calico、Flannel、Cilium)》
网络·kubernetes·php