前期准备

创建namespace

  1. kubectl create ns devops

准备nfs及其挂载文件夹

先在nfs服务器的nfs目录下建 jenkins_home文件夹,权限777。

部署文件

pv和pvs

jenkins-pv-pvc.yaml

  1. apiVersion: v1
  2. kind: PersistentVolume
  3. metadata:
  4. name: jenkins-home-pv
  5. spec:
  6. capacity:
  7. storage: 100Gi
  8. accessModes:
  9. - ReadWriteMany
  10. nfs:
  11. server: 192.168.1.11
  12. path: "/nfs/jenkins_home"
  13. ---
  14. apiVersion: v1
  15. kind: PersistentVolumeClaim
  16. metadata:
  17. name: jenkins-home-pvc
  18. namespace: devops
  19. spec:
  20. accessModes: ["ReadWriteMany"]
  21. resources:
  22. requests:
  23. storage: 100Gi

Serveraccount

jenkins-serveraccount.yaml

  1. apiVersion: v1
  2. kind: ServiceAccount
  3. metadata:
  4. labels:
  5. app: jenkins
  6. name: jenkins-admin
  7. namespace: devops
  8. ---
  9. apiVersion: rbac.authorization.k8s.io/v1beta1
  10. kind: ClusterRoleBinding
  11. metadata:
  12. name: jenkins-admin
  13. labels:
  14. app: jenkins
  15. subjects:
  16. - kind: ServiceAccount
  17. name: jenkins-admin
  18. namespace: devops
  19. roleRef:
  20. kind: ClusterRole
  21. name: cluster-admin
  22. apiGroup: rbac.authorization.k8s.io

deployment

jenkins-deployment.yaml

  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: jenkins
  5. namespace: devops
  6. labels:
  7. app: jenkins
  8. spec:
  9. replicas: 1
  10. selector:
  11. matchLabels:
  12. app: jenkins
  13. template:
  14. metadata:
  15. labels:
  16. app: jenkins
  17. spec:
  18. terminationGracePeriodSeconds: 10
  19. serviceAccountName: jenkins-admin
  20. containers:
  21. - name: jenkins
  22. image: jenkins/jenkins:lts
  23. imagePullPolicy: IfNotPresent
  24. volumeMounts:
  25. - name: jenkins-home
  26. mountPath: /var/jenkins_home
  27. readOnly: false
  28. - name: dockersock
  29. mountPath: /var/run/docker.sock
  30. ports:
  31. - containerPort: 8080
  32. name: web
  33. protocol: TCP
  34. - containerPort: 50000
  35. name: agent
  36. protocol: TCP
  37. volumes:
  38. - name: jenkins-home
  39. persistentVolumeClaim:
  40. claimName: jenkins-home-pvc
  41. - name: dockersock
  42. hostPath:
  43. path: /var/run/docker.sock

service

jenkins-service.yaml

  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. labels:
  5. app: jenkins
  6. name: jenkins
  7. namespace: devops
  8. annotations:
  9. prometheus.io/scrape: 'true'
  10. spec:
  11. type: NodePort
  12. ports:
  13. - name: web
  14. port: 8080
  15. targetPort: web
  16. nodePort: 30900
  17. - name: agent
  18. port: 50000
  19. targetPort: agent
  20. nodePort: 30901
  21. selector:
  22. app: jenkins

执行部署文件

  1. kubectl apply -f jenkins-pv-pvc.yaml
  2. kubectl apply -f jenkins-serveraccount.yaml
  3. kubectl apply -f jenkins-deployment.yaml
  4. kubectl apply -f jenkins-service.yaml

登录Jenkins

注意:Jenkins所在的Pod需要能够访问外网且解析域名。
image.png
image.png

通用插件

Kubernetes

Kubernetes 插件的目的是能够使用 Kubernetes 配合,实现动态配置 Jenkins 代理(使用 Kubernetes 调度机制来优化负载),在执行 Jenkins Job 构建时将,Jenkins Master 会在 kubernetes 中创建一个 Slave Pod 代理来执行任务。
该 Slave Pod 中可以包含多种镜像,例如需要 Maven 编译可以使用 Maven 镜像执行任务。使用 Docker 镜像构建可以使用 Docker 的镜像。操作 Kubernetes 可以使用 Kubectl 插件镜像。
所有 Job 中所需要的环境及其依赖都交由镜像提供,而不需要手动搭配这些环境。在等 Slave Pod 执行完 Job 任务后,将删除该代理 Slave Pod。所以 Kubernetes Plugin 简单用法就是,在 Kubernetes 中启动 Jenkins Slave 代理,让代理执行 Jenkins Job,执行完后释放删除 Slave 释放资源。
Kubernetes 下的CI/CD-- Jenkins的部署 - 图3
安装好后,进入【系统管理>系统配置】页面后的【Cloud】
image.png
【Configure Clouds】添加kubernets的集群信息
image.png

image.png
image.png

Blue Ocean

特性

  • 持续交付(CD)Pipeline的 复杂可视化 ,可以让您快速直观地理解管道状态。
  • Pipeline 编辑器 - 引导用户通过直观的、可视化的过程来创建Pipeline,从而使Pipeline的创建变得平易近人。
  • 个性化 以适应团队中每个成员不同角色的需求。
  • 在需要干预和/或出现问题时 精确定位 。 Blue Ocean 展示 Pipeline中需要关注的地方, 简化异常处理,提高生产力
  • 本地集成分支和合并请求, 在与GitHub 和 Bitbucket中的其他人协作编码时实现最大程度的开发人员生产力。

具体使用详见官方文档

Pipeline Utility Steps

Pipeline-Utility-steps插件能让你在pipeline的Step中直接使用它的API方法进行某些操作,例如查找文件,读取YAML/JSON/Properties文件、读取Maven工程POM文件等。这些方法有一个前提,任何文件都需要放在jenkins的workspace下,执行的job才能去找到文件。

常见方法

  • readJSON (读取json格式文件内容)
  • readMavenPom (读取pom格式文件的内容)
  • readYaml (读取yaml格式文件的内容)
  • readProperties (读取Properties格式文件的内容)

具体使用详见官方文档

异常错误处理

初始化出现“该jenkins实例似乎已离线”

异常信息

image.png

问题分析

解决方法

1.pod的网络问题
进入Jenkins容器,ping www.baidu.com ,如果ping不通,则说明pod的dns解析有问题
对应解决方法见:pod下的容器ping不通外网的域名

2.jenkins升级源问题
浏览器输入http:///pluginManager/advanced,这里面最底下有个【升级站点】,把其中的链接改成http的就好了:http://updates.jenkins.io/update-center.json,然后提交。
image.png
重要:如果改完Http还是不行,请改成如下镜像

提交成功后,我们发现 jenkins的 /var/lib/jenkins/hudson.model.UpdateCenter.xml文件里的对应网站地址已经变成上面修改的地址了
最后,重启Jenkins ( http:///restart )

3.修改**connectionCheckUrl**
如果上面的步骤执行玩还是没有解决,修改/var/lib/jenkins/updates/default.json
因jenkins在安装插件时需要检查网络,默认是访问google的,在这里需要修改成 www.baidu.com

docker命令执行异常

权限问题,在主机上执行

  1. chmod 777 /var/run/docker.sock

在dockersfile里的多行命令里的传参失败

原命令

  1. stage('deploy') {
  2. BUILD_VERSION="1.4.0"
  3. sh '''
  4. curl -X PATCH \
  5. -H "content-type: application/strategic-merge-patch+json" \
  6. -H "Authorization:Bearer eyJ-GSRHIxuYj_ouxBL19T-m1SvQ" \
  7. -d '{"spec":{"template":{"spec":{"containers":[{"name":"test-web","image":"192.168.1.11:6543/test/test-web:${BUILD_VERSION} "}]}}}}' \
  8. "http://192.168.1.11:32567/k8s-api/apis/apps/v1/namespaces/dev-test/deployments/web"
  9. '''
  10. }

原因

grovvy语法里单引号或者 三引号是不支持传参的,只有双引号和三重双引号支持,详见官方文档
image.png

新命令

  1. stage('deploy') {
  2. BUILD_VERSION="1.4.0"
  3. sh """
  4. curl -X PATCH \
  5. -H "content-type: application/strategic-merge-patch+json" \
  6. -H "Authorization:Bearer eyJ-GSRHIxuYj_ouxBL19T-m1SvQ" \
  7. -d '{"spec":{"template":{"spec":{"containers":[{"name":"test-web","image":"192.168.1.11:6543/test/test-web:${BUILD_VERSION} "}]}}}}' \
  8. "http://192.168.1.11:32567/k8s-api/apis/apps/v1/namespaces/dev-test/deployments/web"
  9. """
  10. }

参考文档

https://stackoverflow.com/questions/50907910/how-can-i-read-jenkins-pipeline-variable-in-multiline-shell
http://docs.groovy-lang.org/latest/html/documentation/#_string_interpolation

参考