使用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. 如果看到

    则说明部署成功
相关推荐
zyl837212 小时前
前后端项目自动部署方案主流实现方案
ci/cd·gitlab·github
serve the people11 小时前
Elasticsearch(1) could you tell me how to use es if i am a beginner
大数据·elasticsearch·jenkins
鹤落晴春15 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
张忠琳15 小时前
【runc 1.4.2】(Part 2)runc 1.4.2 超深度分析 — CLI层:main.go、命令文件、runner、信号处理、TTY
云原生·kubernetes·runc
Plastic garden21 小时前
K8s知识(3) Pod亲和性,调度
云原生·容器·kubernetes
张忠琳1 天前
【client-go v0.36.1】(store Part 1)Store 超深度分析 — 模块定位、接口层次、类结构、KeyFunc体系、构造初始化
云原生·kubernetes·informer·store·client-go
开发者联盟league1 天前
使用jenkins pipeline将项目打包运行在k8s上报错kubectl: Permission denied
java·kubernetes·jenkins
成为你的宁宁1 天前
【Prometheus Operator 监控 K8S集群的Calico 与 Ingress-Nginx 组件】
kubernetes·prometheus