زه غواړم د فاسټ لین په کارولو سره د ګرځنده ایپسونو لپاره د دوامداره ادغام او تحویل په اړه وغږیږم. موږ څنګه په ټولو ګرځنده غوښتنلیکونو کې CI/CD پلي کوو، موږ څنګه هلته ورسیدو او په پای کې څه پیښ شوي.
په شبکه کې لا دمخه د وسیلې په اړه کافي مواد شتون لري ، کوم چې موږ په پیل کې دومره نشتوالی درلود ، نو زه به په قصدي ډول وسیله په تفصیل سره بیان نه کړم ، مګر یوازې هغه څه ته به اشاره وکړم چې موږ یې درلودل:
د چټک لین رسمي اسناد د نورو شرکتونو مثالونه موږ د فاسټلین په کارولو سره د iOS غوښتنلیکونو اسمبلۍ اتومات کوو
مقاله له دوو برخو جوړه ده:
- په شرکت کې د ګرځنده CI/CD ظهور پس منظر
- د N-Applications لپاره د CI/CD رول کولو لپاره تخنیکي حل
لومړۍ برخه د پخوانیو ورځو لپاره ډیر نوستالیا ده، او دویمه برخه یوه تجربه ده چې تاسو کولی شئ خپل ځان ته تطبیق کړئ.
دا څنګه په تاریخي توګه پیښ شوي
کال ۲۰۰۹
موږ یوازې د ګرځنده غوښتنلیکونو رامینځته کول پیل کړل ، بیا موږ د دوامداره ادغام په اړه ، د DevOps او نورو فیشني شیانو په اړه هیڅ نه پوهیږو. د هر غوښتنلیک تازه کول پخپله د پراختیا کونکي لخوا د هغه ماشین څخه راپورته شوي. او که د Android لپاره دا خورا ساده دی - راټول شوی، لاسلیک شوی .apk
او دا یې د ګوګل پراختیا کونکي کنسول ته اپلوډ کړ، بیا د iOS لپاره د Xcode له لارې د توزیع وسیله موږ ته د لوی ماښام سره پریښود - د آرشیف ډاونلوډ کولو هڅې ډیری وختونه په غلطیو پای ته رسیدلي او موږ باید بیا هڅه وکړو. دا معلومه شوه چې خورا پرمختللی پراختیا کونکی په میاشت کې څو ځله کوډ نه لیکي، بلکه غوښتنلیک خپروي.
کال ۲۰۰۹
موږ لوی شوي یو ، موږ دمخه د دې په اړه فکرونه درلودل چې څنګه پراختیا کونکي د یوې خوشې کیدو لپاره ټوله ورځ آزاد کړو ، او دوهم غوښتنلیک هم څرګند شو ، کوم چې موږ یوازې د اتومات کولو په لور هڅولي. په هماغه کال، موږ د لومړي ځل لپاره جینکنز نصب کړ او د ډارونکي سکریپټونو یوه ډله یې ولیکل، هغه ته ورته ورته ورته چې فاسټ لین په خپلو اسنادو کې ښیې.
$ 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"
بدبختانه ، تر دې دمه یوازې زموږ پراختیا کونکي پوهیدل چې دا سکریپټونه څنګه کار کوي او ولې د کیلي دا نه ختمیدونکي سټیک ته اړتیا ده ، او کله چې یو څه بیا مات شو ، دوی د لاګونو تحلیل لپاره "ښکلي ماښام" ترلاسه کړل.
کال ۲۰۰۹
سږکال موږ پوه شو چې د فاسټ لین په څیر یو شی شتون لري. دومره معلومات نه وو لکه څنګه چې اوس شتون لري - څنګه یې پیل کړئ، څنګه یې وکاروئ. او پخپله وسیله په هغه وخت کې لاهم خامه وه: دوامداره تېروتنې یوازې موږ مایوسه کړي او په هغه جادویی اتوماتیک باور کول سخت وو چې دوی یې ژمنه کړې وه.
په هرصورت، د فاسټ لین کور کې شامل شوي اصلي اسانتیاوې دي gym
и pilot
، موږ وکولی شو دا پیل کړو.
زموږ سکریپټونه یو څه ښه شوي.
$ fastlane gym —-workspace "Example.xcworkspace"
--scheme "AppName"
—-buildlog_path "/tmp"
-—clean
دوی ښه شوي، که یوازې د دې لپاره چې ټول اړین پیرامیټونه نه وي xcodebuild
، تاسو اړتیا لرئ په ګوته کړئ - gym
په خپلواکه توګه به پوه شي چې چیرته او څه دي. او د لا ښه ټیوننګ لپاره ، تاسو کولی شئ ورته کیلي په کې مشخص کړئ xcodebuild
، یوازې د کیلي نومونه روښانه دي.
دا ځل ، د جیم او جوړ شوي xcpretty فارمیټ څخه مننه ، د جوړونې لاګونه خورا ډیر د منلو وړ شوي. دا د مات شوي مجلسونو په فکس کولو کې د وخت خوندي کولو پیل وکړ، او ځینې وختونه د خوشې کولو ټیم کولی شي دا پخپله معلومه کړي.
له بده مرغه، د مجلس سرعت اندازه کول xcodebuild
и gym
موږ دا نه دي کړي، مګر موږ به په اسنادو باور وکړو - تر 30٪ سرعت پورې.
د ټولو غوښتنلیکونو لپاره واحد پروسه
2018 کال او اوسنی
په 2018 کې، د غوښتنلیکونو جوړولو او جوړولو پروسه په بشپړه توګه جینکنز ته لیږدول شوې، پراختیا کونکو د دوی ماشینونو څخه خوشې کول بند کړل، او یوازې د خوشې کولو ټیم د خوشې کولو حق درلود.
موږ دمخه د ازموینو او جامد تحلیلونو پیل کولو ته وده ورکول غوښتل ، او زموږ سکریپټونه وده او وده کوي. زموږ د غوښتنلیکونو سره وده او بدله شوه. په هغه وخت کې شاوخوا 10 غوښتنلیکونه وو چې موږ دوه پلیټ فارمونه لرو، دا شاوخوا 20 "ژوندی" سکریپټونه دي.
هرکله چې موږ غوښتل په سکریپټ کې یو نوی ګام اضافه کړو، موږ باید ټوټې په ټولو شیل سکریپټونو کې کاپي پیسټ کړو. شاید موږ ډیر په دقت سره کار کړی وای ، مګر ډیری وختونه دا ډول بدلونونه په ټایپو کې پای ته رسیدلي ، کوم چې د خوشې ټیم لپاره ماښام بدل شو ترڅو سکریپټونه سم کړي او معلومه کړي چې کوم هوښیار سړي دا کمانډ اضافه کړی او دا واقعیا څه کوي. په عموم کې ، دا نشي ویل کیدی چې د یو پلیټ فارم لپاره د مجلس لپاره سکریپټونه لږترلږه یو څه ورته وو. که څه هم دوی یقینا ورته کار کړی.
د نوي غوښتنلیک لپاره د پروسې پیل کولو لپاره ، دا اړینه وه چې د دې سکریپټونو "تازه" نسخه غوره کولو لپاره یوه ورځ مصرف کړئ ، ډیبګ وکړئ او ووایاست چې "هو ، دا کار کوي."
د 2018 په دوبي کې، موږ یو ځل بیا د لا پراختیایي فاسټ لین په لور وکتل.
دنده # 1: د سکریپټ ټول مرحلې لنډیز کړئ او په فاسټ فایل کې یې بیا ولیکئ
کله چې موږ پیل وکړ، زموږ سکریپټونه د فوټ کلاټ په څیر ښکاري چې په جینکنز کې په یوه شیل سکریپټ کې ټول مرحلې او کرچونه لري. موږ لا تر اوسه پایپ لاین او د مرحلې له مخې ویش ته نه یو تللي.
موږ هغه څه وګورو چې موږ یې لرو او 4 مرحلې مو په ګوته کړې چې زموږ د CI/CD توضیحاتو سره سمون لري:
- جوړول - د انحصارونو نصبول، آرشیف راټولول،
- ازموینه - د پراختیا کونکي واحد ازموینې پرمخ وړل ، د پوښښ محاسبه کول ،
- سونار - ټول لینټرونه پیلوي او سونار کیوب ته راپورونه لیږي،
- ځای په ځای کول - الفا (TestFlight) ته د هنري اثارو لیږل.
او که تاسو توضیحاتو ته نه ځئ ، په عملونو کې کارول شوي کلیدونه پریږدئ ، تاسو به دا فاسټ فایل ترلاسه کړئ:
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
په حقیقت کې ، زموږ لومړی فاسټ فایل بدمرغه وګرځید ، د ځینې کرچونو په پام کې نیولو سره چې موږ لاهم ورته اړتیا لرو او د پیرامیټونو شمیر چې موږ یې ځای په ځای کړی:
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
په پورته مثال کې، د پیرامیټونو یوازې یوه برخه چې موږ یې مشخص کولو ته اړتیا لرو: دا د جوړونې پیرامیټونه دي - سکیما، ترتیب، د چمتو کولو پروفایل نومونه، او همدارنګه د توزیع پیرامیټونه - د پراختیا کونکي حساب ایپل ID، پاسورډ، غوښتنلیک ID، او داسې نور. پر د لومړي اټکل په توګه، موږ دا ټولې کیلي په ځانګړو فایلونو کې واچوو - Gymfile
, Matchfile
и Appfile
.
اوس په جینکنز کې تاسو کولی شئ لنډ حکمونو ته زنګ ووهئ چې لید نه روښانه کوي او په اسانۍ سره د سترګو لخوا لوستل کیږي:
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
هوری، موږ ښه یو
څه مو ترلاسه کړل؟ د هر ګام لپاره پاک حکمونه. پاک شوي سکریپټونه، په چټکۍ سره په فاسټ لین فایلونو کې تنظیم شوي. په خوښۍ سره، موږ پراختیا کونکو ته ورغلو چې له دوی څخه یې وغوښتل چې هرڅه چې دوی ورته اړتیا لري د دوی ذخیره کې اضافه کړي.
مګر موږ د وخت په تیریدو پوه شو چې موږ به د ورته ستونزو سره مخ شو - موږ به لاهم د مجلس 20 سکریپټونه ولرو چې په یو یا بل ډول به خپل ژوند پیل کړي ، د دوی ترمیم کول به خورا ستونزمن وي ، ځکه چې سکریپټونه به ذخیره کولو ته لاړ شي ، او موږ هلته لاسرسی نه درلود. او، په عموم کې، دا به ممکنه نه وي چې زموږ درد په دې توګه حل کړي.
دنده #2: د N غوښتنلیکونو لپاره یو واحد فاسټ فایل ترلاسه کړئ
اوس داسې ښکاري چې د ستونزې حل کول دومره ستونزمن ندي - متغیرات تنظیم کړئ، او راځئ چې لاړ شو. هو، په حقیقت کې، دا څنګه ستونزه حل شوه. مګر په اوس وخت کې چې موږ دا خرابه کړه، موږ نه پخپله په فاسټ لین کې تخصص درلود، نه په روبي کې، په کوم کې چې فاسټ لین لیکل کیږي، او نه په شبکه کې ګټور مثالونه - هرڅوک چې د فاسټ لین په اړه لیکلي نو د یو غوښتنلیک لپاره یو مثال پورې محدود و. یو پرمخ وړونکی.
فاسټلین کولی شي د چاپیریال تغیرات اداره کړي، او موږ دمخه د کیچین پاسورډ په ترتیبولو سره دا هڅه کړې ده:
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
اوس، د دې لپاره چې په فاسټ لین فایلونو کې د دې کلیدونو کارول پیل کړو، موږ باید دا معلومه کړو چې څنګه یې هلته وړاندې کړو. فاسټلین د دې لپاره حل لري: .env
, .env.default
, .env.development
.
او بیا موږ پریکړه وکړه چې دا کتابتون یو څه بل ډول وکاروو. راځئ چې د پراختیا کونکو ذخیره کې د فاسټ لین سکریپټ او د هغې میټا معلومات ځای په ځای کړو ، مګر په فایل کې د دې غوښتنلیک ځانګړي کیلي .env.appName
.
خپل ځان Fastfile
, Appfile
, Matchfile
и Gymfile
، موږ دا په جلا ذخیره کې پټ کړ. د نورو خدماتو څخه د پټنوم کیلي سره یو اضافي فایل هلته پټ شوی و - .env
.
تاسو کولی شئ یو مثال وګورئ
په 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
دا حل د اوس لپاره پریږدئ ، که څه هم فاسټلین د فاسټ فایل ډاونلوډ کولو لپاره حل لري import_from_git
، مګر دا یوازې د فاسټ فایل لپاره کار کوي ، مګر د نورو فایلونو لپاره نه. که تاسو "ریښتیا ښکلی" غواړئ، تاسو کولی شئ خپل ځان ولیکئ action
.
ورته سیټ د Android غوښتنلیکونو او ReactNative لپاره جوړ شوی و ، فایلونه په ورته ذخیره کې دي ، مګر په بیلابیلو څانګو کې iOS
, android
и react_native
.
کله چې د خوشې کولو ټیم غواړي یو څه نوي مرحلې اضافه کړي ، په سکریپټ کې بدلونونه د MR له لارې په git کې ثبت شوي ، نور اړتیا نشته چې د مات شوي سکریپټونو مجرمینو لټون وکړئ ، او په عموم کې ، اوس تاسو باید د ماتولو هڅه وکړئ.
اوس دا د ډاډ لپاره دی
مخکې، موږ د ټولو سکریپټونو ساتلو، د دوی تازه کولو او د تازه معلوماتو ټولې پایلې حل کولو وخت تیر کړ. دا خورا مایوسه کونکی و کله چې په ریلیزونو کې د غلطیو او ځنډیدو لاملونه ساده ټایپونه وو چې د شیل سکریپټونو په ګډوډۍ کې تعقیب ساتل خورا ستونزمن وو. اوس دا ډول تېروتنې لږ تر لږه کمې شوې دي. بدلونونه په یو وخت کې ټولو غوښتنلیکونو ته لیږدول کیږي. او دا 15 دقیقې وخت نیسي ترڅو پروسې ته نوی غوښتنلیک واچوي - په CI کې د ټیمپلیټ پایپ لاین تنظیم کړئ او د پراختیا کونکي ذخیره کې کیلي اضافه کړئ.
داسې بریښي چې د Android او غوښتنلیک لاسلیک لپاره د فاسټ فایل سره ټکی ناڅرګند پاتې دی؛ که مقاله په زړه پوري وي ، زه به دوام ولیکم. زه به خوښ شم چې ستاسو پوښتنې یا وړاندیزونه "تاسو دا ستونزه څنګه حل کړئ" په نظرونو یا ټیلیګرام کې وګورئ
سرچینه: www.habr.com