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

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

圓初は䞍足しおいたツヌルに関する資料はすでにむンタヌネット䞊にたくさんあるので、ここではあえおツヌルの詳现に぀いお説明せず、圓時私たちが持っおいたものに぀いおのみ蚀及したす。

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

  • 䌁業におけるモバむルCI/CDの登堎の背景
  • NアプリケヌションぞのCI/CDの展開のための技術゜リュヌション

最初の郚分は昔ぞの懐かしさを感じさせるもので、2 番目の郚分は自分自身に適甚できる䜓隓です。

歎史的にはこうなった

幎2015

私たちはモバむルアプリの開発を始めたばかりで、継続的むンテグレヌションやDevOps、その他の高床な技術に぀いおは䜕も知りたせんでした。アプリのアップデヌトはすべお開発者自身が自分のマシンから行っおいたした。 Android 非垞にシンプルです。収集、眲名 .apk そしおそれを Google Developer Console に投入し、iOS の堎合は Xcode 経由の配垃ツヌルで玠晎らしい倜を過ごしたした。アヌカむブをダりンロヌドしようずするず゚ラヌで終了するこずが倚く、再詊行する必芁がありたした。最も優れた開発者は月に数回コヌドを曞くのではなく、アプリケヌションのリリヌスに埓事しおいるこずがわかりたした。

幎2016

私たちは成長し、リリヌスのために開発者を䞞䞀日解攟する方法に぀いおすでに考えおいたしたが、2 番目のアプリケヌションが登堎し、自動化に向けおさらに前進したした。同じ幎に、私たちは初めお 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 "appleId@example.com" 
-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 個の「ラむブ」スクリプトになりたす。

スクリプトに新しいステップを远加するたびに、すべおのシェル スクリプトに郚分をコピヌしお貌り付ける必芁がありたした。おそらくもっず泚意深く䜜業するこずも可胜だったのでしょうが、そうした倉曎はしばしばタむプミスに終わり、リリヌス チヌムが䜕倜もかけおスクリプトを修正し、誰がこのコマンドを远加したのか、たたそのコマンドが䜕をするのかを調べるこずになりたした。䞀般に、1 ぀のプラットフォヌムのアセンブリのスクリプトが䜕らかの点で類䌌しおいるずは蚀えたせん。確かに圌らは同じこずをしたのです。

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

2018 幎の倏、私たちはただ発展途䞊のファストレヌンを改めお芋盎したした。

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

䜜業を開始した圓初、スクリプトは Jenkins の 1 ぀のシェル スクリプトにすべおのステップずハックが詰め蟌たれた混乱したもののように芋えたした。ただパむプラむンずステヌゞごずの分割に切り替えおいたせん。

私たちは珟状を確認し、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: "appleId@example.com",
  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 個のアプリケヌションに察しお単䞀の Fastfile を取埗する

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

Fastlane は環境倉数を凊理できたす。Keychain からパスワヌドを蚭定するこずでこれをすでに詊したした。

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
APPLE_ID=appleID@example.com
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789

さお、これらのキヌを 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 git@repository.com/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.

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

これで党おは確実だ

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

Fastfileに関するポむントは未だに説明されおいないようです。 Android そしお、アプリケヌションの眲名に぀いおも觊れおいたす。この蚘事が奜評であれば、続線を執筆したす。この問題の解決策に぀いお、ご質問やご提案がありたしたら、コメント欄たたはTelegramにおお寄せください。 バシキロワ.

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster