美文网首页CI CD
Jenkins+fastlane在iOS开发中的基础使用

Jenkins+fastlane在iOS开发中的基础使用

作者: iDeveloper | 来源:发表于2018-01-15 23:18 被阅读1471次

    Jenkins是一个基于Java的开源持续集成工具。

    本文采用是fastlane的脚本构建方式。

    关于Xcode integration插件的构建方式。

    Jenkins基础环境搭建

    注意事项:开发软件的环境搭建应尽量按照官方的步骤。有的开发者,学习一样新东西,直接网上一搜,找一个第三方教程来走,结果遇见更多问题。

    Jenkins的官方Guided Tour

    Guided Tour
    • 安装Java8,使用终端安装
    1. 检查java版本

    ~java -version
    No Java runtime present, requesting install.
    表示未安装Java。

    1. 安装java8

    ~brew cask install java8
    java8,必须带8,不然就会安装java最新版本java9。
    如果未安装brew,请先安装brew

    Error: Cask 'java8' is unavailable: No Cask with this name exists.
    出现此错误,使用下面命令解决。
    ~brew tap caskroom/versions

    Java 安装

    安装期间会要求输入管理员密码。


    输入密码
    安装完成

    再查询版本


    查询版本
    • 安装Jenkins,从官网下载安装。
      有长期支持的稳定版,每周发布的开发版,以下是以稳定版2.89.2为例。
      下载pkg安装

    安装完毕后,浏览器自动打开解锁界面。


    Unlock Jenkins

    拷贝上面的地址

    ~ vim /Users/lazy-ios2/.jenkins/secrets/initialAdminPassword
    使用vim打开。

    password

    上面红框里的就是password,拷贝粘贴后,Continue。

    安装推荐插件

    选左边安装推荐插件,耐心等待。

    设置管理员账户

    首次进入Jenkins,先进去系统管理,设置好管理员权限。

    Jenkins不会默认设置当前管理员用户的管理员权限。
    导致登录失效后,就无法登录此账户了,真麻烦~

    1. 进入全局安全配置。


      系统管理
    2. 修改授权策略为安全矩阵,添加用户iostest(刚刚注册现在登录的用户)。


      授权策略
    3. 设置管理员用户为管理员权限,保存。


      完成权限修改
    • 添加用户
    1. 系统管理->管理用户->新建用户


      创建用户

      例如为测试人员创建只读和运行权限的用户。

    2. 系统管理->全局安全配置->授权策略


      配置权限

      Overall选择Read,其他权限选项按需选择。

    还有其他授权策略,如项目矩阵授权策略,基于项目的授权方式,相对安全矩阵配置更灵活,当然配置也相对复杂,没有很多的实践经验,在这里不赘述。

    Jenkins创建任务(job)

    细心的童鞋会发现,Jenkins的Use-cases没有iOS。
    只能自己找第三方教程和摸索,真麻烦~


    Use-cases

    使用构建一个自由风格软件项目为例。


    自由风格的软件项目
    1. 项目的基础设置,按需设置吧,不明白点击后面的问好,有相关说明。


      image.png
    2. 源码管理
      正常来说,公司都有自己的代码仓库,这里以git为例。
      输入git地址,发现没有权限。
      点击图中的add进行添加私钥。
      git管理
      进入.ssh目录
      rsa私钥
      vim打开对应的rsa私钥文件,选中全部,拷贝。
      rsa
      回到Jenkins,点击add添加私钥,选则Jenkins。
      添加私钥
      选择ssh类型。有账户密码的话,要在Username和Passphrase输入账户密码。本例中未设置,故无需输入。
      ssh
      选择创建的Credentials,成功后红色错误提示消失。
      选择Credentials
      最后别忘了选择构建的branch。
      超时时间
      首次拉去代码时间较长,建议设置30分钟超时时间。
    3. 构建触发器


      构建触发器

      可以设置触发构建的事件,当前没有这种需求,当测试人员有需要的时候,再由测试人员去手动构建。 触发事件本身还是很有用的,尤其是Poll SCM,可以设置固定时间点构建。

    4. 构建环境


      构建环境

      由于使用fastlane打包,不用设置,直接跳过。

    5. 构建 (Execute shell,添加Shell脚本构建)
      Jenkins是在Jenkins用户环境下构建的,必须将构建需要的东西同步到Jenkins用户环境。
      所以这里有两个脚本,一个同步Keychain和Provisioning Profiles。
      一个fastlane构建。
    第一个同步脚本如下:
    #!/usr/bin/expect
    
    set timeout 10
    spawn su - test -c "sudo rm -rf /Users/Shared/Jenkins/Library/MobileDevice/'Provisioning Profiles'"
    expect "Password:"
    send "123456\r"
    expect "Password:"
    send "123456\r"
    expect eof
    wait
    
    set timeout 10
    spawn su - test -c "sudo mkdir -p /Users/Shared/Jenkins/Library/MobileDevice/'Provisioning Profiles'"
    expect "Password:"
    send "123456\r"
    expect "Password:"
    send "123456\r"
    expect eof
    wait
    
    set timeout 10
    spawn su - test -c "sudo cp -r /Users/test/Library/MobileDevice/'Provisioning Profiles' /Users/Shared/Jenkins/Library/MobileDevice"
    expect "Password:"
    send "123456\r"
    expect "Password:"
    send "123456\r"
    expect eof
    wait
    
    set timeout 10
    spawn su - test -c "sudo rm -rf /Users/Shared/Jenkins/Library/Keychains"
    expect "Password:"
    send "123456\r"
    expect "Password:"
    send "123456\r"
    expect eof
    wait
    
    set timeout 10
    spawn su - test -c "sudo mkdir -p /Users/Shared/Jenkins/Library/Keychains"
    expect "Password:"
    send "123456\r"
    expect "Password:"
    send "123456\r"
    expect eof
    wait
    
    set timeout 10
    spawn su - test -c "sudo cp -r /Users/test/Library/Keychains /Users/Shared/Jenkins/Library"
    expect "Password:"
    send "123456\r"
    expect "Password:"
    send "123456\r"
    expect eof
    wait
    
    set timeout 10
    spawn sudo security set-key-partition-list -S apple-tool:,apple: -s -k 123456 /Users/Shared/Jenkins/Library/Keychains/login.keychain-db
    expect "Password:"
    send "123456\r"
    expect eof
    wait
    
    

    由于Jenkins用户权限问题,需要使用管理员账户来执行同步命令。
    使用管理员账户自然会询问密码,所以要使用expect。
    最后一个解锁keychain,让Jenkins用户能够读取并使用keychain中的证书来进行签名CodeSign,所有使用Jenkins用户来执行改命令。

    第二个打包脚本
    #!/usr/bin/env bash
    
    export LANG=en_US.UTF-8
    export LANGUAGE=en_US.UTF-8
    export LC_ALL=en_US.UTF-8
    export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120
    
    rm -rf /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData
    ******隐藏代码******
    fastlane gym -w ${buildProjectDir}lazyaudio.xcworkspace --clean -o ${buildDir} -s lazyaudio -n "${buildIpaName}.ipa" -q ${buildConfigStr} --export_method ${exportMethod} -a
    ******隐藏代码******
    
    lftp << EOF
    open ftp://xxxxxx:xxxxx@xxx.xxx.x.xxx
    mkdir ${ftpPath}
    cd ${ftpPath}
    lcd ${ftpIpaPath}
    mput *
    close
    bye
    EOF
    

    打包脚本和项目本身的配置联系紧密。
    为了避免干扰,打包脚本只截取部分通用代码。
    前3个export是必须的,好像是有中文的原因,否则Jenkins不认脚本。
    第4个是设置超时时间,fastlane的默认配置,容易超时导致构建失败,强烈建议加上。
    然后就是配置fastlane,以及fastlane打包部分。


    环境变量

    编写脚本前,必须了解环境变量,这里就不赘述了。
    最后ftp上传构建的ipa等,使用的是lftp。新macOS把ftp默认从系统中移除,如需要自己安装。

    测试构建

    • 构建前,必须确保在管理员账户(这里是test账户)下,可以正常使用fastlane打包。
    • 构建失败,fastlane not found。
      Jenkins找不到fastlane命令,要为Jenkins设置PATH,让它用上fastlane。
    PATH
    在终端输入echo $PATH,打印PATH,拷贝。
    全局属性
    系统管理->系统设置->全局属性->环境变量,输入键PATH,值就是刚刚拷贝的字符串。
    • 构建失败, codesign failure。
      签名失败,通常是keychain解锁失败导致。因为创建Jenkins用户,默认并没有为它设置密码,导致它无法请求管理员权限来解锁keychain。


      设置Jenkins用户密码

      使用sudo passwd jenkins来设置Jenkins用户密码。

    • 构建失败,cannot find xxx scheme
      xcode command line找不到scheme,需要在Xcode设置scheme为shared,commit相关变更,push代码。


      shared scheme

      scheme的生成是依赖Xcode GUI,仅靠xcode command line不能生成scheme来构建。

    • 两个构建并行执行,构建速度慢
      系统管理->系统设置->执行者数量 设置为1,就不会同时进行多个构建。


      执行者数量
    • 让其他用户访问Jenkins


      IP地址

      锁死本机的IP地址,其他用户可以通多访问192.168.x.xxx:8080来使用Jenkins。


      配置IP
      系统管理->系统设置->Jenkins Location
      配置好地址,管理员邮件地址。在下面的邮件通知用得上。

    邮件通知

    • 系统管理->系统设置->邮件通知


      Jenkins自带邮件通知

      配置发邮件的邮箱,建议新建一个Jenkins专用的邮箱,图中是腾讯的企业邮箱为例。配置好通过发送邮件测试邮件测试配置。

    • 系统管理->系统设置->Extended E-mail Notification(这个是建议插件中的一个,比Jenkins自带的邮件通知要强大)。


      Extended E-mail Notification

      将Jenkins自带邮件通知测试通过的配置,填入上面。
      然后设置默认收件人,多个用空格隔开。

    构建后操作

    回到任务配置中,最后一个构建后的操作。

    • 收件人列表设置


      Editable Email Notification
      默认收件人

      除了默认收件人,可以添加其他需要被通知到的收件人,多个用空格隔开。

    • 回复人设置


      回复列表

      回复列表,是指,如果有人回复了Jenkins发的邮件,直接回给哪些人(邮件),而不是Jenkins本身邮箱,Jenkins邮箱只有发邮件的功能。
      当然也可以在系统设置中设置默认回复列表。


      回复列表的作用
    • 内容设置


      构建后邮件设置

      Default Subject和Default Content也是类似的,按需要设置。
      可以查看Content Token Reference来具体设置。

    • Advance setting邮件发送触发配置。


      失败设置

      默认只有失败才发送。


      触发设置
      各自按需设置,根据触发条件不同,又能单独配置收件人列表,回复人列表以及内容。很强大有木有?

    卸载Jenkins

    在自己电脑实践Jenkins够了,想删除了。
    使用Jenkins自带Uninstall.command来删除。
    路径/Library/Application Support/Jenkins/Uninstall.command

    卸载Jenkins

    相关文章

      网友评论

        本文标题:Jenkins+fastlane在iOS开发中的基础使用

        本文链接:https://www.haomeiwen.com/subject/eywkoxtx.html