基于Jenkins和fastlane的iOS持续集成与发布环境搭建

前言

Jenkins安装

Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

Jenkins下载地址
选择Mac os X
下载好,一步一步安装即可。

安装成功.png

安装成功后,直接在浏览器中输入:http://localhost:8080/ ,打开jenkins;

http://localhost:8080/exit            // 退出Jenkins
http://localhost:8080/restart       // 重启Jenkins,一般装了插件重启下
http://localhost:8080/reload       // 重新加载Jenkins
解锁Jenkins.png

找到/Users/用户名/.jenkins/secrets/也可能是/Users/Shared/Jenkins/Home/secrets/这个目录的initialAdminPassword文件,将文件内容拷贝至页面密码区域;
或者如下图,执行sudo cat /Users/Shared/Jenkins/Home/secrets/initialAdminPassword,将输出的密码拷贝纸页面密码区域;

解锁Jenkins-initialAdminPassword.png
解锁Jenkins-密码拷贝.png
自定义安装.png
下一步安装.png
创建管理员.png
instace config.png

start jenkins.png
安装完成.png

插件安装

在系统管理-->管理插件,添加如下插件:


image.png

Xcode integration
Git plugin
GitHub plugin
PostBuildScript Plugin

注意:
记得安装环境变量注入插件,然后在配置工程时,构建->增加构建步骤->引入如下路径;

PATH=$PATH:/usr/local/bin
# 包括pod、fastlane、git等shell的执行,都依靠这个路径

Environment Injector Plugin // 环境变量注入

Inject environment variables.png

fastlane指令.png

fastlane 安装

fastlane工具
1、Xcode 命令行安装

xcode-select --install

如果输出如下,表示已经安装


Xcode-select.png

2、fastlane安装

sudo gem install fastlane // 安装fastlane
fastlane -v // 查看安装版本

如果报错

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/bin directory.

请使用

sudo gem install -n /usr/local/bin/ fastlane

新建Item

新建Item.png
create Item.png
iOS_test.png
workspace path.png
/Users/developer/.jenkins/jobs/iOS_Test/workspace/项目工程

Jenkins通用配置

注意点:

1、Keychains
获取Jenkins对钥匙串的访问权限

~/Library/Keychains/login.keychain 或者login.keychain-db

2、Provisioning Profiles
将描述文件拷贝到

~/Library/MobileDevice/Provisioning Profiles/

将以上文件分别拷贝到

/Users/Shared/Jenkins/Library/Keychains/

/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles/

3、证书权限

钥匙串-> 登录 -> 我的证书
找到对应证书,展开-选中私钥,双击,访问控制,允许所有应用程序访问此项目,右下角,存储更改。

fastlane配置

1、进入工程主目录

fastlane init

2、查看Appfile文件

app_identifier("com.XX.XX") # The bundle identifier of your app
apple_id("renboan@liyun.com") # Your Apple email address

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile

3、配置Fastfile文件

# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

# 平台,安卓还是iOS
default_platform(:ios) 

# iOS进行的操作
platform :ios do
  desc "企业版"
  # 在执行lane之前进行的操作,例如我们在每次打包之前都执行一次pod install
  #before_all do
    # faselane中pod install的操作
    #cocoapods
  #end

  # 打包的lane操作,我们可以配置多个lane来打不同环境的包
  lane :enterprise do |op|

    # 打包之前跟新指定配置的描述文件
    update_project_provisioning(
        # 之前有sigh下载的描述文件存储路径
        profile:"./XXXXDis.mobileprovision",

        # 打包配置,Debug,Release
        build_configuration:"Debug"
    )

      automatic_code_signing(
        # 工程文件所在路径
        path:"ProjectName.xcodeproj",
        # 是否使用自动签名,这里如果是打包的话应该一般都为false吧,默认也是false
        use_automatic_signing:false,
        # 打包的team ID, 也就是打包使用的证书中的team ID,这个如果不知道是什么的话可以在xCode中设置好签名用的描述文件后到xcodeproj下的pbxproj文件中搜索“DEVELOPMENT_TEAM”,它的值就是了
        team_id:"XXXX",
        # 这个就不用说了,需要修改的targets
        targets:"ProjectName",
        # 用哪种方式打包“iPhone Develop”还是“iPhone Distribution”
        code_sign_identity:"iPhone Distribution",
        # 描述文件名称, 也就是使用哪个描述文件打包
         profile_name:"XXXXDis"
    )

    currentTime = Time.new.strftime("%Y-%m-%d-%H-%M")
    outputDirectory = "./build/#{currentTime}"
    logDirectory = "#{outputDirectory}/fastlanelog"

    gym(
        # 打包方式,enterprise, adhoc,appstore,development
        export_method: "enterprise",
        scheme: "ProjectName",
        # pod 生成的workspace文件
        workspace:"ProjectName.xcworkspace",
        # 输出文件夹
        output_directory: outputDirectory,
        # 输出包名称
        output_name:"ProjectName.ipa",

        # 打包前是否clean
        clean:true,
        silent:true,
        # 打包的配置 Debug Release
        configuration:"Debug",
        # 打包日志输出文件夹
        buildlog_path:logDirectory,
        # 打包证书
        codesigning_identity:'iPhone Distribution: XXXXXXXXXXXX TECHNOLOGY CO.,LTD.',
        # Xcode 9 默认不允许访问钥匙串的内容,必须要设置此项才可以,运行过程可能会提示是否允许访问钥匙串,需要输入电脑密码
        export_xcargs: "-allowProvisioningUpdates",
        # 导出选项
        export_options:{
            # 打包导出时可选描述文件 "bundleID"=>"描述文件名称"
            provisioningProfiles: {
                "com.XXXX.XXXX" => "XXXXDis.mobileprovision",
            },
        }
    )
    archive_path="Published succeed:/XXXXXXXXXXXX/build/#{currentTime}/ProjectName.ipa"
    puts "#{archive_path}"
  end

  # 当lane执行完成之后进行哪些操作
  after_all do |lane|

  end

  error do |lane, exception|
  end

end

4、命令行执行打包

fastlane ios enterprise

Jenkins配置

1、shell语句
export LANG="en_US.UTF-8"
pwd
cd $WORKSPACE/ProjectName

fastlane ios enterprise
2、Set build description
Set build description.png
Published succeed:(.*)

<a href="http://XX.XX.XX.XX:8080/job/${JOB_NAME}/ws\1">单击ipa包下载</a>

Regular expression:Published succeed:(.*) // 这里这样写,是因为fastlane文件中输出了以Published succeed:为前缀的一个地址;

archive_path="Published succeed:/XXXXXXXXXXXX/build/#{currentTime}/ProjectName.ipa"
puts "#{archive_path}"

Description:构建后的描述中的\1的意思是获取正则表达式获取的内容。

3、邮件通知

首先将系统管理员邮箱(你用来发邮件的邮箱)smtp服务打开,拿126邮箱举例,打开邮箱,进入设置,进入POP3/SMTP/IMAP设置,打开如下图几个选项。


image.png

然后,在Jenkins,添加系统管理员邮箱及SMTP服务器,具体步骤是,进入Jenkins的系统管理-->系统设置,找到Jenkins Location,填写系统管理员邮件地址;


image.png

添加SMTP服务器地址,126邮箱的是smtp.126.com,填写管理员邮箱及密码。


image.png

最后,在项目配置中,构建后操作项,添加收取邮件的邮箱,多个邮箱用空格隔开。


image.png

设置完成后,在构建历史区域可以直接下载打包的ipa包。


image.png
  • Jenkins启动
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
  • 停止运行Jenkins
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
  • 找回密码

找到config.xml文件

/Users/Shared/Jenkins/Home/users/admin/config.xml

文件中找到,fullName为用户名:admin,passwordHash为加密的密码:111111

  <fullName>admin</fullName>
      <passwordHash>#jbcrypt:$2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TSrGK5nXitqK9ZMS</passwordHash>

本文已在版权印备案,如需转载请在版权印获取授权。
获取版权

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容