二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Nexus系列文章

  • Jenkins系列文章

    • Jenkins入门系列笔记汇总整理
    • 前言与介绍
    • Jenkins初始部署与简单配置
    • Jenkins各配置选项介绍
    • Jenkins中一个项目的构建
    • Jenkins配置项目构建的钉钉通知
    • Jenkins忘记管理员密码怎么办
    • Jenkins与gitlab的交互探微
    • Jenkins根目录详解
    • Jenkins插件之显示构建时间
    • Jenkins插件之批量修改配置
    • Jenkins配置简单构建邮件推送
    • Jenkins复杂邮件推送配置详解
    • Jenkins配置复杂构建邮件推送
    • Jenkins构建安卓项目之前的一些唠叨
    • Jenkins构建安卓项目配置
    • Jenkins与Gitlab分支的交互
    • Jenkins构建nodejs项目
    • 使用docker部署Jenkins及初始配置
    • 配置gitlab提交代码Jenkins自动构建
    • Jenkins回滚方案探微
    • Jenkins角色控制(小黄锁)探微
    • Jenkins构建的应用配置问题解决探微
    • Jenkins构建中tag的应用
    • Jenkins插件之Ansicolor(神器)
    • 最基础核心的Jenkins功能部署一个java应用
    • Jenkins+sonar构建代码扫描
    • Jenkins+docker+gitlab将应用部署到docker
    • Jenkins参数化构建犀利插件Active-Choices-Plugin
    • 记一次将代码中参数外显到构建历史中的操作
    • Jenkins升级与迁移的经验分享
    • pipeline笔记之从一个简单的项目构建开始
    • Jenkinsfile声明式语法详解
    • 自动构建的原始配置以及pipeline中的用法
    • 多分支构建的实践与思考
    • 使用Jenkinsfile类前端项目的部署与回滚
    • 如何在Jenkinsfile中定义一个全局的时间戳变量
    • Jenkins中自由风格回滚方案的最佳实践
    • Jenkins中pipeline风格回滚方案的最佳实践
    • pipeline结合ansible剧本进行批量的部署与回滚配置
    • 最近配置安卓iOS打包本地化流程中一些值得记录的内容
    • pipeline中如何在environment环节声明一个含有通配符的变量
    • git-Parameter插件在pipeline共享库中的实践详解
    • jenkins作为ci检测代码是否合并的实践
    • 将Jenkins共享库的Jenkinsfile放到ci静态检测的实践
    • Jenkins的pipeline实践之GitSCM参数配置项详解
    • Jenkins中pipeline对接CMDB接口获取主机列表的发布实践
    • Jenkins有任务无法kill提示即将关闭
    • Jenkins基于Share Library共享库的最佳实践探索
    • Jenkins结合MySql Database插件的平台化实践思路
    • Jenkins-Groovy中三元表达式的用法
    • Jenkins-Groovy中Switch的高阶用法
    • Jenkins-pipeline之利用activity choice插件对接查询MySQL数据实现动态参数化的功能
    • CentOS通过yum快速安装Jenkins
    • Jenkins-pipeline语法之错误处理详解(文末有干货)
    • Jenkins常用插件汇总以及简单介绍
    • Jenkins所遇报错汇总及解决
    • Jenkins管理维护运维规范
      • 1,版本约束
      • 2,Jenkins 自身规范
        • 0,主机配置
        • 1,如果扩容
        • 2,JENKINS_HOME
        • 3,WORKSPACE
        • 4,编译缓存目录
        • 5,备份方面
      • 3,其他约定
        • 1,版本目录
        • 2,剧本目录
        • 3,共享库
        • 4,风格约定
        • 5,项目命名约定
        • 6,授权方面
      • 4,Jenkinsfile 编写约定
        • 1,变量
        • 2,stage 与标签命名
        • 3,镜像风格定义
      • 5,维护以及使用
  • ELK笔记

  • Kubernetes笔记

  • LLM专题

  • 系列专题
  • Jenkins系列文章
二丫讲梵
2022-05-03
目录

Jenkins管理维护运维规范

文章发布较早,内容可能过时,阅读注意甄别。

规范,乃运维效率之本,没有统一的规范,也就意味着到处都是乱麻,工作当中,没有什么比一团乱麻更糟糕的了。

本文将分享过往运维实践中总结积累下来的约定规范,大多数内容都具有普适意义,欢迎大家再加补充与交流!

# 1,版本约束

软件的不同版本,或者插件的不同版本,在使用起来都有可能带来不可预知的影响,因此需要统一整理,固定下来,不允许轻易变更。

  • 软件版本
    • JDK:1.8.0_121
    • Tomcat:8
    • Maven:3.3.9
    • Jenkins:2.249.1
  • 插件 一些插件非常重要,在某些版本中未必好用,比如用户权限控制插件,因此我们验证了当前好用的版本之后,赶忙打了镜像,以备扩容的时候可以用。
    • LDAP:1.24
    • Role-based Authorization Strategy:2.10 注意此插件绝不可擅自升级
    • Git:4.4.1
    • Git Parameter:0.9.13

注意:插件的安装或升级在运维团队需严格管控,管理员安装插件时,务必与组内同步,先做评估,经过测验,再行安装或升级。因为一些插件的升级可能带来未知问题与影响。

# 2,Jenkins 自身规范

# 0,主机配置

  • 配置:在越大越好的前提下,最好不低于8C16G,建议16C32G,注意优化 Tomcat。
  • 存储:建议100G系统盘+1T数据盘。盘的规格越高越好。最低SSD,其中数据盘可酌情加,数据盘一定要用所能提供的最高规格的盘,这是保障 Jenkins 使用体验的最核心。
  • 其他:其他没有什么注意点,按照一般主机配置初始化即可。

# 1,如果扩容

Jenkins 新增 slave 不要单独从头部署,应从原 slave 主机打镜像,然后进行新增扩容,只需要调整 agent 脚本启动即可注册,agent 通过 docker 维护。

# 2,JENKINS_HOME

需要注意,我们的JENKINS_HOME统一在:

$ tail -n1 /etc/profile
export JENKINS_HOME=/data/.jenkins
1
2

严禁非此标准的情况。

# 3,WORKSPACE

需要注意,我们的 WORKSPACE 统一在:

$ grep workspaceDir /data/.jenkins/config.xml
  <workspaceDir>${ITEM_ROOTDIR}/workspace</workspaceDir>
1
2

严禁非此标准的情况。

# 4,编译缓存目录

因为根目录磁盘并不大,所以要修改缓存目录到数据目录中,缓存目录统一存放在/data/.cache 目录之下,下一层目录以语言栈为标识。

如下列举了常见语言编译过程中缓存目录的设置方法。

  • maven

    vim /usr/local/maven/conf/settings.xml
    
    # 修改
    <localRepository>/data/.cache/java/.m2/repository</localRepository>
    
    1
    2
    3
    4
  • node

    $ npm config get cache
    /root/.npm
    
    # 设置 npm 全局包下载路径
    $ npm config set prefix "/data/.cache/node/node_global"
    
    # 设置 npm 缓存路径
    $ npm config set cache "/data/.cache/node/node_cache"
    
    1
    2
    3
    4
    5
    6
    7
    8
  • pip

    $ cat ~/.config/pip/pip.conf
    [global]
    cache-dir = /data/.cache/pip
    
    1
    2
    3
  • go

    export GOPATH=/data/go
    export GOCACHE=/data/.cache/go-build
    
    1
    2

# 5,备份方面

理论上,当我们整体面向 git 管理 Jenkins 源文件之后,其实已经不需要对 Jenkins 进行什么备份,即便是完全宕机无法恢复,也能够依赖 git 所存有的项目引导文件对项目进行恢复。

不过,我们还是最好使用thinBackup对一些基础元数据进行备份即可。

# 3,其他约定

构建过程中,我们会依赖一些公共组件,或者共享库,这些内容都应该使用统一的目录或者仓库,从而便于统一维护与管理。在说具体约定之前,首先说一个前置约定,亦即所有第三方需要统一固定的目录,都应该在 /data/.jenkins/other之下。

# 1,版本目录

要实现回滚,有赖于本地版本目录,此目录我们统一约定在:

$ ls /jenkins_sync/version/
1

注意:此处的 /jenkins_sync目录是一个nfs(也可以直接使用云产品的 nfs)挂载在各个 node 节点的目录,类似 version 之类的内容,都可以放到这个目录之内。

# 2,剧本目录

剧本是项目在发布过程中使用的 ansible 剧本等内容。

关于命名,我们约定如下规范:

  • 仓库:https://gitlab.eryajf.net/jenkins/deploy-playbook.git
  • 命名规范:ansible-{语言栈}

关于使用,我们约定如下规范:

  • 我们约定一切剧本的更改都需要同步到 git 仓库中,可以创建一个自动推送 job,提交之后自动将此项目同步到 Jenkins 主机上来。
  • 正式启用之后,严禁直接修改 master 提交,必须经过其他分支测试验证过之后才能合并到 master,因为这是核心,牵一发而动全身。
  • 每次运行构建的时候,都会有一个 stage 单独拉取 playbook,剧本的暂存目录为:${WORKSPACE}/ansible_tmp。

# 3,共享库

共享库是为我们将项目模板提取出来之后提供的一种高效率方案。

关于命名,我们约定如下规范:

  • 仓库:https://gitlab.eryajf.net/jenkins/shared-library.git
  • 命名规范:尽量做到见名知意。

关于使用,我们约定如下规范:

  • 项目非特殊不得绕开共享库单独配置 pipeline,部分项目采用流水线外置到仓库中,并通过目录进行分类,这种策略虽然将 jenkinsfile 版本控制了,但是并不利于以后模板化的方向,因此不推荐过度使用这种方案。
  • 正式启用之后,严禁直接修改 master 提交,必须经过其他分支测试验证过之后才能合并到 master,因为这是核心,牵一发而动全身。如有变更,最好做到二人 check。
  • 现在已经将共享库的内容接入到了 ci 测试,普通的语法错误都能够检测出来,从而无法合并到主分支。
  • 共享库作为抽象出来的构建模板,不能够毫无节制地添加模板,而应该更多去思考如何在原有共享库中做到更优的兼容,过多地模板对维护来说,将会是灾难。
  • 共享库模板中的内容固然可以进行再次声明函数进行抽离,但是我并不建议这么做,过多地调用性抽离,会让一个模板的流程逻辑复杂化,反而会给后期的应用以及维护带来更多的认知成本,这是不划算的。

# 4,风格约定

我们约定统一的 pipeline 风格为 声明式,声明式是固定语法,接近原生 shell 的使用方式,对运维也更加友好。事实上这不仅仅是风格统一的问题,还可以做到研究成果共享。

# 5,项目命名约定

项目命名规范,决定了权限配置的便利以及可用。项目命名原则上与 gitlab 仓库中项目命名保持一致,然后在前边添加环境作为区隔,如果项目名为 admin,那么不同环境的命名应该为:

  • test-admin
  • pre-admin
  • prod-admin

如果一个项目仓库将会部署多个子项目,那么命名风格应该保持队形:

  • test-admin-(a/b/c)

以此类推。

# 6,授权方面

首先人员通过对接 openLDAP 进行同步,配置方式参考:openLDAP 集成# Zabbix,Jenkins,GitLab,JumpServer,Harbor,Nginx 实战 (opens new window)。

授权统一使用 openLDAP 用户分组绑定 Jenkins 权限角色的方式进行,不再通过个人绑定角色。

  • 测试环境发布权限要求 w3 以上。
  • 灰度环境发布权限要求 w4 以上。
  • 正式环境发布权限要求 w5 以上。

一个业务通常分三组角色对应三个环境的应用,同理也要在 openLDAP 创建三个分组,将分组绑定到角色上,而后的维护则在运维平台上只需要将人员加入到分组即可。

# 4,Jenkinsfile 编写约定

# 1,变量

准确简洁的变量名是可读性及易维护性的重要保障,针对脚本的变量名应当至少遵循以下规范:

  1. 自定义环境变量命名约定:统一采用大写单词与下划线拼接方式命名,自定义变量必须要有备注。

  2. 变量名必须有实际含义, 避免英文下划线以外的特殊字符。

  3. 避免变量名过短(数据或对象内容复杂而变量名无法推断其含义)与过长(变量名接近甚至超过半行造成视觉阅读困难)。

  4. 变量名尽量避开 groovy 语言自身关键字,避开环境变量。

  5. 无特殊需求,避免修改流水线默认生成的环境变量。

  6. 不允许出现后置流程引用未落位的变量,否则容易造成不熟悉者的维护障碍。

  7. 在固定的拼接处理中, 应尽量减少定义语句使用的嵌套层数,例如:

    // 套娃式定义
    def pathA = "path1"
    def paraZ = "${pathA}/path2"
    def paraB = "${pathZ}/path3"
    def paraY = "${pathB}/path4"
    def paraX = "${pathY}/path5"
    
    // 展开嵌套, 具有更好的可读性
    def paraX = "path1/path2/path3/path4/path5"
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

# 2,stage 与标签命名

stage 定义了每个节点的任务内容,应该使用简洁清晰的文字对该阶段任务进行注释。名字不能超过 7 个字,失败原因也要做到简单清晰。

# 3,镜像风格定义

命名规则如下:

				             server_name	 commit     date     build_id
harbor.eryajf.net/multienv/eryajf-back-admin:16c525_20201013114449_10
1
2

在实际使用中变量定义为:

BASE_IMAGE_NAME = "harbor.eryajf.net/multienv/${SERVICE_NAME}"

env.IMAGE_NAME  = sh(script: "echo ${BASE_IMAGE_NAME}:" + "${COMMIT_ID}_" + "`date '+%Y%m%d%H%M%S'`" + "_${BUILD_ID}", returnStdout: true).trim() //构建版本号
1
2
3

我们并不吝惜利用所有该当利用的变量来组建项目镜像的 tag,这是出于大量实际运维经验而言,我们希望在不影响构建稳定的情况,尽可能地提供出有利于我们快速定位的信息,这将在无数次后续问题排查中,一一受益!

注意:最开始这里把分支也加入到了版本当中,但是后来的实践当中发现,分支可能会是 feature/gocover,这种分支在镜像 tag 当中就会报错,所以废弃掉了!

# 5,维护以及使用

  1. 插件的安装或升级需严格管控,管理员安装插件时,务必与组内同步,先做评估,经过测验,再行安装或升级。因为一些插件的升级可能带来未知问题与影响。
  2. 流水线尽量使用一种语法,比如声明式,这样以后大家各自研究的成果可以直接共享,便于一起迭代前进。
  3. 尽可能将单个流水线的主逻辑放在更少的地方,这样对于后期的维护以及变更绝对是更加高效且省力的,不要一个流水线七零八落调用了五六个地方,非常不利于快速预览与定位。当然,一些非重要的公共逻辑,可以放在约定好的固定地方统一调用,比如通知脚本,回滚用的库,共享库等。
  4. 构建过程中所用工具,一定要版本统一,不给自己留坑,比如 mvn,go,node 等。
  5. 根据标准化的流水线,需要输出对研发的接入标准,让所有的研发项目/框架都来适配我们运维的标准,严禁接入非标的项目,除非走研发经理特批,运维需要严防这条线。
  6. 运维自己的流水线迭代更新也需要走正规的开发流程,调试环境和正式使用环境分开,代码合并的时候也需要互相 review。
  7. master 节点不允许运行任务,只作为调度节点。
  8. 不允许变更虚拟机的环境,不允许随意在虚拟机安装软件,如果构建过程有环境依赖,则必须将环境依赖注入到容器中,通过 docker 进行构建。
  9. 一起向追求四个现代化看齐,即规范化,标准化,高效化,优雅化。
微信 支付宝
#Jenkins
上次更新: 2025/03/06, 21:25:58
Jenkins所遇报错汇总及解决
elk基础环境安装

← Jenkins所遇报错汇总及解决 elk基础环境安装→

最近更新
01
睡着的人不关灯
06-12
02
学习周刊-总第215期-2025年第24周
06-12
03
学习周刊-总第214期-2025年第23周
06-05
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式