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

Catalogue
  1. 1. 相关概念
    1. 1.1. Jenkins
    2. 1.2. Gitlab
    3. 1.3. CI
    4. 1.4. OTA
    5. 1.5. pgyer
  2. 2. 流程结构
  3. 3. 平台搭建
    1. 3.1. Jenkins安装和启动
    2. 3.2. Jenkins插件安装
    3. 3.3. Jenkins系统设置
    4. 3.4. Jenkins Jobs配置
      1. 3.4.1. Jobs基础配置
      2. 3.4.2. Jobs源码库配置(Gitlab为例)
      3. 3.4.3. Jobs触发条件配置
      4. 3.4.4. Jobs构建方式/编译 配置
      5. 3.4.5. Jobs构建后处理
  4. 4. 后记
    1. 4.1. 签名和证书问题(iOS)
    2. 4.2. 邮件发送失败
    3. 4.3. Jenkins Https Support
  5. 5. Refs
  6. 6. 后记

相关概念

Jenkins

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

Gitlab

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

CI

  • 持续集成, 简称CI(continuous integration).
  • CI作为敏捷开发重要的一步,其目的在于让产品快速迭代的同时,尽可能保持高质量.
  • CI一种可以增加项目可见性,降低项目失败风险的开发实践。其每一次代码更新,都要通过自动化测试来检测代码和功能的正确性,只有通过自动测试的代码才能进行后续的交付和部署.
  • CI 是团队成员间(产研测)更好地协调工作,更好的适应敏捷迭代开发,自动完成减少人工干预,保证每个时间点上团队成员提交的代码都能成功集成的,可以很好的用于对Android/iOS项目的打包.

OTA

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

pgyer

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

流程结构

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

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

持续交互流程图:

平台搭建

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

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

Jenkins项目设置-Archive-min

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

Jenkins项目设置-邮件-min

发布

当然,如果不想自己的应用发布到三方网站,只希望在自己的内网上托管,这样需要在自己内网上搭建服务器,服务器搭建方式有很多种,Mac上可以用自带的Apache服务,也可以用其它服务。

iOS的发布可能希望用到OTA,可参考此文 还有这篇一步一步实现无线安装iOS应用(内网OTA)

这里分享一个我写的shell脚本模板(已开源),可以用于iOS的plist文件自动创建以及OTA简单发布页面的自动创建,参考此链接获取源码, 欢迎Star.

自动生成一个简单HTML界面,如下图,点击Install即可安装:

Jenkis发布1

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

Last Show

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

后记

签名和证书问题(iOS)

邮件发送失败

  • 实际搭建过程中有遇到此问题,折腾了小会,还以为是公司邮箱地址为题,后面发现仅仅是一个小配置问题。
  • Extended E-mail Notification中也需要和E-mail Notification一样,点击Advanced,然后选择Use SMTP Authentication,配置同E-mail Notification的参数。

Jenkins Https Support

查询Jenkins Https相关命令:

1
java -jar jenkins.war --help | grep -i https

说明:下面以Mac为例.

KeyStore方式

  • 生成:
1
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass 密码 -dname "cn=WEB"
  • 使用:
1
java -jar jenkins.war --httpPort=-1 --httpsPort=8080 --httpsKeyStore=/目录/keystore.jks --httpsKeyStorePassword=密码
  • 注意: 第一次使用时需要将”WEB”证书导入,导入步骤为:Chrome导出证书 -> 安装证书 -> 设置证书”全部允许”, 图解步骤可参考下面实用参考中的第5篇文章.

Certificate方式

  • 生成:
1
2
3
4
5
sudo openssl genrsa -out server.key 2048
sudo openssl req -new -key server.key -out server.csr
sudo openssl genrsa -out ca.key 1024
sudo openssl req -new -x509 -days 365 -key ca.key -out ca.crt
sudo openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key
  • 使用:

启动Jenkins:

1
java -jar jenkins.war --httpsPort=8088 --httpsCertificate=/path/server.crt --httpsPrivateKey=/path/server.key

  • 注意/说明:
    1 同上
    2 iOS手机需要导入cer证书(ca.crt)
    3 Common Name 填写IP地址或域名地址
    4 第5步骤如果提提示“I am unable to access the ./demoCA/newcerts directory” 错误,解决方法为:
    在当前操作目录,新建demoCA\newcerts2层文件夹
    然后再demoCA文件夹下新建一个空的index.txt文件
    再新建一个serial文件,没有后缀。里面填入01

实用参考

Refs

后记

本文首发于skyseraph.com“Jenkins Gitlab持续集成打包平台搭建”
同步发表/转载 cnBlogs / CSDN /



By SkySeraph-2016
Comments