iOS-Pipeline学习笔记

2022-11-30  本文已影响0人  lieon

一些概念

常见的CI/CD工具:

以Jenkins作为Pipeline工具,从0到1对一个iOS工程实现CI/CD的功能

iOS项目接入CI/CD的目的

Jenkins

第一个Jenkins job: Hello world

访问http://localhost:8080,进入Jenkins首页dashbord,开始第一个Jenkis job


从Hello world pipeline的代码从可以看到,一个pipeline的job的一些关键字,其表示的意义如下:

Jenkins MultiBranch job

编写iOS工程pipeline代码

通过Fastlane执行iOS程序的编译,运行,单元测试,打包,上传等工作

Fastlane

定义编译导出包的的lane

在Fastfile中,开始定义我们的打包代码,其语法规则是ruby,主要调用Fastlane提供的 build_app 这个方法即可完成,在我们的实力代码中,主要为build_app设置如下参数,

该lane定义好了,我们就可以通过执行 fastlane + lan的名称,就能直接执行该lane了,这里我们执行 fastlane build_uat

定义单元测试的lane

Fastlane中提供了run_tests 方法运行单元测试,我们需要再iOS工程设置好单元测试测试Schema,Target 以及开启收集测试覆盖率等功能,这样run_test方法才能运行成功

run_tests方法的参数很简单,这里就不必一一解释了,需要强调的是,我们在单元测试运行完成之后,需要生成测试报告,这里我们通过coverage_report 这个lane来生成测试报告

在过coverage_report函数中,调用了xcov这个方法去生成,在这个方法中,我们可以设置测试覆盖率最低阀值,可以在fastlane目录里面添加一个.xcovignore文件,来设置测试忽略文件路径,设置了之后,在计算测试覆盖率就不会把这些文件算进去(比如 UI,Pod等文件)。xcov内部实现的主要逻辑是解析在unit test完成之后生成的xcresult文件,我们可以在Xcode中,通过以下方式查看xcresult文件的位置。同理,执行 fastlane unit_test即可执行这个lane

定义代码静态检查的lane

在fastlane中,仍然是swiftlint就行代码静态检测,但是swiftlint只提供swiftlint这个方法,并不会真正安装swiftlint,所以我们需要在setup工程时安装swiftlint,然后再把swiftlint的执行文件路径设置进去


定义上传Testfight的lane

该lane的作用是为了完成测试包上传Appstore,主要用到的方法是upload_to_testflight

因为需要往开发者的iTunes Connect后台上传ipa包,所以我们需要提供一些身份验证信息来完成对fastlane的鉴权,其中api_key就是我们的授权的信息,在app_store_connect_api_key中key_id, issuer_id, 这两个信息可以在iTunes Connect后台生成,具体步骤,可以参考一下截图



更多的fastlane的功能可以参考去官网,这里就不一一赘述了

Jenkins 执行 fastlane命令

fastlane定义好了各个阶段的具体执行的内容,那么Jenkins要做的就是在stage中使用这些定义好的lane,在我们的Sample工程中,主要定义以下stage来完成这个pipeline

pipeline {
    agent any
    environment {
        RUBY_HOME = "/usr/local/opt/ruby"
        PATH = "$RUBY_HOME/bin:$PATH"
        LANG = "en_US.UTF-8"
    }
    parameters {
        string(name: 'APP_BUILD_FOLDER', defaultValue: './build', description: 'Application build output folder')
        string(name: 'APP_PACKAGES_FOLDER', defaultValue: './build/packages', description: 'Application packages output folder')
        string(name: 'APP_TEST_FOLDER', defaultValue: './build/tests', description: 'Application test output folder')
    }
    stages {
        stage('Setup') {
            steps {
                sh 'gem install bundler'
                sh 'bundle install'
                sh 'bundle exec pod install --verbose'
            }
        }
        stage('Swiftlint') {
            steps {
                script {
                    sh 'bundle exec fastlane static_code_check'
                     }
                }
        }
        stage('Unit Test') {
            steps {
                script {
                    sh 'bundle exec fastlane unit_tests'
                    junit 'build/tests/report.junit'
                }
            }
        }

        stage('Upload TestFlight') {
            steps {
                script {
                    sh 'bundle exec fastlane release_to_testflight_mock'
                }
            }
        }
       
    }
    post {
        success {
            dir("${params.APP_TEST_FOLDER}") {                                                                            
                publishHTML target: [
                    allowMissing         : false,
                    alwaysLinkToLastBuild: false,
                    keepAll              : true,
                    reportDir            : './coverage',
                    reportFiles          : '**/*.html',
                    reportName           : 'Test Coverage'
                ]
            }
        }

        cleanup {
            cleanWs()
        }
    }
}

最后把我们的iOS工程推送到远端仓库,在Jenkins job页面点击 立即扫描多分支流水线 就能开始拉取最新的代码,根据Jenkinsfile执行我们的定义的stage,如果不出意外的话,将会看到如下结果

上一篇 下一篇

猜你喜欢

热点阅读