一、說明
1)需求:
Rancher 上部署 Jenkins-master,服務采用 Jenkins-slave 發布,發布完成后 Jenkins-slave 自動銷毀。
2)環境:
Rancher 2.2.7 (部署Rancher參考之前文章:離線安裝 Rancher2.2.4 HA 集群)
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
2)添加負載均衡
名稱:jenkins-master 命名空間:jenkins 自定義域名:jenkinscicd.xxxxxx.com 服務/工作負載:jenkins-master 容器端口:8080
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
說明: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 值。
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 文件放在代碼庫根目錄,內容如下:
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
3.2 編寫 jenkinsfile
把 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' } } } } } } }
四、構建項目
4.1新建jenkins項目
Property strategy:所有的分支獲取同樣的屬性 -> Add property:不通過SCM自動化觸發 (以免一進行掃描分支就進行構建項目)。
其他的默認即可,最后保存。
4.2 新建rancher項目
1)創建命名空間
在 develop 集群創建 cicdtest 命名空間
2)創建工作負載
名稱和命名空間與jenkinsfile中定義保持一致。鏡像隨便寫一個不存在的,部署pods數為0
4.3 構建
在jenkins 中點擊構建
1、在jenkins所在的集群會動態生成 jenkins-slave pod
2、會打包上傳鏡像,並會更新develop集群中cicd-test的鏡像信息
3、構建成功后,手動把pod數增加到1,這樣項目就構建完成了。