mac环境下,

首选需要安装gitlab-runner和fastlane

brew install gitlab-runner

brew install fastlane

安装完成,来到我们在gitlab下新建的Android项目,我们开始创建gitlab-runner

1、创建runner

点开runner,点击新建runner

选择macos,自定义一个标签,把运行未打标签的作业也够选上,点击创建runner

然后来到这个页面,开始在终端挨个执行命令

执行命令,一定要选择shell,可以看到这时候就创建runner成功了

testrunner就是这个runner的名字

gitlab-runner list

执行这个命令可以看到电脑上所有的runner

gitlab-runner status 可以查看gitlab-runner的状态

如果状态不在线,可以调用gitlab-runner install 命令 再调用gitlab-runner start

2、fastlane

cd到项目跟目录下,使用fastlane init

根目录下就会创建fastlane文件夹

我们要写的代码都在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_fastlanedefault_platform(:android)APK_TIME = Time.now.strftime("%Y%m%d")app_versionName= "1.0.0"BUILD_NAME = ""# OUTPUT_NAME_PATCH = "#{BUILD_NAME}_#{PLIST_INFO_VERSION}_#{APK_TIME}"platform :android dodesc "给测试用单渠道cnrmall_official的包"puts "APK_TIME=== #{APK_TIME}"channel = "cnrmall_official"lane :debug_cnrmall_official doBUILD_NAME = "android_Debug_#{channel}"gradle(task: "clean assemble#{channel}",build_type: "Debug") mk_cp_apk pgyer_upload(channel: "#{channel}")end#debug全渠道包lane :debug dochannel = "cnrmall_official"BUILD_NAME = "android_Debug"gradle(task: "clean assemble",build_type: "Debug") pgyer_upload(channel: "#{channel}")end#release全渠道包lane :release dochannel = "cnrmall_official"BUILD_NAME = "android_Release"gradle(task: "clean assemble",build_type: "Release") pgyer_upload(channel: "#{channel}")end# 执行创建文件夹 copy apk 到最外面目录lane :mk_cp_apk doputs "mk out_apk cp apk"gradle(task: "customBuild")endlane :get_version doputs "Update Android version in build.gradle"app_version = gradle(task: "getVersionName")# 获取版本号# puts "app_version:#{versionCode}"enddesc "Submit a new Beta Build to Crashlytics Beta"lane :beta dogradle(task: "clean assembleRelease")crashlytics# sh "your_script.sh"# You can also use other beta testing services hereenddesc "Deploy a new version to the Google Play"lane :deploy dogradle(task: "clean assembleRelease")upload_to_play_storeend# #上传蒲公英 lane :pgyer_upload do |option| sh 'ls' pyg_get_channel = option[:channel] puts "上传蒲公英channel= #{pyg_get_channel}"#ENV['outPutPath'] = '../app/build/outputs/apk/'+"#{pyg_get_channel}"+"/debug/cnrmall_"+"#{APK_TIME}"+"_"+"#{app_versionName}"+"_"+"#{pyg_get_channel}"+".apk" ENV['outPutPath'] = '../out_apk/cnrmall_'+"#{APK_TIME}"+"_"+"#{app_versionName}"+"_"+"#{pyg_get_channel}"+".apk" puts "outPutPath路径- #{ENV['outPutPath']}"#ENV['outPutPath'] = '../app/build/outputs/apk/option/debug/cnrmall_#{APK_TIME}_1.0.0_cnrmall_official.apk'#sh "open ../app/build/outputs/apk/debug/" sh "./pgyer_upload.sh-k 4df7384110457be3f5bce0c391ef1cd3#{ENV['outPutPath']} "endend

上传蒲公英脚本

#!/bin/bash## 通过shell脚本来实现将本地app文件通过API上传到蒲公英# https://www.pgyer.com/doc/view/api#fastUploadApp## Display log. 1=enable, 0=disableLOG_ENABLE=1printHelp() {echo "Usage: $0 -k[OPTION]... file"echo "Upload iOS or Android app package file to PGYER."echo "Example: $0 -k xxxxxxxxxxxxxxx /data/app.apk"echo ""echo "Description:"echo "-k api_key (required) api key from PGYER"echo "-t buildInstallTypebuild install type, 1=public, 2=password, 3=invite"echo "-p buildPassword build password, required if buildInstallType=2"echo "-d buildUpdateDescriptionbuild update description"echo "-e buildInstallDatebuild install date, 1=buildInstallStartDate~buildInstallEndDate, 2=forever"echo "-s buildInstallStartDate build install start date, format: yyyy-MM-dd"echo "-e buildInstallEndDate build install end date, format: yyyy-MM-dd"echo "-c buildChannelShortcutbuild channel shortcut"echo "-h helpshow this help"echo ""echo "Report bugs to: " echo "Project home page: " exit 1}while getopts 'k:t:p:d:s:e:c:h' OPT; docase $OPT ink) api_key="$OPTARG";;t) buildInstallType="$OPTARG";;p) buildPassword="$OPTARG";;d) buildUpdateDescription="$OPTARG";;e) buildInstallDate="$OPTARG";;s) buildInstallStartDate="$OPTARG";;e) buildInstallEndDate="$OPTARG";;c) buildChannelShortcut="$OPTARG";;" /> "$jsonFilePath"# 将 JSON 保存到文件# 提取 buildQRCodeURL 的值#qrCodeURL=$(jq -r '.data.buildQRCodeURL' <<< "$result")qrCodeURL=$(echo "$result" | grep -o '"buildQRCodeURL":"[^"]*' | cut -d '"' -f 4 | sed 's/\\//g') # 使用 curl 下载并保存 QR Code 文件echo "Downloading QR Code from: $qrCodeURL" # curl -s "$qrCodeURL" -o "$qrCodeFilePath"curl --location-trusted -o "$qrCodeFilePath" "$qrCodeURL"echo "curl Result: $curlResult"breakelsesleep 1fidone

.gitlab-ci.yml,只需要写上执行哪个fastlane即可 ,debug_cnrmall_official是fastlane名字

在Android studio中的Terminal中,也可以使用命令去执行某一个fastlane

如:fastlane lane:debug_cnrmall_official

stages:- buildjob:stage: buildscript:- echo "开始打包4"- ls -a# - ./build.sh- fastlane debug_cnrmall_officialartifacts:paths:- out_apk/*

项目跟目录的build.gradle文件中,还自定义了一个task

因为Android默认打包完的apk位置太深了,所以把它复制到外面一点,方便测试拿到

cnrmallshop_ci_2.0是项目名 out_apk是创建的文件夹
task customBuild(type: Exec) {def date = new SimpleDateFormat("yyyyMMdd").format(new Date())def versionName = rootProject.android.versionNamecommandLine 'sh','-c','mkdir -p ../cnrmallshop_ci_2.0/out_apk && cp app/build/outputs/apk/cnrmall_official/debug/cnrmall_'+date+'_'+versionName+'_cnrmall_official.apk ../cnrmallshop_ci_2.0/out_apk/cnrmall_'+date+'_'+versionName+'_cnrmall_official.apk'}

最后可以在流水线上中看到构建成功的流水线,可以点击下载按钮下载产物

​​​​​​​

产物中有apk有二维码