【iOS】Jenkins Gitlab持续集成打包平台搭建
Jenkins Gitlab持续集成打包平台搭建
SkySeraph July. 18th 2016
Email:skyseraph00@163.com
更多精彩请直接访问SkySeraph个人站点:www.skyseraph.com
1. 相关概念
Jenkins
Gitlab
- GitLab是一个利用Ruby on Rails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目,更多介绍参考维基介绍.
持续集成
- 持续集成, 简称CI(continuous integration).
- CI作为敏捷开发重要的一步,其目的在于让产品快速迭代的同时,尽可能保持高质量.
- CI一种可以增加项目可见性,降低项目失败风险的开发实践。其每一次代码更新,都要通过自动化测试来检测代码和功能的正确性,只有通过自动测试的代码才能进行后续的交付和部署.
- CI 是团队成员间(产研测)更好地协调工作,更好的适应敏捷迭代开发,自动完成减少人工干预,保证每个时间点上团队成员提交的代码都能成功集成的,可以很好的用于对Android/iOS项目的打包.
蒲公英
- 蒲公英(pgyer)为移动开发者提供App免费测试分发应用的服务平台,支持iOS与Android,简单两步分发应用。类似的还有fir.im等.
2. 流程结构
简单绘制了下Jenkins的一个流程,如下图:
IBM Developer上也有一个看似更复杂一点的图,如下图
持续交互流程图:
3.平台搭建
Jenkins安装和启动
官网: https://jenkins.io/index.html
下载: http://mirrors.jenkins-ci.org/war/latest/jenkins.war
安装:
- 依赖于Java环境,首先安装和配置Java环境
- 到官网下载Jenkins,双击安装,如果是Mac电脑,会自动生成全局变量jenkins
- 修改参数: jenkins + 相关参数,如
jenkins –httpPort=8888 #更换端口号,当默认端口8080被占用,或指定特定端口时。
启动
- 手动启动: java -jar jenkins.war
- 后台启动(默认端口): nohup java -jar jenkins.war &
- 后台启动(指定端口): nohup java -jar jenkins.war -httpPort=88 &
- 后台启动(HTTPS): nohup java -jar jenkins.war -httpsPort=88 &
- 浏览:http://localhost:8080/ , localhost可配置
Jenkins插件安装
插件安装
操作: Manage Jenkins -> Manage Plugins -> Available -> Search -> Click to install,如下图所示
实用插件
- iOS专用:Xcode integration
- Android专用:Gradle plugin
- Gitlab插件:GitLab Plugin 和 Gitlab Hook Plugin
- Git插件: Git plugin
- GitBuckit插件: GitBuckit plugin
- 签名证书管理插件: Credentials Plugin 和Keychains and Provisioning Profiles Management
- FTP插件: Publish over FTP
- 脚本插件: Post-Build Script Plug-in
- 修改Build名称/描述(二维码): build-name-setter / description setter plugin
- 获取仓库提交的commit log: Git Changelog Plugin
- 自定义全局变量: Environment Injector Plugin
- 自定义邮件插件: Email Extension Plugin
- 获取当前登录用户信息: build-user-vars-plugin
- 显示代码测试覆盖率报表: Cobertura Plugin
- 来展示生成的单元测试报表,支持一切单测框架,如junit、nosetests等: Junit Plugin
- 其它: GIT plugin / SSH Credentials Plugin
Jenkins系统设置
操作: Manage Jenkins -> Configure System
- Jenkins内部shell UTF-8 编码设置,如下图所示
- Jenkins Location和Email设置,如下图所示
- E-mail Notification,设置如下如所示
Jenkis系统设置3
SMTP详细配置请参考 How to send Email at every build with Jenkins
Jenkins Jobs配置
Jobs基础配置
配置编译参数
例如,如果需要打包者自行选择打包类型,如需要编译Release/Debug/Test等不同版本的包,那需要配置Jobs的编译参数,配置方法如下图所示:
Jenkins编译设置-参数设置2
你还可以配置一些其它参数,例如:
Jenkins编译设置-参数设置3
配置完后,build界面中就会出现,如下如所示:
Jenkins编译设置-参数设置1
How to configure a single Jenkins job to make the release process from trunk or branches?
配置匿名用户权限
后面打包的应用发布时,如果懒得自己搭建服务器,就用Jenkins的,但发布出去的链接需要登录才能访问,这时候你可以设置匿名用户的访问权限,这样匿名用户可以下载访问你提供的应用链接了,非常取巧的方法,如下图:
Jenkins编译设置-参数设置4.png
Jobs源码库配置(Gitlab为例)
配置SSH
操作: Manage Jenkins -> Credentials -> Global credentials (unrestricted) -> Add Credentials
- 本机生成SSH:ssh-keygen -t rsa -C “Your email” , 生成过程中需设置密码,最终生成id_rsa和id_rsa.pub(公钥)
- 本机添加秘钥到SSH:ssh-add 文件名(需输入管理密码)
- Gitlab上添加公钥:复制id_rsa.pub里面的公钥添加到Gitlab
- Jenkins上配置密钥到SSH:复制id_rsa.pub里面的公钥添加到Jenkins(private key选项)
新建Job
在Jenkins中,所有的任务都是以”Job”为单位的。在进行操作前,你需要新建一个Job,Job新建比较简单,只需要在Jenkins管理的首页左侧,点击“New Job”,一般选择free-style software project,再输入Job的名字即可。
配置Gitlab
在新建的任务(Jobs)中,Gitlab源码配置如下图:需要输入git仓库和build分支,公钥使用上面配置SSH生成的公钥。
Jobs触发条件配置
Jenkins支持多种触发器配置,包括:
定期进行构建(Build periodically),定时器使用示例如下:
H(25-30) 18 1-5: 工作日下午6点25到30分之间进行build
H 23 1-5:工作日每晚23:00至23:59之间的某一时刻进行build
H(0-29)/15 :前半小时内每隔15分钟进行build(开始时间不确定)
H/20 :每隔20分钟进行build(开始时间不确定)根据提交进行构建(Build when a change is pushed to GitHub)
- 定期检测代码更新,如有更新则进行构建(Poll SCM)
Jobs构建方式/编译 配置
Jenkins支持多种编译配置方式,包括:
- Xcode: iOS编译配置(安装Xcode integration插件)
- Invoke Gradle script: Android编译配置(安装Gradle plugin插件)
- Exceute Shell: 脚本方式
对于iOS应用的构建,如果选择Xcode方式构建,需要配置好开发者证书,具体参考后面签名和整数问题。
推荐使用Exceute Shell方式,简单有效。
Jobs构建后处理
Artifacts和邮件通知配置,参考下图
Jenkins项目设置-Archive-min
可借助Email Extension Plugin 插件进行详细配置,具体可参考此文
Jenkins项目设置-邮件-min
发布
- FTP服务器, 最传统的方式,可助蒲公英或者fir.im(安装对应的Jenkins插件)。
- 专业的Artifacts存储仓库, 比如Nexus, Artifactory等。
- 对象存储服务:比如阿里云OSS,AWS S3等,以阿里云为例,具体请参考此文 在Jenkins持续集成方案中使用阿里云OSS作为Artifacts仓库
iOS的发布可能希望用到OTA,可参考此文
这里分享一个我写的shell脚本模板(已开源),可以用于iOS的plist文件自动创建以及OTA简单发布页面的自动创建,参考此链接获取源码, 欢迎Star.
自动生成一个简单HTML界面,如下图,点击Install即可安装:
Jenkis发布1
注意,这里iOS7.1以后限定必须要要用https,所以需要对jenkins设置下https,参考下面”后记” 中的Jenkins Https设置
Last Show
构建成功后最终的结果如下如所示:
4. 后记
签名和证书问题(iOS)
Jenkins Https Support
查询Jenkins Https相关命令:
java -jar jenkins.war –help | grep -i https
说明:下面以Mac为例.
KeyStore方式
- 生成: keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass 密码 -dname “cn=WEB”
- 使用: java -jar jenkins.war –httpPort=-1 –httpsPort=8080 –httpsKeyStore=/目录/keystore.jks –httpsKeyStorePassword=密码。
- 注意: 第一次使用时需要将”WEB”证书导入,导入步骤为:Chrome导出证书 -> 安装证书 -> 设置证书”全部允许”, 图解步骤可参考下面实用参考中的第5篇文章.
Certificate方式
- 生成:
- openssl genrsa -out server.key 1024
- openssl req -new -key server.key -out server.csr
- openssl x509 -req -in server.csr -signkey server.key -out server.crt
- 使用:java -jar jenkins.war –httpsPort=8088 –httpsCertificate=/path/server.crt –httpsPrivateKey=/path/server.key
- 注意:①同上 ②iOS手机需要导入cer证书
实用参考
- Starting and Accessing Jenkins 官网说明
- Jenkins: Switch to SSL/ HTTPS mode 支持HTTPS的两种方式
- Installing and Configuring Jenkins KeyStore方式
- Generating a self-signed SSL certificate using the Java keytool command (2004193)KeyStore方式
- Setup Self-Signed Certificates & Trusting them on OS X Certificate方式
- 免费openssl生成ssl证书 Certificate方式
5. Refs
- Using Jenkins
- Building a software project
- Auto build and deploy iOS apps using Jenkins
- Continuous Integration for iOS with Jenkins
- GitLab Documentation
- Setup Jenkins + TestFlight for iOS apps
- Installing Jenkins on OS X Yosemite
- 基于 Jenkins 快速搭建持续集成环境
- Jenkins入门
- jenkins中集成OTA发布
文章有更新, 请移步查看.
========
By SkySeraph-2016
【iOS】Jenkins Gitlab持续集成打包平台搭建的更多相关文章
- Jenkins Gitlab持续集成打包平台搭建
http://www.cnblogs.com/skyseraph/p/5695021.html 1. 相关概念 Jenkins Jenkins,一个用Java编写的开源的持续集成工具,提供了软件开发的 ...
- 使用 Jenkins 搭建 iOS/Android 持续集成打包平台【转】
背景描述 根据项目需求,现要在团队内部搭建一个统一的打包平台,实现对iOS和Android项目的打包.而且为了方便团队内部的测试包分发,希望在打包完成后能生成一个二维码,体验用户(产品.运营.测试等人 ...
- Hudson持续集成管理平台搭建
IP: 10.0.70.106 8G 内存 (Hudson 多 个 工程 在 同 时 构建 的情况下 比 较耗内存) 环 境: CentOS 6.5 . JDK7 注:Hudson 只是一个持续集成 ...
- 【转】持续集成 Sonar 平台搭建及 Sonar 自定义规则打包部署篇
引言 基于阿里开发手册的sonar自定义插件工程 开源地址: https://github.com/tigerge000/sonar-java-custom-rules.git由于最近来问童鞋,就算写 ...
- jenkins(8): 实战jenkins+gitlab持续集成发布php项目(代码不需要编译)
一. jenkins 的配置 1.前提条件安装了GitLab Plugin (源码管理使用),GitLab Hook(gitlab webhook需要) Manage Jenkins--->Ma ...
- jenkins+Gitlab持续集成环境配置教程
环境简介: Jenkins 2.156(本地win10) GitLab Enterprise Edition 10.1.4-ee (远程服务器) Apache Ant 1.9.13 (本地win10) ...
- Jenkins+GitLab持续集成
向GitLab提交代码之后自动触发Jenkins构建 https://baijiahao.baidu.com/s?id=1630678692475452408&wfr=spider&f ...
- ARTS-S gitlab与jenkins实现持续集成
jenkins配制 系统管理->管理插件->可选插件->选择安装 Gitlab Hook Plugin和Build Authorization Token Root Plugin插件 ...
- jmeter --- 搭建持续集成接口测试平台(Jenkins+Ant+Jmeter)
jmeter --- 搭建持续集成接口测试平台(Jenkins+Ant+Jmeter) 一.环境准备: 1.JDK:http://www.oracle.com/technetwork/java/jav ...
随机推荐
- 一键批量添加材质的法线贴图-unity插件
有时候材质做完后需要更改贴图,或者增加贴图,数量少的时候可以一张张添加和修改,数量多的时候就只能代码生成了.原理是通过名字的关联:主贴图和法线贴图大多数只是后缀的不同上,如果不是那是美术规范没做好啊, ...
- Java学习笔记14---使用标志位控制循环
使用标志位控制循环 前面提到了控制循环的常用技术:计数器控制的循环.另一种控制循环的常用技术是在读取和处理一个集合的值时指派一个特殊值.这个特殊的输入值也成为标志值(sentinel value),用 ...
- thinkphp vendor
vendor('weixin.request'); 对应文件:Core\Library\Vendor\weixin\request.php import('weixin.request#class') ...
- Django基础,Day8 - 管理后台定制显示
自定义admin表单 展示效果一: from django.contrib import admin from polls.models import Question class QuestionA ...
- php扩展memcached和memcache的安装配置方法:转载
本文转载:http://www.jb51.net/article/56999.htm php连接memcached缓存服务器的客户端有两个,一个是memcache是比较底层的开发库,memcached ...
- 2. web前端开发分享-css,js进阶篇
一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无从下手 ...
- JavaMail: SSL vs TLS vs STARTTLS
SSL vs TLS vs STARTTLS There's often quite a bit of confusion around the different terms SSL, TLS an ...
- 在布局中使用android.support.v4.app.Fragment的注意事项
1.Activity必须继承android.support.v4.app.FragmentActivity 2.fragment标签的name属性必须是完全限定包名,如下: <LinearLay ...
- 让用VS2013编写的程序在XP中顺利运行
vs2013编译好的exe文件拖到虚拟机xp中无法运行,提示错误,从网上搜索.找答案. 参考:http://blog.csdn.net/asanscape/article/details/387526 ...
- python基础八
面向对象的好处 更容易扩展.提高代码使用效率,使你的代码组织性更强, 更清晰,更适合复杂项目的开发 封装 把功能的实现细节封装起来,只暴露调用接口 继承 多态 接口的继承 定义 类 ===> ...