Jenkins Gitlab持续集成打包平台搭建

2019 年 6 月 27 日 DevOps时代

Jenkins

  • Jenkins,一个用Java编写的开源的持续集成工具,提供了软件开发的持续集成服务,可监控并触发持续重复的工作,具有开源,支持多平台和插件扩展,安装简单,界面化管理等特点。更多介绍参考维基介绍。

Gitlab

  • GitLab是一个利用Ruby on Rails开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目,更多介绍参考维基介绍。

持续集成

  • 持续集成, 简称CI(continuous integration).

  • CI作为敏捷开发重要的一步,其目的在于让产品快速迭代的同时,尽可能保持高质量.

  • CI一种可以增加项目可见性,降低项目失败风险的开发实践。其每一次代码更新,都要通过自动化测试来检测代码和功能的正确性,只有通过自动测试的代码才能进行后续的交付和部署.

  • CI 是团队成员间(产研测)更好地协调工作,更好的适应敏捷迭代开发,自动完成减少人工干预,保证每个时间点上团队成员提交的代码都能成功集成的,可以很好的用于对Android/iOS项目的打包。

OTA

OTA(Over-the-Air Technology)空中下载技术,具体参考此文介绍。

蒲公英

蒲公英(pgyer)为移动开发者提供App免费测试分发应用的服务平台,支持iOS与Android,简单两步分发应用。类似的还有fir.im等.

流程结构

简单绘制了下Jenkins的一个流程,如下图:

IBM Developer上也有一个看似更复杂一点的图,如下图:

持续交互流程图:

Jenkins安装和启动

安装:

  • 依赖于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,设置如下如所示

Jenkins Jobs配置

Jobs基础配置

配置编译参数

例如,如果需要打包者自行选择打包类型,如需要编译Release/Debug/Test等不同版本的包,那需要配置Jobs的编译参数,配置方法如下图所示:

你还可以配置一些其它参数,例如:

配置完后,build界面中就会出现,如下如所示:

配置匿名用户权限

后面打包的应用发布时,如果懒得自己搭建服务器,就用Jenkins的,但发布出去的链接需要登录才能访问,这时候你可以设置匿名用户的访问权限,这样匿名用户可以下载访问你提供的应用链接了,非常取巧的方法,如下图:

Jobs源码库配置(Gitlab为例)

配置SSH

操作:Manage Jenkins -> Credentials -> Global credentials (unrestricted) -> Add Credentials

  1. 本机生成SSH:ssh-keygen -t rsa -C “Your email” , 生成过程中需设置密码,最终生成id_rsa和id_rsa.pub(公钥)

  2. 本机添加秘钥到SSH:ssh-add 文件名(需输入管理密码)

  3. Gitlab上添加公钥:复制id_rsa.pub里面的公钥添加到Gitlab

  4. 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和邮件通知配置,参考下图

可借助Email Extension Plugin 插件进行详细配置,具体可参考此文

发布

  • FTP服务器, 最传统的方式,可助蒲公英或者fir.im(安装对应的Jenkins插件)。

  • 专业的Artifacts存储仓库, 比如Nexus, Artifactory等。

  • 对象存储服务:比如阿里云OSS,AWS S3等,以阿里云为例

这里分享一个我写的shell脚本模板(已开源),可以用于iOS的plist文件自动创建以及OTA简单发布页面的自动创建,参考此链接获取源码, 欢迎Star。自动生成一个简单HTML界面,如下图,点击Install即可安装:

注意,这里iOS7.1以后限定必须要要用https,所以需要对jenkins设置下https,参考下面”后记” 中的Jenkins Https设置

Last Show

构建成功后最终的结果如下如所示:

后记

签名和证书问题(iOS)

  • Set up code signing for iOS projects

  • 安装JENKINS到发布IPA中的那些坑

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证书

作者:SkySeraph
链接:https://www.jianshu.com/p/dcda655a6a84
来源:简书

Jenkins User Conference China 2019 · 北京站

全部日程

点击阅读原文,了解更多精彩

登录查看更多
1

相关内容

【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【IJCAI2020-华为诺亚】面向深度强化学习的策略迁移框架
专知会员服务
25+阅读 · 2020年5月25日
专知会员服务
28+阅读 · 2020年5月20日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
160+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
用 GitLab 的 Merge Request 做代码评审
DevOps时代
4+阅读 · 2019年5月5日
7 款实用到哭的App,只说一遍
高效率工具搜罗
84+阅读 · 2019年4月30日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
占坑!利用 JenKins 持续集成 iOS 项目时遇到的问题
AliCoCo: Alibaba E-commerce Cognitive Concept Net
Arxiv
13+阅读 · 2020年3月30日
Arxiv
91+阅读 · 2020年2月28日
Self-Driving Cars: A Survey
Arxiv
41+阅读 · 2019年1月14日
Arxiv
8+阅读 · 2018年11月27日
A General and Adaptive Robust Loss Function
Arxiv
7+阅读 · 2018年11月5日
VIP会员
相关资讯
用 GitLab 的 Merge Request 做代码评审
DevOps时代
4+阅读 · 2019年5月5日
7 款实用到哭的App,只说一遍
高效率工具搜罗
84+阅读 · 2019年4月30日
Pupy – 全平台远程控制工具
黑白之道
43+阅读 · 2019年4月26日
支持多标签页的Windows终端:Fluent 终端
Python程序员
7+阅读 · 2019年4月15日
百度开源项目OpenRASP快速上手指南
黑客技术与网络安全
5+阅读 · 2019年2月12日
去哪儿网开源DNS管理系统OpenDnsdb
运维帮
21+阅读 · 2019年1月22日
如何用GitLab本地私有化部署代码库?
Python程序员
9+阅读 · 2018年12月29日
占坑!利用 JenKins 持续集成 iOS 项目时遇到的问题
Top
微信扫码咨询专知VIP会员