1. Jenkins 环境搭建
1.1 Jenkins 安装
1.1.1 从 Jenkins 官网 https://jenkins.io 下载安装包后,点击安装。
1.1.2 安装完成之后,Safari可能会自动打开,如果没有自动打开,打开浏览器,输入http://localhost:8080。
如果打开的不是下图的页面,也可以手动在浏览器中输入 http://localhost:8080。
打开 terminal 命令,获取初始密码:
$ sudo cat /Users/Shared/Jenkins/Home/secrets/initialAdminPassword
输入密码后,点击继续安装 Jenkins插件。
在创建用户界面中输入用户名、密码,用于 Jenkins登录。
提示:
如果页面出现了问题。可能是Java环境有问题,安装低一点的 jdk 版本即可。
1.2 安装插件
1.2.1 安装 Xcode integration 插件
依次选择系统管理->管理插件,在“可选插件”中选中“Xcode integration”安装。
1.2.2 安装 Keychains and Provisioning Profiles Management 插件
提示:
jenkins 的启动、关闭、重启管理,可以使用命令行完成:
java -jar jenkins.war --httpPort=8080 启动
localhost:8080/restart 重启
localhost:8080/exit 退出
localhost:8080/reload 重新加载
2. Jenkins 配置
2.1 系统设置
2.2 管理svn, git 的登录账号
3. 创建打包项目
前提:
(1)将 /Users/longhua/Library/MobileDevice 目录下的 Provisioning Profiles 复制到 /Users/Shared/Jenkins/Library/MobileDevice 目录下,直接拷贝MobileDevice文件夹就可以了;
(2)将 /Users/longhua/Library/Keychains 文件夹 复制到 /Users/Shared/Jenkins/Library 目录下;
说明:
要将工程的自动签名管理去掉,选择手动管理。进行手动 archive 。生成的 ExportOptions.plist 拷贝到 /Users/Shared/Jenkins/Home/workspace/MusicPlayer/build 目录下;
将 /Users/longhua/Library/MobileDevice/Provisioning\ Profiles 中对应的 .mobileprovision 文件 拷贝到 /Users/Shared/Jenkins/Library/MobileDevice/Provisioning\ Profiles 中;
点击“立即构建”,进行项目打包。
4. Jenkins 节点使用
4.1 SSH 登录管理
4.1.1 Slave 机器设置
记住后面的 ssh 登录地址。
4.1.2 Master 中生成 SSH密钥,将公钥拷贝到 Slave 机器的 authorized_keys 文件中
(1)Master 中生成 SSH密钥
//ssh密钥 默认保存在 .ssh 目录下,如果没有生成过就没有,查看Master机器是否有 SSH 密钥
$ open ~/.ssh
//如果没有就生成
$ ssh-keygen -t rsa -C “你的邮箱账号" -b 4096
#可以使用-t选项选择加密方式,包括 RSA 和 DSA 两种密钥
#例如:$ssh-keygen -t dsa 或者ssh-keygen -t rsa
#加密方式不同,key的名称不同,其他没有区别
#如果没有指定密钥,默认RSA
(2) 将公钥拷贝到 Slave 机器的 authorized_keys 文件中
// ssh 登录 Slave机器
$ ssh user@host
The authenticity of host 'host (12.18.429.21)' can't be established.
RSA key fingerprint is 98:2e:d7:e0:de:9f:ac:67:28:c2:42:2d:37:16:58:4d.
Are you sure you want to continue connecting (yes/no)?
这段话的意思是,无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?
Are you sure you want to continue connecting (yes/no)? yes
系统会出现一句提示,表示host主机已经得到认可。
输入密码登录。
当远程主机的公钥被接受以后,它就会被保存在文件$HOME/.ssh/known_hosts之中。下次再连接这台主机,系统就会认出它的公钥已经保存在本地了,从而跳过警告部分,直接提示输入密码。
// 拷贝 Master 的公钥 id_rsa.pub 到 Slave 机器的 authorized_keys 文件中,可以手动或通过shell命令。
$ ssh user@host 'mkdir -p .ssh && cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub
4.2 添加节点
4.2.1 Master 的 Credentials 中添加 SSH 账号
将 Master 中的 id_rsa 私钥拷贝到 Private Key 中。
4.2.2 新建节点
Master 的 Jenkins 中选择:“系统管理” 》“管理节点” 》“新建节点”,
4.3 项目测试
常见问题:
(1)启动 slave 节点时出现:
ERROR: Server rejected the 1 private key(s) for XXX (credentialId:21cdf000-1ffd-49d3-8984-e664cc3cf2cd/method:publickey)
[11/10/14 11:25:16] [SSH] Authentication failed.
hudson.AbortException: Authentication failed.
方案:
已经在 Slave 的 authorized_keys文件上添加了 Master 的 id_rsa.pub 公钥,连接时还是报错,
修改 slave 的 authorized_keys 文件权限。
$ chmod 755 ~/.ssh/authorized_keys
(2) 让节点执行 xcodebuild archive 时提示
InstallationBuildProductsLocation/Applications/dd.app: unknown error -1=ffffffffffffffff
Command /usr/bin/codesign failed with exit code 1
** ARCHIVE FAILED **
错误!
方案:
(1.1)登录 Slave 机器的 jenkins 用户,修改 authorized_keys 文件权限。
$ chmod 755 ~/.ssh/authorized_keys
(1.2)修改 Slave 机器的 keyAccess 访问权限
打开钥匙串访问,登录 》我的证书,选中相关的develop, release 证书,找到对应证书下面带钥匙的,点右键选择“显示简介”,选择“允许所有应用程序访问此项目”。
(1.3)Master 机器Jenkins程序中的job 工程的 shell 命令中的
login.keychain 的登录密码是 Slave 的;
5. 参数化构建
下面以svn管理的,混合开发项目为例说明。
说明:
build下需要的文件有:jenkins.sh, HBuilder-Hello-Info-release.plist, ExportOptions.plist(ExportOptions-release.plist)。
jenkins.sh:存放脚本命令
HBuilder-Hello-Info-release.plist:发布时使用的info.plist,里面有个推、分享、地图等key, password值
ExportOptions.plist:debug时使用
ExportOptions-release.plist:release时使用
工程 build的目录文件如下:
jenkins.sh脚本: