簡體   English   中英

在 iOS 上使用 fastlane 構建 Kotlin 多平台移動設備失敗

[英]Building Kotlin Multiplatform Mobile with fastlane failing on iOS

我有一個問題,為什么要嘗試使用 Jenkins 管道和 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構建剎車,但如果你第二次重復它會成功並在 XCode 的 DerivedData 文件夾中創建 project.app 文件。

Jenkinsfile 在另一個不是 KMM 的 iOS 項目上正常工作。

這是詹金斯文件

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 可以正確配置文件。

如果有人有不同的答案,我很想知道!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM