මම fastlane භාවිතයෙන් ජංගම යෙදුම් සඳහා අඛණ්ඩ ඒකාබද්ධ කිරීම සහ බෙදා හැරීම ගැන කතා කිරීමට කැමතියි. අපි සියලුම ජංගම යෙදුම්වල CI/CD ක්රියාත්මක කරන්නේ කෙසේද, අප එහි ගිය ආකාරය සහ අවසානයේ සිදු වූ දේ.
මෙවලමෙහි ජාලයේ දැනටමත් ප්රමාණවත් ද්රව්ය ඇත, එය ආරම්භයේ දී අපට එතරම් අඩු නොවීය, එබැවින් මම හිතාමතාම මෙවලම විස්තරාත්මකව විස්තර නොකරමි, නමුත් අපි එවකට තිබූ දේ පමණක් සඳහන් කරමි:
නිල ෆාස්ට්ලේන් ලියකියවිලි වෙනත් සමාගම් වලින් උදාහරණ අපි Fastlane භාවිතයෙන් iOS යෙදුම් එකලස් කිරීම ස්වයංක්රීය කරන්නෙමු
ලිපිය කොටස් දෙකකින් සමන්විත වේ:
- සමාගම තුළ ජංගම CI/CD මතුවීමේ පසුබිම
- N-යෙදුම් සඳහා CI/CD නිකුත් කිරීම සඳහා තාක්ෂණික විසඳුම
පළමු කොටස පැරණි දින සඳහා වඩාත් නොස්ටැල්ජියා වන අතර, දෙවන කොටස ඔබටම අදාළ කරගත හැකි අත්දැකීමකි.
එය ඓතිහාසිකව සිදුවූයේ එලෙසය
වසර 2015
අපි ජංගම යෙදුම් සංවර්ධනය කිරීමට පටන් ගත්තා, පසුව අපි අඛණ්ඩ ඒකාබද්ධ කිරීම, DevOps සහ වෙනත් විලාසිතාමය දේවල් ගැන කිසිවක් දැන සිටියේ නැත. සෑම යෙදුම් යාවත්කාලීනයක්ම සංවර්ධකයා විසින්ම ඔහුගේ යන්ත්රයෙන් නිකුත් කරන ලදී. ඇන්ඩ්රොයිඩ් සඳහා එය තරමක් සරල නම් - එකලස් කර, අත්සන් කර ඇත .apk
සහ එය Google Developer Console වෙත උඩුගත කරන ලදී, පසුව iOS සඳහා Xcode හරහා බෙදා හැරීමේ මෙවලම අපට මහත් සන්ධ්යාවක් ඉතිරි කළේය - සංරක්ෂිතය බාගත කිරීමේ උත්සාහයන් බොහෝ විට දෝෂ වලින් අවසන් වූ අතර අපට නැවත උත්සාහ කිරීමට සිදු විය. වඩාත්ම දියුණු සංවර්ධකයා මසකට කිහිප වතාවක් කේතය ලියන්නේ නැත, නමුත් යෙදුම මුදා හරින බව පෙනී ගියේය.
වසර 2016
අපි හැදී වැඩුණෙමු, නිකුතුවක් සඳහා මුළු දවසම සංවර්ධකයින් නිදහස් කරන්නේ කෙසේද යන්න පිළිබඳව අපට දැනටමත් සිතුවිලි තිබුණි, දෙවන යෙදුමක් ද දර්ශනය විය, එය අපව ස්වයංක්රීයකරණය දෙසට තල්ලු කළේය. එම වසරේම, අපි ප්රථම වරට ජෙන්කින්ස් ස්ථාපනය කර, එහි ලේඛනගත කිරීමේදී ෆාස්ට්ලේන් පෙන්වන ඒවාට බොහෝ සමාන බියජනක ස්ක්රිප්ට් රාශියක් ලිව්වෙමු.
$ 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
මේ අවුරුද්දේ අපි දැනගත්තා ෆාස්ට්ලේන් කියලා දෙයක් තියෙනවා කියලා. දැන් තරම් තොරතුරු තිබුණේ නැහැ - එකක් ආරම්භ කරන්නේ කෙසේද, එය භාවිතා කරන්නේ කෙසේද. ඒ වන විටත් මෙවලමම ගොරෝසු විය: නිරන්තර දෝෂ අපව කලකිරීමට පත් කළ අතර ඔවුන් පොරොන්දු වූ ඉන්ද්රජාලික ස්වයංක්රීයකරණය විශ්වාස කිරීම දුෂ්කර විය.
කෙසේ වෙතත්, ෆාස්ට්ලේන් හරයට ඇතුළත් කර ඇති ප්රධාන උපයෝගිතා වේ 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: සියලුම ස්ක්රිප්ට් පියවර සාරාංශ කර ඒවා Fastfile හි නැවත ලියන්න
අපි ආරම්භ කරන විට, අපගේ තිර රචනය ජෙන්කින්ස් හි එක් ෂෙල් පිටපතක සියලුම පියවර සහ කිහිලිකරු වලින් සමන්විත පාද රෙද්දක් මෙන් දිස් විය. අපි තවමත් නල මාර්ගයට සහ අදියරෙන් බෙදීමට මාරු වී නැත.
අපි අප සතුව ඇති දේ දෙස බලා අපගේ CI/CD විස්තරයට ගැලපෙන පියවර 4ක් හඳුනා ගත්තෙමු:
- ගොඩනැගීම - පරායත්තතා ස්ථාපනය කිරීම, ලේඛනාගාරය එකලස් කිරීම,
- පරීක්ෂණය - සංවර්ධක ඒකක පරීක්ෂණ ධාවනය කිරීම, ආවරණය ගණනය කිරීම,
- සෝනාර් - සියලුම ලින්ටර් දියත් කර වාර්තා SonarQube වෙත යවයි,
- deploy — කෞතුක වස්තුවක් ඇල්ෆා වෙත යැවීම (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, මුරපදය, යෙදුම් හැඳුනුම්පත සහ යනාදිය. මත. පළමු ආසන්න වශයෙන්, අපි මෙම සියලු යතුරු විශේෂ ගොනු තුළ තබමු - Gymfile
, Matchfile
и Appfile
.
දැන් ජෙන්කින්ස් හි ඔබට දර්ශනය බොඳ නොවන සහ ඇසට පහසුවෙන් කියවිය හැකි කෙටි විධාන ඇමතීමට හැකිය:
# fastlane ios <lane_name>
$ fastlane ios build
$ fastlane ios test
$ fastlane ios run_sonar
$ fastlane ios deploy
හුරේ, අපි නියමයි
ඔබට ලැබුණේ කුමක්ද? සෑම පියවරක් සඳහාම විධාන පැහැදිලි කරන්න. ස්ක්රිප්ට් පිරිසිදු කර, ෆාස්ට්ලේන් ගොනුවල පිළිවෙලට සකසා ඇත. ප්රීතියෙන්, අපි සංවර්ධකයින් වෙත දිව ගියේ ඔවුන්ට අවශ්ය සියල්ල ඔවුන්ගේ ගබඩාවලට එක් කරන ලෙස ඉල්ලා සිටිමු.
නමුත් කාලයාගේ ඇවෑමෙන් අපට එම දුෂ්කරතාවලට මුහුණ දීමට සිදුවනු ඇති බව අපට වැටහුණි - එක් ආකාරයකින් හෝ වෙනත් ආකාරයකින් ඔවුන්ගේම ජීවිතයක් ගත කිරීමට පටන් ගන්නා එකලස් කිරීමේ ස්ක්රිප්ට් 20 ක් අප සතුව ඇත, ඒවා සංස්කරණය කිරීම වඩා දුෂ්කර වනු ඇත, මන්ද ස්ක්රිප්ට් ගබඩා වෙත මාරු වනු ඇත. අපට එහි ප්රවේශය නොතිබුණි. තවද, පොදුවේ ගත් කල, අපගේ වේදනාව මේ ආකාරයෙන් විසඳා ගැනීමට නොහැකි වනු ඇත.
කාර්යය #2: N යෙදුම් සඳහා තනි Fastfile එකක් ලබා ගන්න
දැන් ගැටළුව විසඳීම එතරම් අපහසු නොවන බව පෙනේ - විචල්යයන් සකසන්න, අපි යමු. ඔව්, ඇත්ත වශයෙන්ම, ගැටලුව විසඳා ඇත්තේ එලෙස ය. නමුත් අපි එය අවුල් කරන මොහොතේ, අපට ෆාස්ට්ලේන් ගැනවත්, ෆාස්ට්ලේන් ලියා ඇති රූබි ගැනවත්, ජාලයේ ප්රයෝජනවත් උදාහරණවත් නොතිබුණි - එවකට ෆාස්ට්ලේන් ගැන ලියූ සෑම කෙනෙකුම එක් යෙදුමකට උදාහරණයකට සීමා විය. එක් සංවර්ධකයෙකු සඳහා.
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
[email protected]
TEAM_ID=ABCD1234
FASTLANE_ITC_TEAM_ID=123456789
දැන්, ෆාස්ට්ලේන් ගොනු තුළ මෙම යතුරු භාවිතා කිරීම ආරම්භ කිරීම සඳහා, අපට ඒවා එහි ලබා දෙන්නේ කෙසේදැයි සොයා ගැනීමට සිදු විය. Fastlane හි මේ සඳහා විසඳුමක් ඇත: .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
Fastfile හරහා බාගැනීම සඳහා Fastlane හි විසඳුමක් තිබුණද, දැනට මෙම විසඳුම අත්හැරිය import_from_git
, නමුත් එය Fastfile සඳහා පමණක් ක්රියා කරයි, නමුත් වෙනත් ගොනු සඳහා නොවේ. ඔබට "ඇත්තටම ලස්සන" අවශ්ය නම්, ඔබට ඔබේම ලිවිය හැකිය action
.
Android යෙදුම් සහ ReactNative සඳහා සමාන කට්ටලයක් සාදන ලදී, ගොනු එකම ගබඩාවේ, නමුත් විවිධ ශාඛා වල ඇත iOS
, android
и react_native
.
මුදා හැරීමේ කණ්ඩායමට නව පියවරක් එක් කිරීමට අවශ්ය වූ විට, ස්ක්රිප්ටයේ වෙනස්කම් Git හි MR හරහා පටිගත කරනු ලැබේ, කැඩුණු ස්ක්රිප්ට් වල වැරදිකරුවන් සෙවීමට තවදුරටත් අවශ්ය නොවේ, සාමාන්යයෙන්, දැන් ඔබ එය බිඳ දැමීමට උත්සාහ කළ යුතුය.
දැන් ඒක සහතිකයි
මීට පෙර, අපි සියලුම ස්ක්රිප්ට් නඩත්තු කිරීමට, ඒවා යාවත්කාලීන කිරීමට සහ යාවත්කාලීනවල සියලු ප්රතිවිපාක නිවැරදි කිරීමට කාලය ගත කළෙමු. නිකුතු වල දෝෂ සහ අක්රිය වීමට හේතු වූ ෂෙල් ස්ක්රිප්ට් වල අවුල් සහගත බව නිරීක්ෂණය කිරීමට අපහසු වූ සරල ටයිප්ස් වූ විට එය ඉතා බලාපොරොත්තු සුන් විය. දැන් එවැනි දෝෂ අවම මට්ටමකට අඩු කර ඇත. සියලුම යෙදුම් වෙත එකවර වෙනස්කම් සිදු කෙරේ. නව යෙදුමක් ක්රියාවලියට ඇතුළත් කිරීමට මිනිත්තු 15 ක් ගතවේ - CI මත අච්චු නල මාර්ගයක් සකසා සංවර්ධකයාගේ ගබඩාවට යතුරු එක් කරන්න.
ඇන්ඩ්රොයිඩ් සඳහා Fastfile සහ යෙදුම් අත්සන සමඟ ඇති කරුණ පැහැදිලි කර නොමැති බව පෙනේ; ලිපිය සිත්ගන්නාසුළු නම්, මම දිගටම ලියන්නෙමි. ඔබේ ප්රශ්න හෝ යෝජනා “ඔබ මෙම ගැටලුව විසඳන්නේ කෙසේද” යන්න අදහස් දැක්වීමේදී හෝ ටෙලිග්රාම් හි දැකීමට මම සතුටු වෙමි.
මූලාශ්රය: www.habr.com