前期准备
创建namespace
kubectl create ns devops
准备nfs及其挂载文件夹
先在nfs服务器的nfs目录下建 jenkins_home文件夹,权限777。
部署文件
pv和pvs
jenkins-pv-pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-home-pv
spec:
capacity:
storage: 100Gi
accessModes:
- ReadWriteMany
nfs:
server: 192.168.1.11
path: "/nfs/jenkins_home"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-home-pvc
namespace: devops
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 100Gi
Serveraccount
jenkins-serveraccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
app: jenkins
name: jenkins-admin
namespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
labels:
app: jenkins
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: devops
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
deployment
jenkins-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: devops
labels:
app: jenkins
spec:
replicas: 1
selector:
matchLabels:
app: jenkins
template:
metadata:
labels:
app: jenkins
spec:
terminationGracePeriodSeconds: 10
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: jenkins/jenkins:lts
imagePullPolicy: IfNotPresent
volumeMounts:
- name: jenkins-home
mountPath: /var/jenkins_home
readOnly: false
- name: dockersock
mountPath: /var/run/docker.sock
ports:
- containerPort: 8080
name: web
protocol: TCP
- containerPort: 50000
name: agent
protocol: TCP
volumes:
- name: jenkins-home
persistentVolumeClaim:
claimName: jenkins-home-pvc
- name: dockersock
hostPath:
path: /var/run/docker.sock
service
jenkins-service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: jenkins
name: jenkins
namespace: devops
annotations:
prometheus.io/scrape: 'true'
spec:
type: NodePort
ports:
- name: web
port: 8080
targetPort: web
nodePort: 30900
- name: agent
port: 50000
targetPort: agent
nodePort: 30901
selector:
app: jenkins
执行部署文件
kubectl apply -f jenkins-pv-pvc.yaml
kubectl apply -f jenkins-serveraccount.yaml
kubectl apply -f jenkins-deployment.yaml
kubectl apply -f jenkins-service.yaml
登录Jenkins
注意:Jenkins所在的Pod需要能够访问外网且解析域名。
通用插件
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 释放资源。
安装好后,进入【系统管理>系统配置】页面后的【Cloud】
【Configure Clouds】添加kubernets的集群信息
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实例似乎已离线”
异常信息
问题分析
解决方法
1.pod的网络问题
进入Jenkins容器,ping www.baidu.com ,如果ping不通,则说明pod的dns解析有问题
对应解决方法见:pod下的容器ping不通外网的域名
2.jenkins升级源问题
浏览器输入http://
重要:如果改完Http还是不行,请改成如下镜像
- https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- http://mirror.esuni.jp/jenkins/updates/update-center.json
- http://mirror.xmission.com/jenkins/updates/update-center.json
提交成功后,我们发现 jenkins的 /var/lib/jenkins/hudson.model.UpdateCenter.xml文件里的对应网站地址已经变成上面修改的地址了
最后,重启Jenkins ( http://
3.修改**connectionCheckUrl**
如果上面的步骤执行玩还是没有解决,修改/var/lib/jenkins/updates/default.json
因jenkins在安装插件时需要检查网络,默认是访问google的,在这里需要修改成 www.baidu.com
docker命令执行异常
权限问题,在主机上执行
chmod 777 /var/run/docker.sock
在dockersfile里的多行命令里的传参失败
原命令
stage('deploy') {
BUILD_VERSION="1.4.0"
sh '''
curl -X PATCH \
-H "content-type: application/strategic-merge-patch+json" \
-H "Authorization:Bearer eyJ-GSRHIxuYj_ouxBL19T-m1SvQ" \
-d '{"spec":{"template":{"spec":{"containers":[{"name":"test-web","image":"192.168.1.11:6543/test/test-web:${BUILD_VERSION} "}]}}}}' \
"http://192.168.1.11:32567/k8s-api/apis/apps/v1/namespaces/dev-test/deployments/web"
'''
}
原因
grovvy语法里单引号或者 三引号是不支持传参的,只有双引号和三重双引号支持,详见官方文档
新命令
stage('deploy') {
BUILD_VERSION="1.4.0"
sh """
curl -X PATCH \
-H "content-type: application/strategic-merge-patch+json" \
-H "Authorization:Bearer eyJ-GSRHIxuYj_ouxBL19T-m1SvQ" \
-d '{"spec":{"template":{"spec":{"containers":[{"name":"test-web","image":"192.168.1.11:6543/test/test-web:${BUILD_VERSION} "}]}}}}' \
"http://192.168.1.11:32567/k8s-api/apis/apps/v1/namespaces/dev-test/deployments/web"
"""
}
参考文档
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