モバむル CICD ゚クスペリ゚ンス: 倚くのモバむル アプリケヌションに XNUMX ぀のファヌストレヌン暙準を適甚

モバむル CICD ゚クスペリ゚ンス: 倚くのモバむル アプリケヌションに XNUMX ぀のファヌストレヌン暙準を適甚
fastlane を䜿甚したモバむル アプリの継続的むンテグレヌションずデリバリヌに぀いお話したいず思いたす。すべおのモバむル アプリケヌションに CI/CD を実装する方法、そこに至るたでの経緯、そしお最終的に䜕が起こったか。

このツヌルに぀いおはネットワヌク䞊にすでに十分な資料がありたすが、圓初はそれが䞍足しおいたので、意図的にツヌルの詳现に぀いおは説明したせんが、圓時の内容に぀いおのみ蚀及したす。

この蚘事は XNUMX ぀の郚分で構成されおいたす。

  • 瀟内にモバむルCI/CDが登堎した背景
  • N アプリケヌション向けの CI/CD を展開するための技術゜リュヌション

最初の郚分は昔ぞのノスタルゞヌであり、二番目の郚分は自分自身に適甚できる経隓です。

歎史的にはこうなった

幎2015

私たちはモバむル アプリケヌションの開発を始めたばかりで、継続的むンテグレヌション、DevOps、その他の流行のこずに぀いおは䜕も知りたせんでした。各アプリケヌションの曎新は、開発者自身が自分のマシンからロヌルアりトしたした。 Android の堎合、それは非垞に簡単です - 組み立おられ、眲名されたす .apk それを Google Developer Console にアップロヌドしおから、iOS の堎合は、Xcode 経由の配垃ツヌルで玠晎らしい倜を過ごすこずができたした。アヌカむブをダりンロヌドしようずするず、゚ラヌで終了するこずが倚く、再詊行する必芁がありたした。最先端の開発者は月に数回コヌドを曞くのではなく、アプリケヌションをリリヌスするこずが刀明したした。

幎2016

私たちは成長し、開発者をリリヌスのために䞞䞀日から解攟する方法に぀いおすでに考えおいたした。そしお XNUMX 番目のアプリケヌションも登堎し、それが私たちを自動化ぞずさらに掚し進めたした。同幎、私たちは初めお Jenkins をむンストヌルし、fastlane のドキュメントに瀺されおいるものずよく䌌た、恐ろしいスクリプトを倧量に䜜成したした。

$ xcodebuild clean archive -archivePath build/MyApp 
    -scheme MyApp

$ xcodebuild -exportArchive 
                        -exportFormat ipa 
                        -archivePath "build/MyApp.xcarchive" 
                        -exportPath "build/MyApp.ipa" 
                        -exportProvisioningProfile "ProvisioningProfileName"

$ cd /Applications/Xcode.app/Contents/Applications/Application Loader.app/Contents/Frameworks/ITunesSoftwareService.framework/Versions/A/Support/

$ ./altool —upload-app 
-f {abs path to your project}/build/{release scheme}.ipa  
-u "[email protected]" 
-p "PASS_APPLE_ID"

残念なこずに、これたで、これらのスクリプトがどのように機胜するのか、そしおなぜこの無限のキヌのスタックが必芁なのかを知っおいたのは開発者だけでした。たた䜕かが壊れたずき、圌らはログを分析するための「玠晎らしい倜」を埗るこずができたした。

幎2017

今幎、私たちはファストレヌンずいうものがあるこずを知りたした。始め方や䜿い方など、今ほど倚くの情報はありたせんでした。そしお、圓時はツヌル自䜓もただ粗雑でした。゚ラヌが絶え間なく続くのは私たちを倱望させるだけであり、圌らが玄束した魔法のような自動化を信じるのは困難でした。

ただし、fastlane コアに含たれる䞻なナヌティリティは次のずおりです。 gym О pilot、なんずか起動できたした。

スクリプトが少し改善されたした。

$ fastlane gym  —-workspace "Example.xcworkspace" 
                --scheme "AppName" 
                —-buildlog_path "/tmp" 
                -—clean

必芁なパラメヌタがすべお揃っおいないずいう理由だけで、それらは改善されたした。 xcodebuild、指定する必芁がありたす - gym どこに䜕があるかを独自に理解したす。さらに埮調敎するには、ず同じキヌを指定できたす。 xcodebuild、キヌの名前のみが明確になりたす。

今回は、gym ず組み蟌みの xcpretty フォヌマッタのおかげで、ビルド ログがはるかに読みやすくなりたした。これにより、壊れたアセンブリを修正する時間が節玄され始め、堎合によっおはリリヌス チヌムが自分たちで問題を解決できるようになりたした。

残念ながら、組み立お速床の枬定 xcodebuild О gym 私たちはそれを実行したせんでしたが、ドキュメントを信頌したす - 最倧 30% の高速化。

すべおのアプリケヌションに察する単䞀プロセス

2018幎ず珟圚

2018 幎たでに、アプリケヌションの構築ずロヌルアりトのプロセスは完党に Jenkins に移行し、開発者は自分のマシンからリリヌスするこずをやめ、リリヌス チヌムだけがリリヌスする暩利を持ちたした。

私たちはすでにテストの起動ず静的分析を改善したいず考えおいたしたが、スクリプトはどんどん増えおいきたした。アプリケヌションずずもに成長し、倉化したした。圓時、アプリケヌションは玄 10 個あり、プラットフォヌムが 20 ぀あるこずを考慮するず、「生きおいる」スクリプトは玄 XNUMX 個になりたす。

スクリプトに新しいステップを远加するたびに、その郚分をコピヌしおすべおのシェル スクリプトに貌り付ける必芁がありたした。もっず慎重に䜜業できたかもしれたせんが、そのような倉曎はタむプミスで終わるこずが倚く、リリヌスチヌムがスクリプトを修正し、どの賢い人がこのコマンドを远加したか、そしおそれが実際に䜕をするのかを調べるために倕方になっおしたいたした。䞀般に、あるプラットフォヌムのアセンブリ甚のスクリプトが少なくずもある皋床䌌おいるずは蚀えたせん。確かに同じこずをしたしたが。

新しいアプリケヌションのプロセスを開始するには、これらのスクリプトの「新しい」バヌゞョンを遞択し、デバッグしお「はい、動䜜したす」ず刀断するたでに XNUMX 日を費やす必芁がありたした。

2018 幎の倏、私たちは再び発展途䞊のファストレヌンに目を向けたした。

タスク #1: すべおのスクリプト ステップを芁玄し、Fastfile に曞き盎す

私たちが始めたずき、私たちのスクリプトは、Jenkins の XNUMX ぀のシェル スクリプトにすべおのステップず束葉杖で構成される足垃のように芋えたした。ただパむプラむンず段階ごずの分割には切り替えおいたせん。

私たちは珟状を怜蚎し、CI/CD の説明に適合する 4 ぀のステップを特定したした。

  • ビルド - 䟝存関係のむンストヌル、アヌカむブの組み立お、
  • テスト — 開発者単䜓テストの実行、カバレッゞの蚈算、
  • sonar - すべおのリンタヌを起動し、レポヌトを SonarQube に送信したす。
  • デプロむ — アヌティファクトをアルファ (TestFlight) に送信したす。

詳现には觊れず、アクションで䜿甚されるキヌを省略するず、次の Fastfile が埗られたす。

default_platform(:ios)

platform :ios do
  before_all do
    unlock
  end

  desc "Build stage"
  lane :build do
    match
    prepare_build
    gym
  end

  desc "Prepare build stage: carthage and cocoapods"
  lane :prepare_build do
    pathCartfile = ""
    Dir.chdir("..") do
      pathCartfile = File.join(Dir.pwd, "/Cartfile")
    end
    if File.exist?(pathCartfile)
      carthage
    end
    pathPodfile = ""
    Dir.chdir("..") do
      pathPodfile = File.join(Dir.pwd, "/Podfile")
    end
    if File.exist?(pathPodfile)
      cocoapods
    end
  end

  desc "Test stage"
  lane :test do
    scan
    xcov
  end

  desc "Sonar stage (after run test!)"
  lane :run_sonar do
    slather
    lizard
    swiftlint
    sonar
  end

  desc "Deploy to testflight stage"
  lane :deploy do
    pilot
  end

  desc "Unlock keychain"
  private_lane :unlock do
    pass = ENV['KEYCHAIN_PASSWORD']
    unlock_keychain(
      password: pass
    )
  end
end

実際、ただ必芁だったいく぀かの束葉杖ず眮換したパラメヌタの数を考慮するず、最初の Fastfile は途方もないものであるこずが刀明したした。

lane :build do
carthage(
  command: "update",
  use_binaries: false,
  platform: "ios",
  cache_builds: true)
cocoapods(
  clean: true,
    podfile: "./Podfile",
    use_bundle_exec: false)

gym(
  workspace: "MyApp.xcworkspace",
  configuration: "Release",
  scheme: "MyApp",
  clean: true,
  output_directory: "/build",
  output_name: "my-app.ipa")
end 

lane :deploy do
 pilot(
  username: "[email protected]",
  app_identifier: "com.example.app",
  dev_portal_team_id: "TEAM_ID_NUMBER_DEV",
  team_id: "ITS_TEAM_ID")
end

䞊の䟋では、指定する必芁があるパラメヌタヌの䞀郚のみです。これらは、ビルド パラメヌタヌ (スキヌマ、構成、プロビゞョニング プロファむル名)、および配垃パラメヌタヌ (開発者アカりントの Apple ID、パスワヌド、アプリケヌション ID など) です。の䞊。最初の近䌌ずしお、これらすべおのキヌを特別なファむルに眮きたす。 Gymfile, Matchfile О Appfile.

Jenkins では、ビュヌががやけず、目で簡単に読み取れる短いコマンドを呌び出すこずができたす。

# fastlane ios <lane_name>

$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy

䞇歳、私たちは玠晎らしいです

䜕を手に入れたしたかステップごずにコマンドをクリアしたす。クリヌンアップされたスクリプトは、fastlane ファむルにきちんず配眮されおいたす。喜んで、私たちは開発者に駆け寄り、必芁なものをすべおリポゞトリに远加するように頌みたした。

しかし、私たちはやがお同じ問題に遭遇するこずに気づきたした。それでも 20 個のアセンブリ スクリプトがあり、䜕らかの圢で独自の生掻を開始するこずになりたすが、スクリプトはリポゞトリに移動するため、線集がより困難になるでしょう。そしお私たちはそこにアクセスできたせんでした。そしお、䞀般的には、この方法で私たちの痛みを解決するこずは䞍可胜です。

モバむル CICD ゚クスペリ゚ンス: 倚くのモバむル アプリケヌションに XNUMX ぀のファヌストレヌン暙準を適甚

タスク #2: N 個のアプリケヌションに察しお XNUMX ぀の Fastfile を取埗する

さお、問題を解決するのはそれほど難しくないようです。倉数を蚭定しお、始めたしょう。はい、実際、それで問題は解決されたした。しかし、私たちが倱敗しおいた時点では、fastlane 自䜓の専門知識も、fastlane が蚘述されおいる Ruby の専門知識も、ネットワヌク䞊の有甚な䟋もありたせんでした。圓時、fastlane に぀いお曞いた人は皆、XNUMX ぀のアプリケヌションの䟋に限定されおいたした。ある開発者にずっお。

Fastlane は環境倉数を凊理でき、キヌチェヌンのパスワヌドを蚭定しおこれをすでに詊しおいたす。

ENV['KEYCHAIN_PASSWORD']

スクリプトを確認した結果、次の共通郚分が特定されたした。

#for build, test and deploy
APPLICATION_SCHEME_NAME=appScheme
APPLICATION_PROJECT_NAME=app.xcodeproj
APPLICATION_WORKSPACE_NAME=app.xcworkspace
APPLICATION_NAME=appName

OUTPUT_IPA_NAME=appName.ipa

#app info
APP_BUNDLE_IDENTIFIER=com.example.appName
[email protected]
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789

さお、これらのキヌを fastlane ファむルで䜿甚し始めるためには、fastlane ファむルにキヌを配信する方法を理解する必芁がありたした。 Fastlane にはこれに察する解決策がありたす。 dotenv 経由で倉数をロヌドする。ドキュメントには、さたざたな目的でキヌをロヌドするこずが重芁な堎合は、fastlane ディレクトリにいく぀かの構成ファむルを䜜成する必芁があるず蚘茉されおいたす。 .env, .env.default, .env.development.

そしお、このラむブラリを少し違った方法で䜿甚するこずにしたした。 fastlane スクリプトずそのメタ情報ではなく、ファむル内のこのアプリケヌションの䞀意のキヌを開発者のリポゞトリに配眮したしょう。 .env.appName.

自分自身 Fastfile, Appfile, Matchfile О Gymfile、別のリポゞトリに隠したした。他のサヌビスのパスワヌドキヌを含む远加ファむルがそこに隠されおいたした - .env.
䟋を芋るこずができたす ここで.

モバむル CICD ゚クスペリ゚ンス: 倚くのモバむル アプリケヌションに XNUMX ぀のファヌストレヌン暙準を適甚

CI では、呌び出しはあたり倉曎されおいたせん。特定のアプリケヌションの構成キヌが远加されおいたす。

# fastlane ios <lane_name> --env appName

$ fastlane ios build --env appName
$ fastlane ios test --env appName
$ fastlane ios run_sonar --env appName
$ fastlane ios deploy --env appName

コマンドを実行する前に、リポゞトリにスクリプトをロヌドしたす。芋た目はあたり良くありたせん:

git clone [email protected]/FastlaneCICD.git fastlane_temp

cp ./fastlane_temp/fastlane/* ./fastlane/
cp ./fastlane_temp/fastlane/.env fastlane/.env

Fastlane には、Fastfile をダりンロヌドするための゜リュヌションがありたすが、今はこの゜リュヌションを残しおおきたす。 アクション import_from_git、ただし、これは Fastfile に察しおのみ機胜し、他のファむルに察しおは機胜したせん。 「本圓に矎しい」ものが必芁な堎合は、自分で曞くこずができたす action.

Android アプリケヌションず ReactNative 甚に同様のセットが䜜成されたした。ファむルは同じリポゞトリ内にありたすが、異なるブランチにありたす。 iOS, android О react_native.

リリヌス チヌムが新しいステップを远加したい堎合、スクリプトの倉曎は MR を介しお git に蚘録されたす。壊れたスクリプトの原因を探す必芁はなくなり、䞀般に、スクリプトを壊しおみなければなりたせん。

もうそれは確かです

以前は、すべおのスクリプトの保守、曎新、曎新によるすべおの圱響の修正に時間を費やしおいたした。リリヌス時の゚ラヌやダりンタむムの原因が、ごちゃ混ぜのシェル スクリプトの䞭で远跡するのが非垞に困難な単玔なタむプミスだったずきは、非垞に残念でした。珟圚では、そのような゚ラヌは最小限に抑えられおいたす。倉曎はすべおのアプリケヌションに䞀床にロヌルアりトされたす。たた、新しいアプリケヌションをプロセスに組み蟌むには 15 分かかりたす。CI 䞊でテンプレヌト パむプラむンをセットアップし、キヌを開発者のリポゞトリに远加したす。

Fastfile for Android ずアプリケヌション眲名のポむントはただ解明されおいないようですが、蚘事が面癜ければ続きを曞きたす。コメントたたは Telegram で「この問題をどのように解決したすか」ずいうご質問やご提案をお埅ちしおおりたす。 バシキヌロワ.

出所 habr.com

コメントを远加したす