k8s与jenkins

学习目标

持续集成工具:

  • Jenkins
  • gitlabci
  • Tekton

本章基于k8s集群部署gitlab、sonarQube、Jenkins等工具,并把上述工具集成到Jenkins中,以Django项目和SpringBoot项目为例,通过多分支流水线及Jenkinsfile实现项目代码提交到不同的仓库分支,实现自动代码扫描、单元测试、docker容器构建、k8s服务的自动部署。

  • DevOps、CI、CD介绍
  • Jenkins、sonarQube、gitlab的快速部署
  • Jenkins初体验
  • 流水线入门及Jenkinsfile使用
  • Jenkins与Kubernetes的集成
  • sonarQube代码扫描与Jenkins的集成
  • 实践Django项目的基于Jenkinsfile实现开发、测试环境的CI/CD

DevOps、CI、CD介绍

CI/CD(Continuous Integration/Continuous Delivery)是一种软件交付流程,旨在通过自动化和持续集成的方式,实现高效、快速、可靠地交付软件。

  1. Continuous Integration(持续集成): 持续集成是指开发人员频繁地将代码变更合并到共享存储库中,并通过自动化构建和测试来验证代码的完整性和质量。它的主要目标是尽早地发现和解决集成问题,确保代码始终处于可集成状态。当开发人员将代码推送到共享存储库时,CI服务器会自动触发构建过程,执行各种构建、编译和测试任务,并提供实时反馈。
  2. Continuous Delivery(持续交付): 持续交付是在持续集成的基础上进一步推进,它的目标是通过自动化流程将经过验证的代码快速、可靠地部署到生产环境中。持续交付强调将人工干预降至最低,确保软件可以随时部署。除了构建和测试,持续交付还包括自动化部署、配置管理和环境管理等过程。持续交付的实践使得软件可以频繁地、可靠地交付给用户,以便快速响应需求和市场变化。
  3. Continuous Deployment(持续部署): 持续部署是CI/CD流程中的一种更进一步的实践,它将经过验证的代码自动部署到生产环境中,而无需人工干预。在持续部署中,一旦代码通过了构建和测试,它就会自动地部署到生产环境中,以实现实时交付。这种自动化的部署过程需要对生产环境的稳定性和可靠性有高度的信心,并且通常与良好的监控和回滚机制相结合,以确保部署的安全性。

总结起来,CI/CD是通过持续集成、持续交付和(可选的)持续部署,实现软件交付过程的自动化、快速和可靠性。它有助于减少集成问题、提高开发团队的效率,并能够更快地将新功能和改进交付给最终用户。

软件交付流程

image-20230506160633618

部署过程可以涉及以下步骤:

  1. 环境配置:为目标环境进行必要的配置,包括服务器设置、网络配置、数据库配置等。这确保了目标环境能够正确地支持应用程序的运行。
  2. 自动化部署:CD系统会自动将经过测试的代码部署到目标环境。这可以通过自动化部署工具或脚本来完成,例如使用容器技术(如Docker)进行部署,或使用配置管理工具(如Ansible、Chef或Puppet)进行自动化配置和部署。
  3. 部署验证:一旦应用程序成功部署到目标环境,可以进行验证和测试,以确保部署的正确性。这可能涉及运行一系列的集成测试、系统测试或性能测试,以确保应用程序在目标环境中正常运行。
  4. 监控和日志:在部署完成后,需要设置监控和日志记录机制,以便实时监测应用程序的运行状态、性能指标和错误日志。这有助于快速发现和解决潜在问题,确保应用程序的稳定性和可靠性。

以上步骤可以根据具体的软件开发团队和组织需求进行调整和定制。重要的是将整个软件交付过程自动化,并建立一个可重复、可靠且高效的流程,以便快速、可靠地交付软件。这有助于减少人为错误、加快软件发布速度,并提供持续交付的能力,以适应不断变化的需求和市场条件。

瀑布式开发模式

image-20230506161605746

瀑布模型以阶段划分的方式进行软件开发,每个阶段按顺序进行,前一个阶段完成后才能进入下一个阶段。这种模式的确存在以下问题:

  1. 长迭代周期:瀑布模型的特点是每个阶段的工作都需要完成后才能进入下一个阶段,导致整个开发过程的迭代周期长。这使得产品的快速迭代和灵活性较差,无法快速响应市场变化和用户需求的变化。
  2. 高风险的交付:在瀑布模型中,代码开发和功能实现是在整个开发周期的后期阶段才进行测试,这可能导致发现问题和错误的时间推迟到后期,增加了修复的成本和风险。同时,由于缺乏及时的用户反馈,产品可能无法满足实际需求。
  3. 缺乏灵活性:瀑布模型中的阶段性划分限制了团队在开发过程中的灵活性和适应性。一旦需求确定并开始开发,很难进行较大的调整或变更。这可能导致开发的产品与最终用户需求不匹配。

为了解决这些问题,敏捷开发方法和DevOps实践逐渐兴起。敏捷方法强调迭代和增量开发,将软件交付拆分为较短的迭代周期,通过持续反馈和持续集成来快速适应需求变化。DevOps则通过自动化和协作来实现快速、高质量和可靠的软件交付。

采用敏捷开发方法和DevOps实践可以带来以下好处:

  • 更短的迭代周期,快速响应市场变化和用户需求。
  • 提前进行测试和验证,减少错误和风险。
  • 强调团队的协作和沟通,提高开发效率和质量。
  • 自动化构建、测试和部署,提高交付的可靠性和效率。

综上所述,瀑布模型在快速迭代和灵活性方面存在局限性,而敏捷开发方法和DevOps实践能够更好地适应当下需要快速迭代的软件开发场景。

敏捷开发

image-20230506161659368

如果在软件开发中仅注重开发敏捷而忽视交付敏捷,可能会导致以下问题:

  1. 长交付周期:即使开发团队采用敏捷方法进行开发,但如果交付流程没有相应的优化和自动化,交付周期仍可能很长。这将限制产品快速交付给最终用户,影响产品的市场竞争力。
  2. 资源浪费:如果开发团队的工作进展较快,但交付过程却变得繁琐和缓慢,可能导致资源浪费。例如,开发人员可能会等待测试和部署的完成,导致时间和人力资源的浪费。
  3. 高风险的交付:如果交付流程没有适当的测试和验证步骤,那么可能会将低质量或存在问题的软件交付给最终用户。这会增加软件出现错误和故障的风险,对用户体验和产品声誉产生负面影响。

为了解决这些问题,注重交付敏捷同样重要。以下是一些可以采取的措施:

  1. 自动化部署和配置管理:通过采用自动化部署工具和配置管理工具,例如使用容器技术和基础设施即代码(Infrastructure as Code),可以实现快速、可重复和可靠的部署过程。
  2. 持续集成和持续交付:确保开发人员频繁地将代码集成到共享存储库,并通过自动化构建、测试和部署流程,快速交付经过验证的软件。
  3. 自动化测试和质量保证:建立自动化测试框架和流程,包括单元测试、集成测试和端到端测试,以确保交付的软件质量。同时,注重代码质量和静态代码分析,以提前发现潜在问题。
  4. 实时监控和反馈:建立监控系统,对部署的软件进行实时监测,以便快速发现和解决潜在的问题。同时,通过持续反馈和用户参与,了解用户需求和反馈,进一步优化产品。

通过将开发敏捷和交付敏捷相结合,可以实现整个软件交付流程的快速、高效和可靠。这有助于缩短产品的上市时间,增强产品的竞争力,并提供更好的用户体验。

学这个(DevOps)

image-20230506161819079

DevOps是一种软件交付模式,旨在通过促进开发、测试和运维团队之间的协同工作和自动化来实现持续开发和持续交付。

在传统的开发模式中,开发、测试和运维通常是独立的团队,彼此之间的沟通和协作通常是通过手动的方式进行,这会导致沟通成本高、协作效率低下的问题。这也是为什么最初的开发模式没有直接进入DevOps时代的原因之一。

DevOps通过引入自动化工具和技术,解决了角色之间的沟通和协作成本问题。通过自动化构建、测试、部署和监控等流程,可以减少人工干预和手动操作的需要,提高团队之间的协同效率。自动化工具和技术可以帮助团队更好地协同工作,共享信息和资源,快速响应变化,并实现持续交付。

DevOps并不仅仅是关于工具和技术,而是一种文化和组织变革。它鼓励团队成员之间的协作、共享责任和持续改进的精神。通过建立良好的团队文化和沟通机制,DevOps可以进一步降低角色之间的成本,实现更高效的软件交付。

总结起来,DevOps是通过自动化工具和技术来支持开发、测试和运维团队之间的协同工作,解决了沟通和协作成本的问题。然而,成功实施DevOps需要更多的文化和组织层面的改变,以建立高效的团队合作和持续改进的实践。

开发、测试、运维协同工作, 持续开发+持续交付。

我们是否可以认为DevOps = 提倡开发、测试、运维协同工作来实现持续开发、持续交付的一种软件交付模式?

大家想一下为什么最初的开发模式没有直接进入DevOps的时代?

原因是:沟通成本。

各角色人员去沟通协作的时候都是手动去做,交流靠嘴,靠人去指挥,很显然会出大问题。

所以说不能认为DevOps就是一种交付模式,因为解决不了沟通协作成本,这种模式就不具备可落地性。

那DevOps时代如何解决角色之间的成本问题?DevOps的核心就是自动化。自动化的能力靠什么来支撑,工具和技术。

DevOps工具链

image-20230506162915717

DevOps确实是一种软件交付模式,强调开发、测试和运维团队之间的协同工作,以实现持续开发和持续交付。同时,自动化工具和技术是支撑DevOps实践的重要组成部分,通过自动化流程来降低协作成本和提高交付效率。

在DevOps实践中,确实有许多常用的工具和技术,其中一些您已经提到了。以下是对这些工具的简要说明:

  1. GitLab:GitLab是一个代码托管和协作平台,广泛用于版本控制和团队协作。它提供了强大的代码仓库管理功能,支持分支管理、合并请求等功能。
  2. Jenkins:Jenkins是一个开源的持续集成和持续交付工具,可以通过自动化构建、测试和部署流程来支持DevOps实践。
  3. Robot Framework:Robot Framework是一个基于Python的开源自动化测试框架,可以用于编写和执行各种类型的自动化测试,包括接口测试、功能测试等。
  4. SonarQube:SonarQube是一个代码质量管理平台,可以进行静态代码分析、检测代码缺陷和漏洞,并提供实时的质量报告和指标。
  5. Maven:Maven是一个用于构建、依赖管理和项目管理的Java工具。它提供了一种标准的项目结构和构建流程,简化了项目的构建和部署过程。
  6. Kubernetes:Kubernetes是一个用于容器编排和管理的开源平台,可以帮助自动化部署、扩展和管理容器化应用程序。
  7. Docker:Docker是一种轻量级的容器化技术,可以将应用程序及其依赖项打包成可移植的容器,提供一致的运行环境,并支持快速部署和扩展。

这些工具和技术在实现DevOps的自动化流程和持续交付方面发挥了重要作用。通过它们的结合和应用,团队可以更高效地开发、测试和交付软件,实现持续交付的目标。然而,需要根据具体情况选择适合的工具,并结合良好的团队协作和文化实践,才能真正落地和发挥其价值。

k8s安装jenkins

官网安装教程

https://jenkins.io/zh/doc/book/installing/

注意点

以下是对每个注意点的简要说明:

  1. 第一次启动很慢:Jenkins在第一次启动时可能需要进行初始化和配置,因此启动时间可能较长。这是正常现象,不必担心。在后续的运行中,启动时间通常会更快。
  2. 与Kubernetes集群的集成:Jenkins可以与Kubernetes集群进行集成,以便进行容器化的持续交付。在安装Jenkins时,创建了一个ServiceAccount,并为其授予cluster-admin权限,以便Jenkins可以调用Kubernetes集群的API进行操作。
  3. 初始化容器设置权限:Jenkins可以使用初始化容器来设置所需的权限和配置。通过初始化容器,可以在Jenkins启动之前执行一些额外的操作,如安装插件、设置环境变量等。
  4. 使用Ingress进行外部访问:Ingress是Kubernetes的一种资源对象,用于将外部流量路由到集群中的服务。您可以使用Ingress配置,将Jenkins暴露给外部访问。通过Ingress,可以设置域名、SSL证书、路径等信息,以实现安全和可访问的外部访问方式。
  5. 数据存储通过PVC挂载:为了持久化存储Jenkins的数据,您可以创建一个PersistentVolumeClaim (PVC),并将其挂载到宿主机上的目录中。这样可以确保数据在Jenkins容器重启或迁移时不会丢失。

这些注意点提供了关于Jenkins部署和与Kubernetes集群集成的一些重要细节。通过考虑这些注意点并正确配置,您可以在Kubernetes环境中成功部署和管理Jenkins,实现持续交付和自动化流程。

apiVersion: v1
kind: Namespace
metadata:
  name: jenkins
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: jenkins
  namespace: jenkins
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: nfs # 你依然要提前准备好nfs的驱动器
  resources:
    requests:
      storage: 200Gi
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: jenkins
  namespace: jenkins
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: jenkins-crb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: jenkins
  namespace: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jenkins-master
  namespace: jenkins
spec:
  replicas: 1
  selector:
    matchLabels:
      devops: jenkins-master
  template:
    metadata:
      labels:
        devops: jenkins-master
    spec:
      serviceAccount: jenkins #Pod 需要使用的服务账号
      initContainers:
      - name: fix-permissions
        image: busybox
        command: ["sh", "-c", "chown -R 1000:1000 /var/jenkins_home"]
        securityContext:
          privileged: true
        volumeMounts:
        - name: jenkinshome
          mountPath: /var/jenkins_home
      containers:
      - name: jenkins
        image: jenkins/jenkins:2.375.1-lts-jdk11 # 官方提供的镜像,最新的
        imagePullPolicy: IfNotPresent
        ports:
        - name: http #Jenkins Master Web 服务端口
          containerPort: 8080
        - name: slavelistener #Jenkins Master 供未来 Slave 连接的端口
          containerPort: 50000
        volumeMounts:
        - name: jenkinshome
          mountPath: /var/jenkins_home
        env:
        - name: JAVA_OPTS # 这个启动jenkins的参数很重要,关乎清华源的修改
          value: "-Xms4096m -Xmx5120m -Duser.timezone=Asia/Shanghai -Dhudson.model.DownloadService.noSignatureCheck=true -Dhudson.model.DirectoryBrowserSupport.CSP="
      volumes:
      - name: jenkinshome
        persistentVolumeClaim:
          claimName: jenkins
---
apiVersion: v1
kind: Service
metadata:
  name: jenkins
  namespace: jenkins
spec:
  ports:
  - name: http
    port: 8080
    targetPort: 8080
  - name: slavelistener
    port: 50000
    targetPort: 50000
  type: ClusterIP
  selector:
    devops: jenkins-master
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: jenkins-web
  namespace: jenkins
spec:
  ingressClassName: nginx
  rules:
  - host: jenkins.yuchaoit.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: jenkins
            port:
              number: 8080

这是一个示例的Kubernetes YAML文件,用于部署Jenkins到Kubernetes集群中。下面是对文件中各部分的简要解释:

  1. Namespace:创建名为"jenkins"的命名空间,用于隔离Jenkins相关资源。
  2. PersistentVolumeClaim:创建一个持久卷声明,使用nfs存储类,并请求200Gi的存储容量,用于持久化Jenkins数据。
  3. ServiceAccount:创建名为"jenkins"的服务账号,用于Jenkins Pod的权限管理。
  4. ClusterRoleBinding:将"jenkins"服务账号与"cluster-admin"集群角色绑定,授予Jenkins Pod访问集群的权限。
  5. Deployment:创建Jenkins的Deployment资源,指定1个副本,并配置initContainer和主容器的相关设置,包括权限修复、镜像版本、端口映射等。
  6. Service:创建名为"jenkins"的Service,将Jenkins的端口暴露给集群内其他服务使用。
  7. Ingress:创建Ingress资源,配置域名和路径路由,将外部流量路由到Jenkins的Service。

这些YAML配置文件定义了部署Jenkins所需的Kubernetes资源。您可以使用kubectl或其他Kubernetes部署工具将这些配置应用到您的集群中,以启动Jenkins并配置其所需的环境。请注意,这只是一个示例配置,您可能需要根据自己的需求进行适当的修改和调整。

Dhudson.model.DownloadService.noSignatureCheck=true 是一个 Jenkins 启动参数,用于禁用插件下载时的签名检查。
通过设置该参数,Jenkins 将不再验证插件的签名,从而加快插件的下载速度。

安装

[root@k8s-master ~/jenkins-all]#kubectl create -f jenkins-all.yml 
namespace/jenkins created
persistentvolumeclaim/jenkins created
serviceaccount/jenkins created
clusterrolebinding.rbac.authorization.k8s.io/jenkins-crb created
deployment.apps/jenkins-master created
service/jenkins created
ingress.networking.k8s.io/jenkins-web created


# 
[root@k8s-master ~/jenkins-all]#kubectl -n jenkins get all
NAME                                  READY   STATUS    RESTARTS   AGE
pod/jenkins-master-75c78b968c-56hdh   1/1     Running   0          2m19s

NAME              TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)              AGE
service/jenkins   ClusterIP   10.103.87.65   <none>        8080/TCP,50000/TCP   2m19s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/jenkins-master   1/1     1            1           2m19s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/jenkins-master-75c78b968c   1         1         1       2m19s
[root@k8s-master ~/jenkins-all]#

# 检查pvc
[root@k8s-master ~/jenkins-all]#kubectl -n jenkins get pvc
NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
jenkins   Bound    pvc-0508e4db-1dc2-485b-acc8-4a9e3cf3f0e3   200Gi      RWO            nfs            2m37s
[root@k8s-master ~/jenkins-all]#


# 检查NFS数据
[root@docker01 ~]#ls /data/k8s/
archived-pvc-3c0f682c-b266-426e-b1ac-e8a9ffe16d01
archived-pvc-59d1318b-02f4-41ef-af07-813824935851
archived-pvc-c6a83e3f-efd9-47c6-b527-ea34bc2849b9
harbor-harbor-data-pvc-7f0865d0-f825-429f-972e-0f43a4a2ad46
harbor-harbor-jobservice-pvc-a29a1209-62bd-4888-bff6-e9883cb9c7d7
jenkins-jenkins-pvc-0508e4db-1dc2-485b-acc8-4a9e3cf3f0e3
kubesphere-monitoring-system-prometheus-k8s-db-prometheus-k8s-0-pvc-1057af6a-01b2-4a85-a41f-41e269b41e06
kubesphere-monitoring-system-prometheus-k8s-db-prometheus-k8s-1-pvc-210d4dac-407d-43ef-9e82-e6b7d95db2ec
logging-es-data-volume-elasticsearch-0-pvc-b6f95308-ba8a-46eb-a7dd-6a52482976eb
logging-es-data-volume-elasticsearch-1-pvc-7eb411a2-cf2e-4cf7-bfaa-d7fad53c730d
logging-es-data-volume-elasticsearch-2-pvc-37fd8346-c6b2-4e9e-896f-29cd4b263e83
yc-nginx
yuchao-auto-pvc-mysql-pvc-ae643077-64ca-49d3-85a4-68750cb4cb4b
yuchao-test-pvc-pvc-cc925348-84eb-4469-8cba-60018e1244e2
[root@docker01 ~]#

# 这里以archived-开头的,是指表示一个已经归档或不再活跃使用的持久卷声明。
# 这意味着该 PVC 曾经用于存储数据,但现在已经不再被活跃使用,可能被归档或备份。

[root@docker01 ~]#cd /data/k8s/jenkins-jenkins-pvc-0508e4db-1dc2-485b-acc8-4a9e3cf3f0e3/
[root@docker01 /data/k8s/jenkins-jenkins-pvc-0508e4db-1dc2-485b-acc8-4a9e3cf3f0e3]#ls
config.xml               hudson.model.UpdateCenter.xml     jobs              nodes    secret.key                secrets  userContent  war
copy_reference_file.log  jenkins.telemetry.Correlator.xml  nodeMonitors.xml  plugins  secret.key.not-so-secret  updates  users
[root@docker01 /data/k8s/jenkins-jenkins-pvc-0508e4db-1dc2-485b-acc8-4a9e3cf3f0e3]#

访问jenkins

[root@k8s-master ~/jenkins-all]#kubectl -n jenkins logs --tail=20 jenkins-master-75c78b968c-56hdh 
Defaulted container "jenkins" out of: jenkins, fix-permissions (init)

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

29246b4797544f2e8f6bba0dcb031c96

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

2023-05-06 08:39:39.236+0000 [id=35]    INFO    jenkins.InitReactorRunner$1#onAttained: Completed initialization
2023-05-06 08:39:39.261+0000 [id=23]    INFO    hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2023-05-06 08:39:40.637+0000 [id=53]    INFO    h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2023-05-06 08:39:40.638+0000 [id=53]    INFO    hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
[root@k8s-master ~/jenkins-all]#


# 查看初始化密码
[root@k8s-master ~/jenkins-all]#kubectl -n jenkins exec jenkins-master-75c78b968c-56hdh -- cat /var/jenkins_home/secrets/initialAdminPassword
Defaulted container "jenkins" out of: jenkins, fix-permissions (init)
29246b4797544f2e8f6bba0dcb031c96

image-20230506180709485

自定义插件

点击❎、跳过插件安装,直接登录jenkins主页。

image-20230507135832566

修改jenkins插件源

点击叉号,跳过选择安装推荐的插件环节,直接进入Jenkins。

由于默认的插件地址安装非常慢,我们可以替换成国内清华的源,进入 jenkins 工作目录,目录下面有一个 updates 的目录,下面有一个 default.json 文件,我们执行下面的命令替换插件地址:

[root@k8s-master ~/jenkins-all]#kubectl -n jenkins exec -it jenkins-master-75c78b968c-4pjsp -- bash

# 目前最好用的办法,就是
cd /var/jenkins_home/updates
sed -i 's/https:\/\/updates.jenkins.io\/download/http:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json

sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json

image-20230507142445136

Manange jenkins

image-20230507143207092

Plugin Mananger

配置升级站点的源

# http://jenkins.luffy.com/pluginManager/advanced
# Plugin Manager -> Advanced,最后一项URL替换为:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

image-20230507143336335

修改密码

image-20230507143510956

admin
www.yuchaoit.cn

完事回自动重启

重启jenkins

  • 重建pod
  • 在线重启
https://jenkins.yuchaoit.cn/restart/

image-20230507143613268

安装汉化插件

Jenkins -> manage Jenkins -> Plugin Manager -> Avaliable,分别安装如下插件:

安装完成后,选择[Install without restart],等待下载完成,然后点击[ Restart Jenkins when installation is complete and no jobs are running ],让Jenkins自动重启

启动后,再次登录界面默认变成中文。

gitlab插件

Jenkins 的 GitLab 插件是一个用于与 GitLab 集成的插件,它提供了与 GitLab 代码仓库和持续集成/持续交付(CI/CD)流程的连接和交互功能。

GitLab 是一个基于 Git 的版本控制和协作平台,而 Jenkins 是一个流行的持续集成和交付工具。GitLab 插件的作用是将这两个工具整合在一起,使得 Jenkins 能够与 GitLab 进行无缝的集成和协同工作。

GitLab 插件的主要功能包括:

  1. 与 GitLab 代码仓库的连接:插件允许 Jenkins 与 GitLab 服务器建立连接,可以从 GitLab 获取代码并触发构建和部署操作。
  2. Webhook 支持:插件可以配置 GitLab 的 Webhook,当代码仓库中有新的提交或事件发生时,自动触发 Jenkins 的构建任务。
  3. 自动构建和测试:插件可以配置 Jenkins 在每次代码提交或推送到 GitLab 时自动触发构建和测试任务,从而实现持续集成和自动化测试。
  4. 构建状态和报告:插件可以将 Jenkins 的构建状态和测试报告反馈到 GitLab,让团队成员能够方便地查看构建和测试结果。
  5. 代码部署:插件支持将 Jenkins 构建后的代码自动部署到 GitLab 服务器或其他目标环境,实现持续交付和自动部署。

通过使用 GitLab 插件,您可以将 Jenkins 和 GitLab 结合起来,实现全面的 CI/CD 流程,从代码管理到自动化构建、测试和部署,提高开发团队的效率和代码质量。

image-20230507144014180

只要你替换了清华源,速度是很快的

image-20230507144056389

Pipeline Multibranch

Jenkins 的 Pipeline Multibranch 插件是一个用于多分支流水线的插件,它扩展了 Jenkins 的流水线功能,使得可以轻松管理和构建多个代码仓库中的分支。

Pipeline Multibranch 插件的作用是:

  1. 多分支管理:插件可以监视指定代码仓库中的所有分支,并自动创建对应的流水线作业。每个分支都可以有独立的 Jenkinsfile,用于定义该分支的构建和部署流程。
  2. 自动触发流水线:当代码仓库中的分支发生变化(例如有新的提交或推送)时,插件可以自动触发对应分支的流水线构建,并执行定义在 Jenkinsfile 中的构建和部署步骤。
  3. 分支间的独立性:每个分支都有独立的流水线配置和执行环境,可以根据分支的特性和需求定义不同的构建逻辑和流程。
  4. 并行构建:插件支持并行地构建多个分支,从而提高构建的效率和并行处理能力。
  5. 分支状态管理:插件提供了对各个分支的状态管理和展示,可以方便地查看每个分支的构建历史、结果和报告。

通过使用 Pipeline Multibranch 插件,您可以在 Jenkins 中更好地管理和自动化构建多个代码仓库中的不同分支。无论是针对不同版本的软件、不同团队的代码库还是不同的开发分支,该插件都提供了一种灵活且高度可配置的方式来处理多分支的构建和部署需求。

image-20230507144213836

Blue ocean

Jenkins 的 Blue Ocean 插件是一个用于增强 Jenkins 可视化和用户体验的插件。它提供了一个现代化、直观和可视化的界面,用于管理和监控 Jenkins 的流水线和构建任务。

Blue Ocean 插件的主要作用包括:

  1. 流水线可视化:插件通过可视化的界面展示 Jenkins 流水线的结构、触发器、构建历史和结果。它使用图形化的方式呈现流水线的各个阶段、节点和关系,让用户更直观地了解和分析流水线的执行情况。
  2. 交互式流水线编辑:插件提供了一种交互式的方式来编辑和配置 Jenkins 流水线。通过拖拽和点击操作,用户可以直观地定义流水线的各个阶段、步骤和参数,而无需手动编写复杂的脚本。
  3. 即时反馈和日志:插件在流水线执行过程中提供实时的构建进度和日志输出。用户可以随时查看构建的状态、日志输出和错误信息,以便快速定位和解决问题。
  4. 分支和变更管理:插件可以展示多个分支的流水线执行情况,并对比各个分支之间的差异和变更。这有助于团队更好地跟踪和管理不同分支的构建状态和进展。
  5. 扩展性和插件集成:Blue Ocean 插件是基于 Jenkins 的可扩展插件系统构建的,它与其他 Jenkins 插件和扩展能够无缝集成,为用户提供更多功能和选项。

通过使用 Blue Ocean 插件,用户可以获得更直观、可视化和交互式的 Jenkins 使用体验,提高流水线的可管理性、可视化程度和用户友好性。这对于团队协作、问题定位和持续集成/持续交付的实践非常有帮助。

image-20230507144324554

Localization: Chinese (Simplified)

Jenkins 的 "Localization: Chinese Simplified" 插件是一个用于将 Jenkins 用户界面本地化为简体中文的插件。它将 Jenkins 的菜单、标签、按钮和消息等界面元素翻译为简体中文,方便中文用户更好地理解和使用 Jenkins。

该插件的主要作用包括:

  1. 界面本地化:将 Jenkins 的用户界面元素翻译为简体中文,使得中文用户可以更直观地理解和操作 Jenkins。这包括菜单、标签、按钮、对话框、错误消息等。
  2. 提升用户体验:对于非英语母语的用户,将 Jenkins 的界面语言切换为简体中文可以提高用户体验,降低使用的难度和学习成本。
  3. 增加可访问性:对于不熟悉英语或不擅长英语的用户,简体中文界面可以使他们更容易理解和使用 Jenkins,减少语言障碍对工作的影响。
  4. 全球化支持:Jenkins 是一个全球使用的开源工具,通过提供多语言支持,如简体中文,能够吸引更多的用户和开发者参与到 Jenkins 社区中。

通过安装并启用 "Localization: Chinese Simplified" 插件,您可以将 Jenkins 的界面语言切换为简体中文,从而提供更便利的用户体验和更好的适应性,使中文用户更加舒适地使用 Jenkins 进行持续集成和交付。

重启jenkins

https://jenkins.yuchaoit.cn/restart/

image-20230507145154982

定制jenkins镜像

由于每次新部署Jenkins环境,均需要安装很多必要的插件,因此考虑把插件提前做到镜像中

# dockerfile

FROM jenkins/jenkins:2.375.1-lts-jdk11
LABEL maintainer="yc_uuu@163.com"

ENV JENKINS_UC https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates
ENV JENKINS_UC_DOWNLOAD https://mirrors.tuna.tsinghua.edu.cn/jenkins
ENV JENKINS_OPTS="-Dhudson.model.UpdateCenter.updateCenterUrl=https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json"
ENV JENKINS_OPTS="-Djenkins.install.runSetupWizard=false"

## 用最新的插件列表文件替换默认插件文件
COPY plugins.txt /usr/share/jenkins/ref/

## 执行插件安装,最新版本玩法
RUN jenkins-plugin-cli -f /usr/share/jenkins/ref/plugins.txt

如何获取插件列表名

脚本

admin:admin!@jenkins.yuchaoit.cn需要替换成Jenkins的用户名、密码及访问地址

[root@k8s-master ~]#curl -sSL  "http://admin:www.yuchaoit.cn@jenkins.yuchaoit.cn/pluginManager/api/xml?depth=1&xpath=/*/*/shortName|/*/*/version&wrapper=plugins" | perl -pe 's/.*?<shortName>([\w-]+).*?<version>([^<]+)()(<\/\w+>)+/\1:\2\n/g'|sed 's/ /:/' > plugins.txt
[root@k8s-master ~]#vim plugins.txt 
[root@k8s-master ~]#
[root@k8s-master ~]#cat plugins.txt |wc -l
98
[root@k8s-master ~]#cat plugins.txt |tail -3
sse-gateway:1.26
blueocean-events:1.27.3
blueocean-pipeline-editor:1.27.3
[root@k8s-master ~]#

# 拿到关于汉化的一些插件
[root@k8s-master ~]#cat plugins.txt |grep local
localization-support:1.2
localization-zh-cn:1.0.24

定制新jenkins镜像

# 准备好,jenkins.yml  plugins.txt 
[root@docker01 ~]#docker build . -t 10.0.0.66:5000/jenkins:2.375.1-lts-jdk11-rc1 -f jenkins.yml


[root@docker01 ~]#docker images  |grep jenkins
10.0.0.66:5000/jenkins                2.375.1-lts-jdk11-rc1           5b3f723f2e74   About a minute ago   592MB
[root@docker01 ~]#

# 这个镜像就很方便你以后去用了,开箱即用
docker run -u root --rm -d -p 8080:8080 -p 50000:50000 -v jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock 10.0.0.66:5000/jenkins:2.375.1-lts-jdk11-rc1

image-20230508141648644

直接就内置了插件的jenkins镜像。

为什么要装插件

自由风格项目在某些情况下可能存在一些弊端,以下是其中几个常见的问题:

  1. 需要在Jenkins端维护大量配置:自由风格项目在配置上比较自由灵活,但这也导致了项目配置信息的分散和冗余。对于复杂的项目,可能需要在Jenkins端维护大量的配置项,包括构建步骤、触发器、参数等。这样的配置维护工作量较大,增加了出错的可能性,并且难以保持一致性。
  2. 没有版本控制:自由风格项目没有内置的版本控制功能,这意味着无法轻松地追踪和管理项目的配置变更。如果需要回滚到以前的配置或与团队成员共享配置,就会面临困难。缺乏版本控制也使得难以进行代码审查和审计。
  3. 可读性和可移植性差:由于自由风格项目的配置非常自由,可以编写任意的脚本和命令,导致配置文件变得冗长且难以阅读。这会增加项目的维护成本,并且使新成员难以理解项目的结构和逻辑。此外,由于配置是特定于Jenkins的,所以自由风格项目在不同的Jenkins实例之间迁移时可能会遇到问题,缺乏可移植性。
  4. 缺乏优雅性:自由风格项目通常是通过在Jenkins界面上手动配置各种构建步骤和参数来实现的。这种方式可能缺乏优雅性和可维护性。相比之下,采用声明性管道(Declarative Pipeline)或脚本化管道(Scripted Pipeline)等更现代的Jenkins流水线方式,可以提供更结构化、可读性更高的配置方式,使得流水线逻辑更加清晰和易于维护。

尽管自由风格项目存在一些弊端,但它们在某些情况下仍然是有用的,特别是对于简单的、自由形式的构建任务。然而,对于更复杂的项目和持续集成流程,使用Jenkins流水线可以提供更好的可维护性、可扩展性和可重复性。

Copyright © www.yuchaoit.cn 2025 all right reserved,powered by Gitbook作者:于超 2024-03-31 19:39:02

results matching ""

    No results matching ""