Jenkins+fastlane+fir实现自动化打包

序言

由于本人是iOS开发,所以本文一切配置是基于苹果电脑配置的,本篇文章主要从以下几个方面来讲述:

  • Jenkins安装
  • Fastlane介绍
  • Fastlane安装
  • Jenkins+Fastlane相关配置以及实现自动化打包
Mac安装Jenkins

强烈推荐在 macOS 上采用 Homebrew 命令来安装 Jenkins,而不是通过官方网站上下载的 .pkg 包来安装。

pkg包安装问题:
  • SSH 配置问题
  • Git Clone 超时问题
  • Provisioning Profile 读取权限问题等

这些问题比较难解决,当然有兴趣的人可以去尝试。

Jenkins命令行安装

1、安装homebrew:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2、升级java

brew cask install java

3、安装jenkins(过程有点漫长,耐心等待)

brew install jenkins

4、启动jenkins

brew services start jenkins

5、重新启动jenkins

brew services restart jenkins

6、停止jenkins

brew services stop jenkins
Fastlane介绍

fastlane是一款自动打包工具,他有一些核心的工具,比如说打包用的build_app(别名:gym),上传App Store用的deliver等等,详细移步官网地址

这里我们主要看下打包工具gym

gym
Key Description Default
workspace workspace文件路径
project project文件路径
scheme 指定工程的scheme,确认这个scheme是勾选了shared的
clean 在构建前是否要clean false
output_directory ipa文件应该存储在其中的目录 .
output_name 生成ipa文件的名字
configuration 构建app时使用的配置。默认为“发布” *
codesigning_identity 代码签名用的名字,它应该与名称完全匹配,例如'iPhone Distribution: SunApps GmbH'
export_method 用于导出archive的方法。有效值是:appstore, ad-hoc, package, enterprise, development, developer-id
export_xcargs 将额外的参数传递给打包阶段的xcodebuild。一定要引用设置名称和值,例如OTHER_LDFLAGS="-ObjC -lstdc++" (我用到了export_xcargs: "-allowProvisioningUpdates"来解决一个EXPORT FAILED问题)

Mac安装fastlane

  • Install the latest Xcode command line tools
xcode-select --install

如果本地已经安装了Xcode的话,会出现这样的提示:

xcode-select: error: command line tools are already installed, use "Software Update" to install updates
  • 安装fastlane,这里我使用的是brew工具安装的
brew cask install fastlane

安装完毕后会报错:
tip.png
  • 编辑bash_profile文件添加路径,配置环境变量
//进入当前用户目录
cd~

//创建bash_profile文件
touch .bash_profile

//打开profile文件
open .bash_profile

//编辑,修改在文件里添加export PATH="$HOME/.fastlane/bin:$PATH",更新配置的环境变量
source .bash_profile
  • 终端输入fastlane,会出现以下问题,
    image.png

    继续执行
gem sources --add https://rubygems.org

输入fastlane,提示如下:

image.png

  • 进入工程目录,执行fastlane init,如下图
    1.png
1、Automate screenshots: 自动截屏
2、Automate beta distribution to TestFlight: 自动发布beta版本到testFlight
3、Automate App Store distribution: 自动发布到App Store
4、Manual setup: 手动设置

我选择了4,初始化工程目录如下:


WeChat34611e205722dd4b945ef1427dff5f99.png
  • Fastlane相关文件说明
文件名 描述
Appfile 从 Apple Developer Portal 获取和项目相关的信息 详情
Fastfile 核心文件,存放lane任务
Deliverfile deliver的配置文件,从 iTunes Connect 获取和项目相关的信息详细
metadata 同步iTC中的元数据
screenshots 同步iTC中的截图
Jenkins、Fastlane相关配置
Jenkins相关配置

1、命令行启动Jenkins

brew services start jenkins

2、浏览器输入http://localhost:8080,进入

1.png

2.png

3.png

进入到管理员设置页面,设置好相关信息,然后设置URL,保持默认就好
4.png

5.png

进入到以下页面,就表明macOS上Jenkins的安装与配置成功
10.png

3、添加相关插件,Jenkins-->系统管理-->插件管理
image.png

image.png

4、在Jenkins上新建Item
image.png

5、配置Jenkins针对iOS项目的相关信息
jenkins配置界面.png

shell1:

export LANG=en_US.UTF-8
SCHEME="test"
IPANAME="test"
pod install
echo ${buildType}
/Users/yuchen/.fastlane/bin/fastlane gym --export_method development --configuration ${buildType} --scheme ${SCHEME}  --output_name ${IPANAME}

shell2:

#!/bin/bash

MSG=`git log -1 --pretty=%B`
MSG1="${buildType}-${MSG}"

##json解析函数
function jsonParse() { # $1 $2  json lable

     JSON_CONTENT=$1
     KEY='"'$2'":'

     echo ${JSON_CONTENT} | awk -F  ${KEY}  '{print $2}' | awk -F '"' '{print $2}'
}


##replace函数
function TrimAnd(){
    TEXT=$1
    echo ${TEXT//'\u0026'/'&'}
}

# Get API Token from http://fir.im/apps
API_TOKEN="********************"
fileName=`basename /Users/yuchen/.jenkins/workspace/TestProject/******.ipa`
apkPath="/Users/yuchen/.jenkins/workspace/TestProject/$fileName"


# ios or android
TYPE="ios"
# App 的 bundleId
BUNDLE_ID="********"

# Get upload_url
credential=$(curl -X "POST" "http://api.fir.im/apps" \
-H "Content-Type: application/json" \
-d "{\"type\":\"${TYPE}\", \"bundle_id\":\"${BUNDLE_ID}\", \"api_token\":\"${API_TOKEN}\"}" \
2>/dev/null)


SHORT_NAME=$(jsonParse "${credential}" "short")
fir_id=$(jsonParse "${credential}" "id")
binary_response=$(echo ${credential} | grep -o "binary[^}]*")
KEY=$(jsonParse "${binary_response}" "key")
TOKEN=$(jsonParse "${binary_response}" "token")
UPLOAD_URL=$(jsonParse "${binary_response}" "upload_url")

# Upload package
echo 'Uploading...'
echo '✈ -------------------------------------------- ✈'
response=$(curl -F "key=${KEY}" \
-F "token=${TOKEN}" \
-F "file=@${apkPath}" \
-F "x:build=1" \
-F "x:changelog=${MSG1}" \
${UPLOAD_URL}
)

echo ${response}

release_id=$(jsonParse "${response}" "release_id")
download_url=$(jsonParse "${response}" "download_url")

echo APP  名字:        ******IOS
echo APP  包名:       "${BUNDLE_ID}"
echo APP  类型:       "${TYPE}"
echo 应用 ID:         "${fir_id}"
echo 上传apk路径:      "${fileName}"
echo 通用二维码地址:    https://fir.im/"${SHORT_NAME}"
echo APP二维码地址: https://fir.im/"${SHORT_NAME}"?release_id="${release_id}"
QR=`curl -L -s  https://cli.im/api/qrcode/code?text=https://fir.im/"${SHORT_NAME}"?release_id="${release_id}" | grep "qrcode_plugins_img ="| awk -F '//' '{print $2}'| awk -F '\"' '{print $1}'`
echo 草料二维码地址:${QR}
echo 下载地址如下:
echo $(TrimAnd "${download_url}")
配置相关错误总结

1、jenkins使用脚本执行pod命令结果报错pod:command not found,因为没有设置pod的运行路径

解决方法:

  • 打开Jenkins,然后在Jenkins左侧的菜单中找到 系统管理--->系统设置--->全局属性,然后找到Environment variables(中文:环境变量)并且勾选。
  • 打开你的终端,在终端中输入echo $PATH,终端会打印出一串字符串,几个路径,复制该路径,返回到Jenkins中
  • 会让填写一个键值对,键默认填写PATH,值填写你从终端复制的那个字符串,点击保存,完成,构建该项目。

2、错误如下图:


image.png

解决方法:在脚本中加入

export LANG=en_US.UTF-8

3、brew命令安装java8出现失败,可以尝试以下脚本解决

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