在MacOSX机器上设置JenkinsCI服务器
安装
首先,请避免安装Jenkins作为守护程序启动。
Jenkins Wiki提供了用于Jenkins安装的选项列表,但没有提及Mac OSX。尽管它提到了Docker,但我只听说过有关Docker的好消息。在本文中,我将坚持使用自制软件。在继续操作之前您需要在Mac上安装和配置JDK。
要安装,请运行一个简单的shell命令。
brew install jenkins
Jenkins将被安装到其中,usr/local
而Homebrew实际上会立即告诉您如何将其转变为启动代理。
To have launchd start jenkins at login:
ln -sfv /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents
Then to load jenkins now:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
这建议您将Jenkins启动代理plist文件符号链接到,~/Library/LaunchAgents
但我建议不要这样做。正如您将在接下来看到的,您将需要修改该文件。这意味着,如果您曾经通过Homebrew升级Jenkins,则您在plist中所做的所有更改都将丢失。我的建议是复制它而不是建立符号链接。
更重要的是,一旦通过Homebrew安装后,我便将Jenkins升级委托给Jenkins本身。因此,我固定Homebrew以防止Homebrew升级Jenkins文件。
brew pin jenkins
现在,您还可以手动控制Jenkins的安装,并且可以从命令行启动/停止它。
# Start.
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
# Stop.
launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
配置
要了解为什么需要更改plist,请尝试运行Jenkins服务器。尝试一下,创建几个构建项目,这些项目具有一些基础知识,例如签出git仓库和运行简单的build命令。很快您会收到一条错误消息,提示詹金斯(Jenkins)内存不足。这似乎是JVM和Mac OS X的常见问题,我不太确定为什么默认配置不能解决这个问题,可能这是Mac专用的,其他操作系统也可以。无论如何,您需要修改Launch Agent的默认plist文件。这是您需要的并且可能要更改的。
JVM虚拟内存和垃圾回收
- 告诉JVM使用64位数据模型(如果有)(
-d64
)。 - 使用
-Xms
和Xmx
标志设置最小和最大堆大小。512 Mb在大多数时间为我工作。 - 配置垃圾收集器,类卸载和永久空间。
<string> -d64 </ string>
<string> -Xms512m </ string>
<string> -Xmx512m </ string>
<!-使用并发GC->
<string> -XX:+ UseConcMarkSweepGC </ string>
<string> -XX:+ CMSClassUnloadingEnabled </ string>
<string> -XX:MaxPermSize = 256m </ string>
HTTP代理
迄今为止,最大的问题和挫折源是公司代理。使用-D
选项指定它。
<string>-Dhttp.proxyHost=my-company-proxy-host.com.au</string>
<string>-Dhttp.proxyPort=8080</string>
端口和前缀
在URL中带有自定义前缀的自定义端口上运行Jenkins。本示例使用默认8080
端口和/jenkins
前缀,因此您可以像http://yourhostname:8080/jenkins
或以往那样访问您的Jenkins仪表板http://youthostname/jenkins
。这些参数需要传递给jenkins.war
Homebrew安装到的参数/usr/local/opt/jenkins/libexec
。
<string>-jar</string>
<string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
<string>--httpListenAddress=127.0.0.1</string>
<string>--httpPort=8080</string>
<string>--prefix=/jenkins</string>
开机自启
如果计算机重新引导,请启用“RunAtLoad”选项以自动启动服务器。
<key>RunAtLoad</key>
<true/>
环境变量
如果此plist中的任何命令需要环境变量,这就是定义它们的方式。
<key>EnvironmentVariables</key>
<dict>
<key>HTTP_PROXY</key>
<string>http://my-company-proxy-host.com.au:8080</string>
</dict>
标准输出和误差
重定向标准输出和标准错误由您决定。虽然听起来是个好主意,但我建议不要将stderr重定向到文件中。我曾经不得不处理Bamboo远程代理在几个月后创建的90 Gb日志文件。
<!--
<key>StandardOutPath</key>
<string>/Users/i4niac/.jenkins/log/output.log</string>
-->
<key>StandardErrorPath</key>
<string>/Users/i4niac/.jenkins/log/error.log</string>
请注意,Jenkins将其文件放在.jenkins
用户主目录下的文件夹中。处理启动代理程序插件时,还必须指定完整路径。log
如果还没有文件夹,请创建它。
完整配置
现在放在一起。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>homebrew.mxcl.jenkins</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/java</string>
<string>-server</string>
<string>-d64</string>
<string>-Xms512m</string>
<string>-Xmx512m</string>
<string>-Dmail.smtp.starttls.enable=true</string>
<!-- Use Concurrent GC-->
<string>-XX:+UseConcMarkSweepGC</string>
<string>-XX:+CMSClassUnloadingEnabled</string>
<string>-XX:MaxPermSize=256m</string>
<string>-Djava.net.preferIPv4Stack=true</string>
<string>-Dhttp.proxyHost=my-company-proxy-host.com.au</string>
<string>-Dhttp.proxyPort=8080</string>
<string>-jar</string>
<string>/usr/local/opt/jenkins/libexec/jenkins.war</string>
<string>--httpListenAddress=127.0.0.1</string>
<string>--httpPort=8080</string>
<string>--prefix=/jenkins</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>EnvironmentVariables</key>
<dict>
<key>HTTP_PROXY</key>
<string>http://my-company-proxy-host.com.au:8080</string>
</dict>
</dict>
</plist>
现在,您有了运行24/7并执行稳定CI任务的可靠Jenkins服务器。
提示
要找出Jenkins的启动方式,请查看grep活动进程列表。ps aux | grep java
输出将告诉您所有您需要了解的内容。
jenkins 85 0.0 3.8 4633552 636852 ?? Ss Tue02pm 20:11.30
/usr/bin/java
-Dfile.encoding=UTF-8
-XX:PermSize=256m -XX:MaxPermSize=512m
-Xms512m -Xmx512m
-Djava.io.tmpdir=/Users/Shared/Jenkins/tmp
-Dhttps.proxyHost=my-company-proxy-host.com.au -Dhttps.proxyPort=8080
-Dhttp.proxyHost=my-company-proxy-host.com.au -Dhttp.proxyPort=8080
-jar /usr/local/opt/jenkins/libexec/jenkins.war
--prefix=/jenkins
--httpPort=8080
使用Homebrew安装,配置为启动代理。配置远非最终的。您将必须安装插件,为git存储库配置SSH密钥,并执行许多其他管理任务,以使您的Jenkins CI盒更快。
分享结束
关于作者
泽阳,DevOps领域实践者。专注于企业级DevOps运维开发技术实践分享,主要以新Linux运维技术、DevOps技术课程为主。丰富的一线实战经验,课程追求实用性获得多数学员认可。课程内容均来源于企业应用,在这里既学习技术又能获取热门技能,欢迎您的到来!
- 如果技术是一种生命
- ruby学习笔记(2)--类的基本使用
- 域名资讯:四声域名BHHS.com被BHHS公司收购
- ruby学习笔记(1)--初识语法
- 无法启用数据库中的 Service Broker,因为已存在启用的具有相同 ID 的 Service Broker。
- Centos7.2下针对LDAP的完整部署记录
- .NET Core 已经实现了PHP JIT,现在PHP是.NET上的一门开发语言
- 温故而知新:设计模式之适配器模式(Adapter)
- .NET Core RC2/RTM 明确了时间表
- kvm虚拟化关闭虚拟网卡virbr0的方法
- NET开发学习项目资源(2)
- Linux下selinux简单梳理
- 一段oracle中的“复杂”分组统计sql
- 通过Chocolatey软件包管理器安装.NET Core
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Get了!用Python制作数据预测集成工具 | 附代码
- 定时任务最简单的3种实现方法(超好用)
- Swift:UICollectionReusableView xib创建报错
- echo-高性能,可扩展,极简的Go Web框架
- 小程序文字显示换行
- css Backgroud-clip (文字颜色渐变)
- 微信小程序 buton清除默认样式
- 正则replace 回调函数里接收的参数是什么?
- 微信小程序使用pako.js的踩坑笔记
- Koa - 初体验(写个接口)
- Koa - 中间件(理解中间件、实现一个验证token中间件)
- Koa - 使用koa-multer上传文件(上传限制、错误处理)
- 原生js 复制内容到剪切板
- Vue - watch高阶用法
- 小程序如何支持使用 async/await (构建npm版)