Jenkins iOS 打包步骤

Jenkins iOS 打包步骤

1.前言

整体思路:

1.在打包机弄一个工程,手动让它打包成功一次(此步骤含iOS证书配置等工作)

2.配置fastlane脚本,让他成功打包(此步骤含安装fastlane,配置fastlane脚本)

3.配置fastlane 上传蒲公英(此步骤有2个方案,a,通过fastlane脚本实现 b,通过Jenkins插件实现)

4.安装Jenkins

5.配置Jenkins,以及webhook连接云效

6.配置飞书机器人,让Jenkins完成打包上传后发送通知到群里

2.详细步骤

1.手动打包

安装Xcode 以及Xcode 命令行

新建一个Xcode工程,配置cocodpods,安装基本的SDK。

然后再Xcode - Setting - Account里添加开发者账号

然后配置自动证书或者去appledevelop后台下载手动证书

配置完成后进行Achive 打包

打包成功后进行下一个步骤

(由于这个文档主要是面向iOS开发,所以手动打包部分不赘述,此部分有疑问可查询相关文档)

2.配置fastlane脚本

1.在命令行安装fastlane

下面2行代码选择一个执行

sudo gem install fastlane -NV
brew install fastlane

执行成功后,执行

fastlane -v

如果能看到版本号说明执行成功了

2.初始化fastlane

cd到项目xcodeproj的上级目录

执行

fastlane init

选择Manual setup - manually setup your project to automate your tasks

初始化fastlane成功后

点Gemfile进去 替换源

source "https://gems.ruby-china.com"

3.配置fastlane

首先安装蒲公英插件

fastlane add_plugin pgyer

再次编辑gemfile文件

source "https://gems.ruby-china.com"
gem 'fastlane' 
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile') 
eval_gemfile(plugins_path) if File.exist?(plugins_path)

然后通过VSCode打开Appfile

复制下面代码,根据项目修改bundle id,苹果账号,team_id

# app_identifier("") # The bundle identifier of your app
# apple_id("[[APPLE_ID]]") # Your Apple Developer Portal username


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

#bundle id
app_identifier("bundle id")
#苹果账号
apple_id("addid@xx.com")
#teamid 在苹果后台查看
team_id("TEAMID")

然后通过VSCode打开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

default_platform(:iOS)
platform :iOS do
  lane :eynamics_test do
    # add actions here: https://docs.fastlane.tools/actions
    gym(
          clean: true,
          output_directory: './fastlane/build',#输出路径
          output_name:"{ipa包名称}.ipa",
          scheme: 'ios-eynamics-app',#iOS Target scheme
          configuration: 'Debug',#/配置开发模式还是发布模式:Debug or Release

          # sdk:"iOS 12.0",
          # archive_path:"./fastlane/Archive",
          include_symbols:true,
          export_options: {
            method: 'development',#测试包
// 有这些导出的类型,需要有相应的证书配对才能导出成功ipa。
// app-store, ad-hoc, package, enterprise, development, developer-id
            # provisioningProfiles: {
            #   "com.xxxx.xxx" => "20210906_dev" #测试打包描述文件
            # },
          }
    )

    # 使用jenkins 插件上传。fastlane只打包
    # pgyer(api_key: "e9f8563c95a396ecea6b6e597e2a3341")

    #current_time = Time.now.in_time_zone("Asia/Shanghai")
    #pgyer(api_key: "", update_description: "update by fastlane #{current_time}")

    end
end

然后执行

fastlane eynamics_test

传值版本

# 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

default_platform(:ios)
platform :ios do
  lane :'iOS_EICharge_Test' do |options|
    # add actions here: https://docs.fastlane.tools/actions
        method_to_use = options[:build_type] == '_Pre' ? 'ad-hoc' : 'development'
    configuration_to_use = options[:build_type] == '_Pre' ? 'Release' : 'Debug'

    gym(
          clean: true,
          output_directory: './fastlane/build',
          output_name:"EICharge_test_debug.ipa",
          scheme: 'iOS-PINGALAX-alps-app',
          configuration: configuration_to_use,###########
          # sdk:"iOS 12.0",
          # archive_path:"./fastlane/Archive",
          include_symbols:true,
          export_options: {
            method: method_to_use,#测试包
            # provisioningProfiles: {
            #   "com.xxxx.xxx" => "20210906_dev" #测试打包描述文件
            # },
          }
    )

    # 使用jenkins 插件上传。fastlane只打包
    # pgyer(api_key: "e9f8563c95a396ecea6b6e597e2a3341")

    # current_time = Time.now.in_time_zone("Asia/Shanghai")
    # pgyer(api_key: "e9f8563c95a396ecea6b6e597e2a3341", update_description: "update by fastlane #{current_time}")

    end
end

执行

fastlane iOS_EICharge_Test build_type:_Pre

如果打包成功的话fastlane部分配置完成了

记得要把这个包,上传到相应的Git地址里,或者Git地址那个包也要安装fastlane,走fastlane步骤

3. 安装Jenkins

这部分不是我做的后续根据相关文档更新
或者搜寻相关参考文档

4.配置Jenkins

创建自由风格的软件

然后进行配置

General 部分填写基本信息

源码配置

这部分的细节

1.最好用ssh配置,在相应的git上配置ssh秘钥,然后再jenkins的Credentials新建ssh的证书,匹配后就可以添加完成。

image.png

设定分支-第一个是首先检出的分支

补充:通过Build with Parameters选择分支的方式

https://juejin.cn/post/7014021599988809735

image.png

构建触发器

https://help.aliyun.com/document_detail/306411.html

这是云效官方文档

首先按照上面安装触发器插件,然后勾选Generic Webhook Trigger


image.png
image.png

这里可以传值
在Jenkins这里这样配置


image.png

云效执行命令部分新增仓鼠

# input your command here
curl -X POST -H "Content-Type: application/json" -d '{"env":"_Test"}' http://114.215.184.253:28080/generic-webhook-trigger/invoke?token=ios-EICharge-app-test

最后在Jenkins传参

export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=10 &&
export FASTLANE_XCODEBUILD_SETTINGS_RETRIES=5 &&
export LANG=en_US.UTF-8 && export LANGUAGE=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && cd iOS-PINGALAX-alps-app && python3 modify_info_plist.py ${env} && fastlane iOS_EICharge_Test build_type:${env}
image.png

底部附python 修改项目版本号的文件代码

配置参数


image.png
image.png

这部分是为了云效,后面插入部分云效配置

URL:http://114.215.184.253:28080/generic-webhook-trigger/invoke?token=eynamics

前面部分是Jenkins地址中间固定的后面 = 后面是Token值

配置完成后再云效测试下是否通过

image.png

运行执行命令这里要写

# input your command here
curl -X POST http://114.215.184.253:28080/generic-webhook-trigger/invoke?token=#那边写的Token#

传值版本 env是前面Jenkins Variable部分配置

# input your command here env是前面Jenkins Variable部分配置
curl -X POST -H "Content-Type: application/json" -d '{"env":"_Dev"}' http://114.215.184.253:28080/generic-webhook-trigger/invoke?token=ios-EICharge-app-test

这样才能通过Jenkins的webhook执行Jenkins(忘了的话很尴尬)

image.png
安装蒲公英Jenkins插件
image.png
image.png

安装完成后

先运行一次Jenkins 生成运行空间。

Build Steps(构建步骤)里添加 Execute shell

然后输入脚本

#这种不会递增版本号
export LANG=en_US.UTF-8 && export LANGUAGE=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && cd ios-eynamics-app && fastlane eynamics_test

#这种会递增版本号,但是Xcode记得设置初始版本号
export LANG=en_US.UTF-8 && export LANGUAGE=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && cd ios-eynamics-app && fastlane run increment_build_number && fastlane eynamics_test

#这种会使用Python代码+ env传值 自动设置版本号 可以看前面传值部分
export LANG=en_US.UTF-8 && export LANGUAGE=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && cd iOS-PINGALAX-alps-app && python3 modify_info_plist.py ${env} && fastlane iOS_EICharge_Test

#这种会使用Python代码+ env传值 自动设置版本号,通过传值确定打debug Release和ad-hoc和development包 可以看前面传值部分
export LANG=en_US.UTF-8 && export LANGUAGE=en_US.UTF-8 && export LC_ALL=en_US.UTF-8 && cd iOS-PINGALAX-alps-app && python3 modify_info_plist.py ${env} && fastlane iOS_EICharge_Test build_type:${env}

image.png

然后Build Steps(构建步骤)里添加 Upload to pgyer with apiV2

进行如下图配置

image.png
image.png
curl -X POST -H "Content-Type: application/json" \
    -d '{"msg_type":"text","content":{"text":"通知 EI Charge-iOS-Test环境包进行了更新,下载地址为:https://www.pgyer.com/RNZbvm"}}' \
    https://open.feishu.cn/open-apis/bot/v2/hook/6f7691f9-d6c2-4e50-be01-5996f06fce46

安卓路径配置
找到apk包的的路径

文件名这种写法就可以


image.png

这部分完成后,保存项目,然后push代码后看是否能构建成功,成功的话就完成所有构建了。

5.配置飞书机器人

首先在飞书群,配置自定义群机器人,选用webhook的方式

image.png

复制并保管好webhook,用于给群发送消息

Build Steps再次添加脚本Execute shell(最下方)

这个脚本的text:后的字符串可以替换,是机器人发送的文案

最下方的url也可以替换,替换成刚刚飞书机器人的webhook

curl -X POST -H "Content-Type: application/json" \
    -d '{"msg_type":"text","content":{"text":"通知-代码进行了更新,下载地址为:https://www.pgyer.com/YsP0D6"}}' \
    https://{飞书机器人webhook地址}
    #例如
    #https://open.feishu.cn/open-apis/bot/v2/hook/123-456-789

保存即可。

6.补充(云效或命令行主动触发Jenkins)

在云效-流水线新建流水线

流水线源配置为Jenkins

image.png

在下图部分输入Jenkins公网地址 以及用户名 密码

image.png

连接成功后添加执行命令

新增一个执行命令如下图

# input your command here
#这下面的Url是Jenkins配置的webhook地址
curl -X POST http://{Jenkins地址}/generic-webhook-trigger/invoke?token={你的TOKEN}

#例如,地址和Token乱写的
#curl -X POST http://123.456.789:8080/generic-webhook-trigger/invoke?token=yourToken
image.png

然后添加飞书机器人通知插件(可选)

此处webhook填写的是飞书机器人的webhook,用于通知开始启动打包业务了

image.png

modify_info_plist.py 代码

import subprocess
import argparse
import plistlib
import re

def get_project_version():
    try:

        # project_path = "./iOS-PINGALAX-alps-app.xcworkspace"
        # 构建 Info.plist 文件路径
        plist_path = "./PZXSwiftProject/Info.plist"
        
        # 使用 plistlib 加载 Info.plist 文件
        with open(plist_path, 'rb') as fp:
            plist = plistlib.load(fp)
        
        # 获取版本号
        version = plist.get('CFBundleShortVersionString')
        match = re.match(r'^(\d+\.\d+\.\d+)', version)

        if version:
            print(f"项目版本号为:{ match.group(1)}")
            return match.group(1)

        else:
            print("未找到版本号信息。")
        
    except Exception as e:
        print(f"获取版本号时出错:{e}")



def update_xcode_project_version(new_version):
    # 设置项目路径,相对路径,脚本和文件放在同一目录下
    project_path = "./iOS-PINGALAX-alps-app.xcworkspace"

    # 更新版本号
    update_version_command = [
        "xcrun",
        "agvtool",
        "new-marketing-version",
        new_version
    ]
    subprocess.run(update_version_command)

def main():
    parser = argparse.ArgumentParser(description='Update Xcode project version')
    parser.add_argument('suffix', nargs='?', default='',
                        help='Suffix to append to current version (e.g., _Dev)')
    
    args = parser.parse_args()

    current_version = get_project_version()  # 这里假设当前版本号是固定的,你可以根据实际情况修改

    if args.suffix:
        new_version = f"{current_version}{args.suffix}"
    else:
        new_version = current_version

    update_xcode_project_version(new_version)

if __name__ == "__main__":
    main()

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

推荐阅读更多精彩内容