joeの小窝

Loading...

jenkins详解

jenkins原理

img

是一个功能强大的应用程序,允许持续集成和持续交付项目(持续部署),无论用的是什么平台,这就是一个免费的源代码,可以处理任务类型的构建或持续集成

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端口就能访问到了

img

进入容器查看初始密码(在宿主机的挂载目录上面查看也行)

# 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,访问不到

img

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

img

2、配置用户

配置管理用户
admin/123

img

img

3、配置中文

img

安装成功后 重启
192.168.50.21:32000/restart

3、配置插件下载地址

默认插件是从国外下载的,将地址改成国内的

https://mirrors.huaweicloud.com/jenkins/update-center.json

1、页面操作

img

点击提交

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

img

重启后,就能正常下载插件了

4、安装插件

根据自己的场景选择

  • git

  • 中文插件

  • kubernetes

  • pipeline

img

安装完插件之后是需要重启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、邮件配置

img

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

img

配置邮件通知

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

img

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

img

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

img

2、凭据管理(jenkins连接别人)

jenkins的凭据有好几种

  • 账号密码,连接gitlab仓库,新版本的需要密码使用用户token

  • k8s的serviceAccount, jenkins连接k8s集群

  • ssh的用户名密码 ,jenkins连接其他服务器

  • ssh的用户名和私钥 ,Jenkins 远程 SSH 登录别的机器

后续我们的操作是需要和gitlab对接的,添加一个gitlab用户的凭据

img

test_code用户需要再gitlab上存在

img

3、任务测试

简单的测试一下,选择自由分格

img

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

img

这样就能连接gitlab了

选择gitlab分支

img

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

img

点击保存,立即构建

img

这个任务是跑在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出现了问题

解决方案

posted @ 2026-04-14 22:32  乔的港口  阅读(37)  评论(0)    收藏  举报