1)需求:html
Rancher 上部署 Jenkins-master,服务采用 Jenkins-slave 发布,发布完成后 Jenkins-slave 自动销毁。git
2)环境:docker
Rancher 2.2.7 (部署Rancher参考以前文章:离线安装 Rancher2.2.4 HA 集群)浏览器
Jenkins 2.176.2 负载均衡
在 Rancher 2 上部署 Jenkins-mastermaven
名称:jenkins-master Docker镜像:jenkins/jenkins:lts 命名空间:jenkins 数据卷:jenkins-master-pvc,容器路径:/var/jenkins_home
名称:jenkins-master 命名空间:jenkins 自定义域名:jenkinscicd.xxxxxx.com 服务/工做负载:jenkins-master 容器端口:8080
jenkinscicd.xxxxxx.com 172.16.5.84(ingress lb 地址)
dig查看是否解析成功gitlab
dig jenkinscicd.xxxxxx.com
1、浏览器访问链接:jenkinscicd.xxxxxx.com 2、在rancher上进入容器,查看密码 cat /var/jenkins_home/secrets/initialAdminPassword 3、验证后选择安装推荐的插件 4、重启jenkins
Manage Jenkins -> Manage Plugins 安装 Kubernetes 和 Kubernetes Cli 插件ui
Kubernetes
Kubernetes Cli
说明:Kubernetes插件是能够增长Kubernetes云,Kubernetes Cli插件是用于jenkinsfile中kubectl容器能够使用withKubeConfig参数url
添加4个全局凭据spa
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 值。
系统设置,增长一个云(kubernetes)
1)名称:kubernetes 2)Kubernetes 地址:https://kubernetes.default 3)Kubernetes 命名空间:jenkins 4)凭据:cicd-kube (以前建立的cicdkube凭据,用于链接jenkins-master所在的集群) 5)Jenkins 地址:http://jenkins-master:8080
把 KubernetesPod.yaml 文件放在代码库根目录,内容以下:
metadata: labels: some-label: some-label-value spec: containers: - name: jnlp env: - name: CONTAINER_ENV_VAR value: jnlp resources: limits: cpu: 1 memory: 1Gi requests: cpu: 1 memory: 1Gi - name: maven image: maven:3.6-alpine command: - cat tty: true env: - name: CONTAINER_ENV_VAR value: maven volumeMounts: - name: repo-maven-cache mountPath: /root/.m2 - name: kubectl image: cnych/kubectl command: - cat tty: true env: - name: CONTAINER_ENV_VAR value: kubectl - name: docker image: docker command: - cat tty: true env: - name: CONTAINER_ENV_VAR value: docker volumeMounts: - name: repo-docker-sock mountPath: /var/run/docker.sock volumes: - name: repo-maven-cache persistentVolumeClaim: claimName: pvc-jenkins-maven-cache - name: repo-docker-sock hostPath: path: /var/run/docker.sock
把 Jenkinsfile 文件也放在代码库根目录,内容以下:
pipeline { environment { IMAGE_TAG = sh (returnStdout: true, script: 'echo "build-${BRANCH_NAME//\\//_}-$BUILD_NUMBER"').trim() } agent { kubernetes { defaultContainer 'maven' yamlFile 'KubernetesPod.yaml' } } stages { stage('Run maven') { steps { container('maven') { echo "代码编译打包" sh 'mvn clean install' } } } stage('Build image') { steps { container('docker') { script { echo "构建Docker镜像" def image = docker.build("reg.nexus.wmqhealth.com/tools/cicd-test:" + "$IMAGE_TAG", ".") withDockerRegistry([credentialsId:'docker-registry', url:"https://reg.nexus.wmqhealth.com"]){ image.push() } } } } } stage('Deploy') { steps { container('kubectl') { script { echo "部署项目" withKubeConfig(clusterName: 'develop', contextName: 'develop', credentialsId: 'kube', namespace: 'cicdtest', serverUrl: 'https://rancher.wmqhealth.com/k8s/clusters/c-xg99q') { sh 'kubectl set image deployment/cicd-test cicd-test=reg.nexus.wmqhealth.com/tools/cicd-test:$IMAGE_TAG --namespace cicdtest' } } } } } } }
在 develop 集群建立 cicdtest 命名空间
名称和命名空间与jenkinsfile中定义保持一致。镜像随便写一个不存在的,部署pods数为0
在jenkins 中点击构建
一、在jenkins所在的集群会动态生成 jenkins-slave pod
二、会打包上传镜像,并会更新develop集群中cicd-test的镜像信息
三、构建成功后,手动把pod数增长到1,这样项目就构建完成了。