使用 fastlane 构建 Kotlin Multiplatform Mobile 在 iOS 上失败
Building Kotlin Multiplatform Mobile with fastlane failing on iOS
我有一个问题,为什么要尝试使用 Jenkins 管道和 fastlane 为 iOS 部分构建 KMM 项目。
Kotlin 版本:1.5.31
XCode版本:13.1
快车道版本:2.198.1
Ruby版本:2.6.3p62
在本地执行这些步骤时,它也会中断。 fastlane 抛出的错误是 import shared: no such module 'shared'
我发现如果你 运行 pod install && fastlane xcode_build
构建刹车,但如果你重复它第二次它会成功并在 project.app 的 DerivedData 文件夹中创建文件 XCode.
Jenkinsfile 在另一个 iOS 项目上正常工作,该项目不是 KMM 项目。
这是 Jenkins 文件
pipeline {
options {
buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '5'))
}
environment{
FIREBASE_APP = 'some-app'
FIREBASE_TOKEN = 'some-token'
YOUR_CRED = credentials('KeychainPassword')
PROJECT_NAME = 'project'
}
agent any
stages {
stage("Build and Deploy") {
parallel {
stage("iOS") {
agent { label 'ios' }
stages {
stage('Unlock Keychain') {
steps {
sh 'security unlock-keychain -p ${YOUR_CRED} /Users/chocho/Library/Keychains/login.keychain'
}
}
stage("Build") {
steps {
dir("${PROJECT_NAME}-ios"){
sh "pod install"
sh "fastlane xcode_build"
}
}
}
stage("Archive") {
steps {
sh "cp -r ~/Library/Developer/Xcode/DerivedData/${PROJECT_NAME}-ios*/Build/Products/Debug-iphonesimulator/${PROJECT_NAME}-ios.app ./"
sh "zip -r simulator.zip ./${PROJECT_NAME}-ios.app"
archiveArtifacts artifacts: 'simulator.zip', fingerprint: true
}
}
stage('Clean'){
steps{
sh "rm -rf ~/Library/Developer/Xcode/DerivedData/${PROJECT_NAME}*"
}
}
stage("Upload") {
// when { branch 'develop' }
steps {
dir("${PROJECT_NAME}-ios/fastlane"){
sh "fastlane test_flight_develop build_number:${BUILD_NUMBER}"
}
}
}
}
post {
always {
sh "rm -rf ~/Library/Developer/Xcode/DerivedData/${PROJECT_NAME}-ios*"
cleanWs()
}
}
}
stage("Android") {
agent { label 'ios' }
stages {
stage("Clean") {
when { branch 'develop' }
steps {
sh './gradlew clean'
}
}
stage("Build") {
when { branch 'develop' }
steps {
sh "./gradlew assembleRelease -Pandroid.injected.version.code=${BUILD_NUMBER}"
}
}
stage("Archive") {
when { branch 'develop' }
steps {
sh "cp ${PROJECT_NAME}-android/build/outputs/apk/release/${PROJECT_NAME}-android*.apk ./${PROJECT_NAME}-android.apk"
archiveArtifacts "${PROJECT_NAME}-android.apk"
}
}
stage("Upload") {
when { branch 'develop' }
steps {
sh "firebase appdistribution:distribute \
${PROJECT_NAME}-android.apk \
--token ${FIREBASE_TOKEN} \
--app ${FIREBASE_APP} \
--groups 'group'"
}
}
}
post {
always {
cleanWs()
}
}
}
}
}
}
}
这是我用于 fastlane 的 Fastfile
default_platform :ios
platform :ios do
lane :xcode_build do
xcodebuild(
scheme: schemeAndTarget,
workspace: schemeAndTarget + '.xcworkspace',
xcargs: "-configuration 'Debug' -sdk 'iphonesimulator15.0' -destination 'generic/platform=iOS Simulator'")
end
end
这是 Podfile
target 'project-ios' do
use_frameworks!
platform :ios, '14.5'
pod 'shared', :path => '../shared'
pod 'R.swift', '5.4.0'
pod 'SwiftLint', '0.45.0'
end
我的问题是,因为我对 KMM 的能力不够。为什么要这样做?如果以上方法不是有效的方法,我打算如何为 CI/CD 构建项目。
所以我想通了。如果有人遇到同样的问题,当前问题的解决方法是在构建 iOS 部分之前,您必须 运行 在项目的根目录中执行 gradle 任务。
./gradlew generateDummyFramework
在我使用 Jenkins 的情况下,我在构建阶段的 sh 'pod install'
shell 命令之前添加了 sh './gradlew generateDummyFramework
。这解决了有问题的问题。
问题是由于 Cocoapods 无法访问框架文件,因此 pod install
无法正确配置框架。第一次构建失败但第二次构建失败的原因是框架文件是在 运行 在 XCode 中构建时生成的。之后 Cocoapods 就可以正确配置文件了。
如果有人有不同的答案,我很想知道!
我有一个问题,为什么要尝试使用 Jenkins 管道和 fastlane 为 iOS 部分构建 KMM 项目。
Kotlin 版本:1.5.31
XCode版本:13.1
快车道版本:2.198.1
Ruby版本:2.6.3p62
在本地执行这些步骤时,它也会中断。 fastlane 抛出的错误是 import shared: no such module 'shared'
我发现如果你 运行 pod install && fastlane xcode_build
构建刹车,但如果你重复它第二次它会成功并在 project.app 的 DerivedData 文件夹中创建文件 XCode.
Jenkinsfile 在另一个 iOS 项目上正常工作,该项目不是 KMM 项目。
这是 Jenkins 文件
pipeline {
options {
buildDiscarder(logRotator(numToKeepStr: '5', artifactNumToKeepStr: '5'))
}
environment{
FIREBASE_APP = 'some-app'
FIREBASE_TOKEN = 'some-token'
YOUR_CRED = credentials('KeychainPassword')
PROJECT_NAME = 'project'
}
agent any
stages {
stage("Build and Deploy") {
parallel {
stage("iOS") {
agent { label 'ios' }
stages {
stage('Unlock Keychain') {
steps {
sh 'security unlock-keychain -p ${YOUR_CRED} /Users/chocho/Library/Keychains/login.keychain'
}
}
stage("Build") {
steps {
dir("${PROJECT_NAME}-ios"){
sh "pod install"
sh "fastlane xcode_build"
}
}
}
stage("Archive") {
steps {
sh "cp -r ~/Library/Developer/Xcode/DerivedData/${PROJECT_NAME}-ios*/Build/Products/Debug-iphonesimulator/${PROJECT_NAME}-ios.app ./"
sh "zip -r simulator.zip ./${PROJECT_NAME}-ios.app"
archiveArtifacts artifacts: 'simulator.zip', fingerprint: true
}
}
stage('Clean'){
steps{
sh "rm -rf ~/Library/Developer/Xcode/DerivedData/${PROJECT_NAME}*"
}
}
stage("Upload") {
// when { branch 'develop' }
steps {
dir("${PROJECT_NAME}-ios/fastlane"){
sh "fastlane test_flight_develop build_number:${BUILD_NUMBER}"
}
}
}
}
post {
always {
sh "rm -rf ~/Library/Developer/Xcode/DerivedData/${PROJECT_NAME}-ios*"
cleanWs()
}
}
}
stage("Android") {
agent { label 'ios' }
stages {
stage("Clean") {
when { branch 'develop' }
steps {
sh './gradlew clean'
}
}
stage("Build") {
when { branch 'develop' }
steps {
sh "./gradlew assembleRelease -Pandroid.injected.version.code=${BUILD_NUMBER}"
}
}
stage("Archive") {
when { branch 'develop' }
steps {
sh "cp ${PROJECT_NAME}-android/build/outputs/apk/release/${PROJECT_NAME}-android*.apk ./${PROJECT_NAME}-android.apk"
archiveArtifacts "${PROJECT_NAME}-android.apk"
}
}
stage("Upload") {
when { branch 'develop' }
steps {
sh "firebase appdistribution:distribute \
${PROJECT_NAME}-android.apk \
--token ${FIREBASE_TOKEN} \
--app ${FIREBASE_APP} \
--groups 'group'"
}
}
}
post {
always {
cleanWs()
}
}
}
}
}
}
}
这是我用于 fastlane 的 Fastfile
default_platform :ios
platform :ios do
lane :xcode_build do
xcodebuild(
scheme: schemeAndTarget,
workspace: schemeAndTarget + '.xcworkspace',
xcargs: "-configuration 'Debug' -sdk 'iphonesimulator15.0' -destination 'generic/platform=iOS Simulator'")
end
end
这是 Podfile
target 'project-ios' do
use_frameworks!
platform :ios, '14.5'
pod 'shared', :path => '../shared'
pod 'R.swift', '5.4.0'
pod 'SwiftLint', '0.45.0'
end
我的问题是,因为我对 KMM 的能力不够。为什么要这样做?如果以上方法不是有效的方法,我打算如何为 CI/CD 构建项目。
所以我想通了。如果有人遇到同样的问题,当前问题的解决方法是在构建 iOS 部分之前,您必须 运行 在项目的根目录中执行 gradle 任务。
./gradlew generateDummyFramework
在我使用 Jenkins 的情况下,我在构建阶段的 sh 'pod install'
shell 命令之前添加了 sh './gradlew generateDummyFramework
。这解决了有问题的问题。
问题是由于 Cocoapods 无法访问框架文件,因此 pod install
无法正确配置框架。第一次构建失败但第二次构建失败的原因是框架文件是在 运行 在 XCode 中构建时生成的。之后 Cocoapods 就可以正确配置文件了。
如果有人有不同的答案,我很想知道!