
1. 配置较大的 -Xms -Xmx 参数
Jenkins 是由 Java 编写的编排引擎, 在 Full GC 时会 Stop The World(STW)。在大规模构建时, STW 可能会导致 Jenkins 无法处理新的请求。为了避免频繁的 STW, 同时增大并发量, 建议设置较大的堆,
-Xms3g -Xmx6g -XX:MaxRAM=6g
。具体数值可以根据监控值来设置, Java Full GC 之后, 内存占用会陡降。
2. request 不要设置太小
request 设置太小, 可能会导致 Jenkins 运行起来之后, 节点资源不足, 引发驱逐, 甚至压垮节点。request 应该接近真实值, 如果有足够的机器资源, 应该配置亲和性, 让 Jenkins 尽可能运行在单独的机器上。request >= 1.25
JVM 最大堆内存, limit >= 2 JVM 最大堆内存。
3. IO 性能不能差
Jenkins 使用磁盘文件存储数据, 每条流水线、每次构建都会占用一个文件目录, 产生大量文件。通常流水线数量有限, 但在构建历史达到 10000+ 级别时, 会感受到 IO 对 Jenkins 的影响。如果使用本地存储, 推荐使用高性能的 SSD。如果是使用网络存储, 需要高性能的网络支持, 同时加大客户端的缓存池。
4. 较大的 jenkins_home
的磁盘空间
磁盘满时, Jenkins 将不能工作, 在 Jenkins 后台会有错误提示。建议对 Jenkins 的工作目录进行磁盘使用率监控, 并配置告警规则。如果没有监控告警系统, 那么建议直接设置一个较大的磁盘空间给
/var/jenkins_home
目录。因为有一些 Storage Class 不支持动态扩容, 当磁盘满时, 就只能手动拷贝迁移了。
5. 使用 Kubernetes plugin 在 Kuberntes 上构建
基于物理机、虚拟机的构建, 增加了运维成本、限制了并发的数量。使用 Kubernetes plugin 插件在 Kubernetes 上进行构建能充分利用云原生易扩展、易维护的优势, 进行大规模的构建。参考:在 Kubernetes 上动态创建 Jenkins Slave 。由于构建比较占用资源, 为了避免对集群的影响, 可以配置亲和性, 将构建 Pod 集中到指定的节点执行。
6. 使用 CasC 管理 Jenkins 的配置
通过 Jenkins 页面进行各种构建、安全等配置, 不仅繁琐、不易维护, 而且不能够复用。使用 CasC 插件, 允许用户将 Jenkins 的配置, 通过文本的形式进行描述, 还可以放置到 Git 仓库中进行版本管理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
jenkins:
securityRealm:
ldap:
configurations:
- groupMembershipStrategy:
fromUserRecord:
attributeName: "memberOf"
inhibitInferRootDN: false
rootDN: "dc=acme,dc=org"
server: "ldaps://ldap.acme.org:1636"
nodes:
- permanent:
name: "static-agent"
remoteFS: "/home/jenkins"
launcher:
jnlp:
workDirSettings:
disabled: true
failIfWorkDirIsMissing: false
internalDir: "remoting"
workDirPath: "/tmp"
slaveAgentPort: 50000
agentProtocols:
- "jnlp2"
|
bundle:
groupId: com.dev
artifactId: "jenkins"
description: "Jenkins Custom With Package"
vendor: "Jenkins Project"
buildSettings:
docker:
base: jenkins/jenkins:2.277.4
tag: shaowenchen/jenkins:2.277.4
build: true
war:
groupId: org.jenkins-ci.main
artifactId: jenkins-war
source:
version: 2.277.4
plugins:
- groupId: io.jenkins
artifactId: configuration-as-code
source:
version: "1.47"
libPatches:
- groupId: "org.jenkins-ci.main"
artifactId: "remoting"
source:
git: https://github.com/jenkinsci/remoting.git
systemProperties: {
jenkins.model.Jenkins.slaveAgentPort: "50000",
jenkins.model.Jenkins.slaveAgentPortEnforce: "true"}
groovyHooks:
- type: "init"
id: "initScripts"
source:
dir: scripts
casc:
- id: "jcasc-config"
source:
dir: jenkins.yml
|
@Library('utils') import org.foo.Utilities
def utils = new Utilities(this)
node {
utils.mvn 'clean package'
}
|
相关推荐
本文为翻译文章,点击查看原文。 本文最初发表于2017年5月24日。 随着大量新平台和支持工具的出现,云原生势头正在增长。 这些新平台为开发人员提供了越来越多的功能 ,可以以自动化的方式快速开发,部署和管理大量微服务。 但这种云原生的势头的增长同样会伴随着成本的增加,最好做好为此付出代价的准备。 最近我写了一篇由Kubernetes等云原生平台提供的“为开发者准备的新的分布式原语”,以及这些原语如
Docker 核心技术与实现原理 Docker 核心技术与实现原理 Docker Docker 核心技术与实现原理一、为什么要学Docker? 二、Docker技术原理介绍 三、Docker 的基本概念 四、Docker 安装五、Docker 基础命令介绍 六、DockerFile 一、为什么要学Docker? 首先我们要说一下云平台 云计算包括三个层次的服务:基础架构即服务IaaS,平台即服务P
作者:周文浩,青云科技研发工程师,KubeSphere Maintainer。热爱云原生,热爱开源,目前负责KubeSphere 权限控制的开发与维护。 KubeSphere 3.3.1 已经发布一个多月了。 3.3.1 版本对于 KubeSphere 来说只是一个小的 Patch 版本,但是权限控制模块改动较大。这篇文章将从开发者的视角为你分享权限控制模块的改动内容。 这次的改动的主要目的是提升
本文为翻译文章,点击查看原文。 在微服务领域,分布式跟踪正逐渐成为调试和跟踪应用程序最重要的依赖工具。 最近的聚会和会议上,我发现很多人对分布式跟踪的工作原理很感兴趣,但同时对于分布式跟踪如何与Istio和Aspen Mesh等服务网格进行配合使用存在较大的困惑。特别地,我经常被问及以下问题: Tracing如何与Istio一起使用?在Span中收集和报告哪些信息? 是否必须更改应用程序才能从Is
【编者的话】 本文通过研究Docker Hub和docker-registry的架构,介绍了在服务端Docker镜像的存储、管理、安全的架构设计,并给出了一次简单的Docker客户端服务端交互的过程。对于部署实现一个大规模、企业级的镜像库需要做的工作做了初步的探讨,汇总了需要准备的前期知识等。推荐想要搭建一个私有Docker镜像库的同学阅读。 需求 最近因为工作需要,我开始研究docker-reg
回到顶部