一、说明

1)需求:
Rancher 上部署 Jenkins-master,服务采用 Jenkins-slave 发布,发布完成后 Jenkins-slave 自动销毁。
2)环境:
Rancher 2.4.3 (部署Rancher参考之前文章:Rancher 安装 k8s
Jenkins 2.176.2

二、安装 Jenkins

2.1 安装 Jenkins

在 Rancher 2 上部署 Jenkins-master

1)添加工作负载

名称:jenkins-master
Docker镜像:jenkins/jenkins:lts
命名空间:jenkins
数据卷:jenkins-master-pvc,容器路径:/var/jenkins_home
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图1
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图2

2)添加负载均衡

名称:jenkins-master
命名空间:jenkins
自定义域名:jenkinscicd.xxxxxx.com
服务/工作负载:jenkins-master
容器端口:8080
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图3

3)添加域名解析

jenkinscicd.xxxxxx.com 172.16.5.84(ingress lb 地址)
dig查看是否解析成功
dig jenkinscicd.xxxxxx.com

4)访问

1、浏览器访问连接:jenkinscicd.xxxxxx.com

2、在rancher上进入容器,查看密码
cat /var/jenkins_home/secrets/initialAdminPassword

3、验证后选择安装推荐的插件

4、重启jenkins

2.2 安装插件

Manage Jenkins -> Manage Plugins 安装 Kubernetes 和 Kubernetes Cli 插件
Kubernetes
Kubernetes Cli
image.png
说明:Kubernetes插件是可以增加Kubernetes云,Kubernetes Cli插件是用于jenkinsfile中kubectl容器可以使用withKubeConfig参数

2.3 添加凭据

添加4个全局凭据
1)docker-registry:gitlab 镜像仓库凭据(类型:Username with password)
2)gitlab:gitlab 凭据(类型:Username with password)
3)kube:develop 集群的凭据(类型:Secret text)
4)cicdkube:jenkins 所在k8s集群的凭据(类型:Secret text)
其中 kube 和 cicdkube 的Secret 为 rancher 对应的集群配置文件中的 token 值。
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图5

2.4 配置kubernetes云

系统设置,增加一个云(kubernetes)
1)名称:kubernetes
2)Kubernetes 地址:https://kubernetes.default
3)Kubernetes 命名空间:jenkins
4)凭据:cicd-kube (之前创建的cicdkube凭据,用于连接jenkins-master所在的集群)
5)Jenkins 地址:http://jenkins-master:8080

三、提交jenkinsfile文件

3.1 编写 yaml 文件

把 KubernetesPod.yaml 文件放在代码库根目录,内容如下:

  1. metadata:
  2. labels:
  3. some-label: some-label-value
  4. spec:
  5. containers:
  6. - name: jnlp
  7. env:
  8. - name: CONTAINER_ENV_VAR
  9. value: jnlp
  10. resources:
  11. limits:
  12. cpu: 1
  13. memory: 1Gi
  14. requests:
  15. cpu: 1
  16. memory: 1Gi
  17. - name: maven
  18. image: maven:3.6-alpine
  19. command:
  20. - cat
  21. tty: true
  22. env:
  23. - name: CONTAINER_ENV_VAR
  24. value: maven
  25. volumeMounts:
  26. - name: repo-maven-cache
  27. mountPath: /root/.m2
  28. - name: kubectl
  29. image: cnych/kubectl
  30. command:
  31. - cat
  32. tty: true
  33. env:
  34. - name: CONTAINER_ENV_VAR
  35. value: kubectl
  36. - name: docker
  37. image: docker
  38. command:
  39. - cat
  40. tty: true
  41. env:
  42. - name: CONTAINER_ENV_VAR
  43. value: docker
  44. volumeMounts:
  45. - name: repo-docker-sock
  46. mountPath: /var/run/docker.sock
  47. volumes:
  48. - name: repo-maven-cache
  49. persistentVolumeClaim:
  50. claimName: pvc-jenkins-maven-cache
  51. - name: repo-docker-sock
  52. hostPath:
  53. path: /var/run/docker.sock

3.2 编写 jenkinsfile

把 Jenkinsfile 文件也放在代码库根目录,内容如下:

  1. pipeline {
  2. environment {
  3. IMAGE_TAG = sh (returnStdout: true, script: 'echo "build-${BRANCH_NAME//\\//_}-$BUILD_NUMBER"').trim()
  4. }
  5. agent {
  6. kubernetes {
  7. defaultContainer 'maven'
  8. yamlFile 'KubernetesPod.yaml'
  9. }
  10. }
  11. stages {
  12. stage('Run maven') {
  13. steps {
  14. container('maven') {
  15. echo "代码编译打包"
  16. sh 'mvn clean install'
  17. }
  18. }
  19. }
  20. stage('Build image') {
  21. steps {
  22. container('docker') {
  23. script {
  24. echo "构建Docker镜像"
  25. def image = docker.build("reg.nexus.wmqhealth.com/tools/cicd-test:" + "$IMAGE_TAG", ".")
  26. withDockerRegistry([credentialsId:'docker-registry', url:"https://reg.nexus.wmqhealth.com"]){
  27. image.push()
  28. }
  29. }
  30. }
  31. }
  32. }
  33. stage('Deploy') {
  34. steps {
  35. container('kubectl') {
  36. script {
  37. echo "部署项目"
  38. withKubeConfig(clusterName: 'develop', contextName: 'develop', credentialsId: 'kube', namespace: 'cicdtest', serverUrl: 'https://rancher.wmqhealth.com/k8s/clusters/c-xg99q') {
  39. sh 'kubectl set image deployment/cicd-test cicd-test=reg.nexus.wmqhealth.com/tools/cicd-test:$IMAGE_TAG --namespace cicdtest'
  40. }
  41. }
  42. }
  43. }
  44. }
  45. }
  46. }

四、构建项目

4.1新建jenkins项目

Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图6

Property strategy:所有的分支获取同样的属性 -> Add property:不通过SCM自动化触发 (以免一进行扫描分支就进行构建项目)。
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图7
其他的默认即可,最后保存。

4.2 新建rancher项目

1)创建命名空间

在 develop 集群创建 cicdtest 命名空间

2)创建工作负载

名称和命名空间与jenkinsfile中定义保持一致。镜像随便写一个不存在的,部署pods数为0
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图8

4.3 构建

在jenkins 中点击构建
1、在jenkins所在的集群会动态生成 jenkins-slave pod
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图9

2、会打包上传镜像,并会更新develop集群中cicd-test的镜像信息
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图10

3、构建成功后,手动把pod数增加到1,这样项目就构建完成了。
Rancher 构建 CI/CD 自动化流程 - 动态配置 Jenkins-slave - 图11