1.完整流程如下

2.安装Jenkins/Sonarqube/Gitlab/Harbor/Kubernetes
3.准备工程
使用Jenkins整合Sonarqube/Gitlab/Harbor/Kubernetes的Demo工程
4. 配置GitLab
- 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全局凭据
- 获取sonarqube的token
登录sonarqube
点击右上角用户图标,点击MyAccount,点击Security,找到Generate Tokens
Name输入jenkins,Type选择User,Expires in选择No Expiration,点击Generate
生成之后立即复制token - 在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
- 修改任意代码文件,并commit,且push到gitlab
- 登录Jenkins,找到k8s-cicd-demo这个job,点击进入
- 查看当前流水线的阶段视图是否为绿色(注意由于deploy to dev/push with tag/deploy to production三个阶段都配置了input这个输入,因此需要手动确认)
- 如果所有阶段全为绿色通过,那么打开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
- 打开浏览器,输入{k8s-master-host}:{service/k8s-cicd-demo-port}/users
- 如果看到

则说明部署到dev成功
10. 测试部署到production
- 登录Jenkins,找到k8s-cicd-demo这个job,点击进入
- 点击Build with Parameters
- 在TAG_NAME中输入v1.2.0
- 点击Build
- 查看新的流水线的阶段视图是否为绿色,(注意由于deploy to dev/push with tag/deploy to production三个阶段都配置了input这个输入,因此需要手动确认)
- 如果所有阶段全为绿色通过,那么打开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
- 打开浏览器,输入{k8s-master-host}:{service/k8s-cicd-demo-port}/users
- 如果看到

则说明部署成功