jenkins详解
jenkins原理

是一个功能强大的应用程序,允许持续集成和持续交付项目(持续部署),无论用的是什么平台,这就是一个免费的源代码,可以处理任务类型的构建或持续集成
jenkins目的
-
持续,自动的构建/测试软件项目
-
监控软件开放流程,快速问题定位及处理
-
监控一些定时执行的任务
为什么要用jenkins呢?
-
不需要手动重复干活,拉代码,编译,打包,测试,上传服务器,可以一键自动跑完所有流程
-
代码一改就自动构建,自动部署,往git推代码,jenkins能自动感知,自动编译,测试,打包,部署到测试/生产环境
-
统一环境,避免'我本地能跑',其他人本地不能跑
-
免费,开源,企业用的最多
-
支持几乎所有语言和工具,java,python,go,docker,k8s,git,maven
-
用 Jenkins,就是为了少手动干活、少犯错、代码提交就能自动构建部署、保证项目稳定交付
jenkins部署
1、创建sa
service account账户,就是pod使用这个账户运行
还需要授予这个账户权限
[root@master01 jenkins]# pwd
/root/apply/jenkins
[root@master01 jenkins]# kubectl create ns devops
namespace/devops created
[root@master01 jenkins]# cat jenkins-sa.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: jenkins-admin
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin
namespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins-admin
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: devops
# 都是创建在devops空间下的
kubectl apply -f jenkins-sa.yml
2、创建pvc
直接创建pvc而没有创建pv是因为我采用的动态制备
[root@master01 jenkins]# cat jenkins-pvc.yml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins
namespace: devops
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
3、创建deployment
[root@master01 jenkins]# cat jenkins-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: jenkins-server
name: jenkins-server
namespace: devops
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-server
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: jenkins-server
spec:
volumes:
- name: jenkins-data
persistentVolumeClaim:
claimName: jenkins
serviceAccountName: jenkins-admin
containers:
- image: jenkins/jenkins
imagePullPolicy: IfNotPresent
name: jenkins
securityContext:
runAsUser: 0
volumeMounts:
- name: jenkins-data
mountPath: /var/jenkins_home
livenessProbe:
httpGet:
path: "/login"
port: 8080
initialDelaySeconds: 90
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: "/login"
port: 8080
initialDelaySeconds: 90
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
ports:
- name: http
containerPort: 8080
- name: tcp
containerPort: 50000
resources:
limits:
memory: "2Gi"
cpu: "1"
requests:
memory: "500Mi"
cpu: "0.5"
status: {}
查看deploy
# 因为有探针,所以启动的有点慢,等待一下即可
[root@master01 jenkins]# kubectl get pod -n devops
NAME READY STATUS RESTARTS AGE
jenkins-server-5db58f78dc-t5dzx 1/1 Running 0 5m13s
4、创建svc
[root@master01 jenkins]# cat jenkins-svc.yml
apiVersion: v1
kind: Service
metadata:
name: jenkins-svc
namespace: devops
spec:
selector:
app: jenkins-server
type: NodePort
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 32000
- name: agent
port: 50000
targetPort: 50000
# 容器的8080映射到32000端口上了
[root@master01 jenkins]# kubectl get svc -n devops
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jenkins-svc NodePort 10.111.33.72 <none> 8080:32000/TCP,50000:32686/TCP 5m53s
5、登录jenkins
访问32000端口就能访问到了

进入容器查看初始密码(在宿主机的挂载目录上面查看也行)
# pv使用的nfs路径,查看nfs路径即可
[root@master01 secrets]# pwd
/nfsdata/devops-jenkins-pvc-40c91a39-07bd-4117-9293-1e9d105da721/secrets
[root@master01 secrets]# cat initialAdminPassword
906ba40c8e55428abc7daf34504dab23
6、配置jenkins
1、先不安装插件
因为默认插件访问的是google,访问不到

点击无,就能取消所有插件的选择

2、配置用户
配置管理用户
admin/123


3、配置中文

安装成功后 重启
192.168.50.21:32000/restart
3、配置插件下载地址
默认插件是从国外下载的,将地址改成国内的
https://mirrors.huaweicloud.com/jenkins/update-center.json
1、页面操作

点击提交
2、容器内操作
web界面提交后,容器内部的插件镜像源也需要修改,修改了web界面,容器内部才出现这个文件
[root@master01 secrets]# kubectl exec -ti -n devops jenkins-server-5db58f78dc-t5dzx -- /bin/bash
# 这个json文件非常的长,根本不是人看的
root@jenkins-server-5db58f78dc-t5dzx:/var/jenkins_home/updates# ls
default.json hudson.tasks.Maven.MavenInstaller
修改default.json
root@jenkins-server-5db58f78dc-t5dzx:/var/jenkins_home/updates# sed -i 's/https:\/\/updates.jenkins.io\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
3、重启jenkins

重启后,就能正常下载插件了
4、安装插件
根据自己的场景选择
-
git
-
中文插件
-
kubernetes
-
pipeline

安装完插件之后是需要重启jenkins的,所以建议一次性安装完
5、常用插件
-
Git 拉取代码
-
SSH SSH 远程执行
-
Publish Over SSH
-
Gitlab gitlab插件
-
Maven 对 Maven 项目构建
-
NodeJs 对 NodeJs 项目构建
-
DingTalk 钉钉通知
-
Pipeline 流水线
-
Kubernetes 动态创建代理
-
simple theme 主题
-
Git Parameter 动态从 git 中获取所有分支
-
Managed Scripts 管理脚本插件
-
Deploy to container 热部署插件
-
Extended Choice Parameter 扩展参数构建
-
Role-based Authorization Strategy 权限管理
-
Localization: Chinese (Simplified) 简体中文
-
ansiColor 设置颜色
-
Conditional BuildStep 在pipeline中使用when
-
HTTP Request Plugin:执行http请求并返回响应体,详细用法: https://www.jenkins.io/doc/pipeline/steps/http_request/
-
Pipeline Utility Steps:pipeline中常用的一些工具集,如压缩与解压缩、创建文件、查找文件等;详细用法: https://www.jenkins.io/doc/pipeline/steps/pipeline-utility-steps/
jenkins管理
1、邮件配置

smtp设置方法,这里以qq邮箱为例

配置邮件通知
系统管理员邮件地址,需要和后面的smtp用户一致,以这个用户发送邮件给别人

用户密码为授权码,需要生成的

测试,会发送一个测试邮件

2、凭据管理(jenkins连接别人)
jenkins的凭据有好几种
-
账号密码,连接gitlab仓库,新版本的需要密码使用用户token
-
k8s的serviceAccount, jenkins连接k8s集群
-
ssh的用户名密码 ,jenkins连接其他服务器
-
ssh的用户名和私钥 ,Jenkins 远程 SSH 登录别的机器
后续我们的操作是需要和gitlab对接的,添加一个gitlab用户的凭据

test_code用户需要再gitlab上存在

3、任务测试
简单的测试一下,选择自由分格

发现,无法连接,需要使用用户名和用户的token,不能使用用户的密码,新版本的gitlab特性

这样就能连接gitlab了
选择gitlab分支

构建步骤,选择shell,执行简单的命令,测试一下

点击保存,立即构建

这个任务是跑在jenkins自己容器的,是一个永久的jenkins项目
# 会创建一个工作区目录,有实际的数据
[root@master01 jobs]# pwd
/nfsdata/devops-jenkins-pvc-40c91a39-07bd-4117-9293-1e9d105da721/jobs
[root@master01 jobs]# ls
test_gitlab
后面会讲jenkins对接kubernetes,这个时候,就会创建一个临时pod来执行这个任务
出现的问题
访问master的ip+端口,发现访问不到,但是node节点可以访问到
calico的pod出现了问题
解决方案

浙公网安备 33010602011771号