Эволютсияи CI дар дастаи рушди мобилӣ

Имрӯз, аксари маҳсулоти нармафзор дар гурӯҳҳо таҳия карда мешаванд. Шароити инкишофи бомуваффакияти коллективро дар шакли диаграммаи оддй нишон додан мумкин аст.

Эволютсияи CI дар дастаи рушди мобилӣ

Пас аз он ки шумо рамзи худро навиштед, шумо бояд боварӣ ҳосил кунед:

  1. Корҳо.
  2. Он чизеро вайрон намекунад, аз ҷумла коди ҳамкасбони шумо.

Агар ҳарду шарт иҷро шуда бошад, пас шумо дар роҳи муваффақият ҳастед. Барои ба осонӣ тафтиш кардани ин шартҳо ва аз роҳи фоидаовар дур нашавед, мо бо ҳамгироии доимӣ баромадем.

CI ҷараёни корест, ки дар он шумо рамзи худро ба рамзи умумии маҳсулот ҳарчи зудтар ворид мекунед. Ва шумо на танҳо муттаҳид мешавед, балки мунтазам тафтиш мекунед, ки ҳама чиз кор мекунад. Азбаски шумо бояд бисёр ва зуд-зуд тафтиш кунед, дар бораи автоматизатсия фикр кардан меарзад. Шумо метавонед ҳама чизро дастӣ тафтиш кунед, аммо шумо набояд ин корро кунед ва ин аст, ки чаро.

  • Мардуми азиз. Як соати кори ягон барномасоз аз як соати кори ягон сервер гаронтар аст.
  • Одамон хато мекунанд. Аз ин рӯ, ҳолатҳое метавонанд ба миён оянд, ки санҷишҳо дар филиали нодуруст гузаронида шуда бошанд ё ӯҳдадориҳои нодуруст барои озмоишгарон тартиб дода шаванд.
  • Одамон танбаланд. Гоҳ-гоҳе, ки як кореро анҷом медиҳам, фикре ба миён меояд: «Чӣ бояд тафтиш кард? Ман ду сатр навиштам - ҳама чиз кор мекунад! Ман фикр мекунам, ки баъзеи шумо низ баъзан чунин фикрҳо доранд. Аммо шумо бояд ҳамеша тафтиш кунед.

Чӣ тавр Интегратсияи муттасил дар гурӯҳи таҳияи мобилии Avito татбиқ ва таҳия карда шуд, чӣ гуна онҳо дар як рӯз аз 0 то 450 сохтмон гузаштанд ва мошинҳои созанда дар як рӯз 200 соат ҷамъ мешаванд, мегӯяд Николай Нестеров (нестеров) иштирокчии ҳама тағйироти эволютсионии замимаи CI/CD Android мебошад.

Ҳикоя ба мисоли фармони Android асос ёфтааст, аммо аксари равишҳо дар iOS низ татбиқ мешаванд.


Боре як нафар дар дастаи Avito Android кор мекард. Аз рӯи таъриф, ба ӯ чизе аз ҳамгироии муттасил лозим набуд: касе набуд, ки бо он ҳамгиро шавад.

Аммо барнома афзоиш ёфт, вазифаҳои нав ба нав пайдо шуданд ва даста мувофиқан афзоиш ёфт. Дар баъзе мавридҳо вақти он расидааст, ки раванди интегратсияи кодро ба таври расмӣ таъсис диҳед. Қарор дода шуд, ки ҷараёни Git истифода шавад.

Эволютсияи CI дар дастаи рушди мобилӣ

Консепсияи ҷараёни Git ба ҳама маълум аст: лоиҳа як шохаи умумии таҳия дорад ва барои ҳар як хусусияти нав, таҳиягарон як шохаи алоҳидаро бурида, ба он итоат мекунанд, тела медиҳанд ва ҳангоме ки мехоҳанд коди худро ба филиали таҳиякунанда ҳамроҳ кунанд, кушодани дархост кашед. Барои мубодилаи дониш ва баррасии равишҳо, мо баррасии кодро ҷорӣ кардем, яъне ҳамкорон бояд рамзи ҳамдигарро тафтиш ва тасдиқ кунанд.

Чекҳо

Дидани код бо чашмони худ хуб аст, аммо кофӣ нест. Аз ин рӯ, санҷишҳои автоматӣ ҷорӣ карда мешаванд.

  • Пеш аз ҳама, мо тафтиш мекунем Ассамблеяи ARK.
  • Бисёр Санҷишҳои Junit.
  • Мо фарогирии кодро баррасӣ мекунем, зеро мо озмоишҳо мегузаронем.

Барои фаҳмидани он, ки ин санҷишҳо чӣ гуна бояд иҷро карда шаванд, биёед ба раванди таҳияи Avito назар кунем.

Онро ба таври схематикӣ чунин тасвир кардан мумкин аст:

  • Таҳиягар дар ноутбуки худ код менависад. Шумо метавонед чекҳои ҳамгироиро дар ин ҷо иҷро кунед - ё бо қалмоқе, ё танҳо чекҳоро дар замина иҷро кунед.
  • Пас аз он ки таҳиякунанда кодро пахш кард, ӯ дархости кашиданро мекушояд. Барои он ки коди он ба филиали таҳия дохил карда шавад, аз баррасии код гузаштан ва миқдори зарурии тасдиқҳоро ҷамъ кардан лозим аст. Шумо метавонед чекҳо ва сохтмонҳоро дар ин ҷо фаъол созед: то он даме, ки ҳама сохтмонҳо муваффақ шаванд, дархости кашидан наметавонад якҷоя карда шавад.
  • Пас аз муттаҳид шудани дархости кашидан ва рамз дар таҳия, шумо метавонед вақти мувофиқро интихоб кунед: масалан, шабона, вақте ки ҳама серверҳо ройгонанд ва ҳар қадар, ки мехоҳед, тафтиш кунед.

Ҳеҷ кас иҷро кардани сканҳоро дар ноутбуки худ дӯст намедошт. Вақте ки таҳиякунанда хусусиятро ба итмом расонд, вай мехоҳад онро зуд тела диҳад ва дархости кашиданро кушояд. Агар дар айни замон якчанд санҷишҳои тӯлонӣ оғоз карда шаванд, ин на танҳо хеле гуворо нест, балки рушди онро низ суст мекунад: вақте ки ноутбук чизеро тафтиш мекунад, дар он муқаррарӣ кор кардан ғайриимкон аст.

Шабона гузаронидани чекҳо ба мо хеле маъқул буд, зеро вақт ва серверҳо зиёданд, шумо метавонед дар атрофи он сайр кунед. Аммо, мутаассифона, вақте ки рамзи хусусият таҳия мешавад, таҳиякунанда барои ислоҳи хатогиҳое, ки CI пайдо кардааст, ҳавасмандии камтар дорад. Ман давра ба давра худам фикр мекардам, ки вақте ки ман ба ҳамаи хатогиҳои дар гузориши саҳарӣ пайдошуда нигоҳ мекардам, ки ман онҳоро рӯзе баъд ислоҳ мекунам, зеро ҳоло дар Ҷира як вазифаи нави аҷибе ҳаст, ки ман мехоҳам онро оғоз кунам.

Агар чекҳо дархости кашиданро манъ кунанд, он гоҳ ҳавасмандии кофӣ вуҷуд дорад, зеро то даме ки сохтмонҳо сабз шаванд, код ба таҳия намеояд, яъне ин маънои онро дорад, ки вазифа иҷро намешавад.

Дар натиҷа, мо стратегияи зеринро интихоб кардем: мо маҷмӯи максималии имконпазири чекҳоро шабона иҷро мекунем ва аз ҳама муҳимтарини онҳо ва муҳимтар аз ҳама, зудтаринро дар дархости ҷалб оғоз мекунем. Аммо мо дар ин ҷо бас намекунем - дар баробари ин, мо суръати чекҳоро оптимизатсия мекунем, то онҳоро аз реҷаи шабона интиқол диҳанд, то чекҳои дархостро кашанд.

Дар он вақт, ҳамаи сохтмонҳои мо хеле зуд анҷом ёфтанд, аз ин рӯ мо танҳо сохтани ARK, санҷишҳои Junit ва ҳисобҳои фарогирии кодро ҳамчун блокатор барои дархости кашидан дохил кардем. Мо онро фаъол кардем, дар бораи он фикр кардем ва фарогирии кодро тарк кардем, зеро фикр мекардем, ки ба мо лозим нест.

Барои пурра насб кардани CI-и асосӣ ба мо ду рӯз лозим шуд (минбаъд сметаи вақт тахминӣ аст, барои миқёс лозим аст).

Пас аз он, мо минбаъд фикр карданро сар кардем - оё мо ҳатто дуруст тафтиш мекунем? Оё мо дар асоси дархостҳои кашидан дуруст кор карда истодаем?

Мо сохтмонро дар охирин ӯҳдадории филиал оғоз кардем, ки аз он дархости кашидан кушода шуд. Аммо санҷишҳои ин ӯҳдадорӣ танҳо нишон медиҳанд, ки коде, ки таҳиякунанда навиштааст, кор мекунад. Аммо онҳо исбот намекунанд, ки ӯ ҳеҷ чизро вайрон накардааст. Дар асл, шумо бояд ҳолати филиали таҳияро пас аз якҷоя кардани хусусият ба он тафтиш кунед.

Эволютсияи CI дар дастаи рушди мобилӣ

Барои ин мо скрипти оддии bash навиштем premerge.sh:

#!/usr/bin/env bash

set -e

git fetch origin develop

git merge origin/develop

Дар ин ҷо ҳама тағиротҳои охирини таҳияшуда ба таври оддӣ кашида мешаванд ва ба филиали ҷорӣ муттаҳид карда мешаванд. Мо скрипти premerge.sh -ро ҳамчун қадами аввал дар ҳама сохтмонҳо илова кардем ва ба тафтиши маҳз он чизе ки мо мехоҳем, оғоз кардем, яъне интеграция.

Барои маҳаллисозӣ кардани мушкилот, ёфтани роҳи ҳал ва навиштани ин скрипт се рӯз лозим шуд.

Барнома таҳия карда шуд, вазифаҳои бештар ва бештар пайдо шуданд, даста афзоиш ёфт ва premerge.sh баъзан моро рӯҳафтода мекард. Таҳия тағйиротҳои зиддунақиз дошт, ки сохтмонро вайрон карданд.

Мисоли он, ки чӣ тавр ин рӯй медиҳад:

Эволютсияи CI дар дастаи рушди мобилӣ

Ду таҳиягар ҳамзамон ба кор дар хусусиятҳои A ва B оғоз мекунанд. Таҳиягари хусусияти A дар лоиҳа хусусияти истифоданашударо кашф мекунад answer() ва мисли скаут писари хуб онро хориҷ мекунад. Ҳамзамон, таҳиягари хусусияти B дар филиали худ ба ин функсия занги нав илова мекунад.

Таҳиягарон кори худро ба анҷом мерасонанд ва дар як вақт дархости ҷалбро мекушоянд. Сохтмонҳо оғоз карда мешаванд, premerge.sh ҳарду дархостҳои ҷалбро дар бораи ҳолати охирини таҳия тафтиш мекунад - ҳама чекҳо сабзанд. Пас аз он, дархости ҷалби хусусияти A якҷоя карда мешавад, дархости ҷалби хусусияти B якҷоя карда мешавад... Бум! Танаффусҳои таҳия, зеро рамзи таҳия дорои занг ба функсияи мавҷуд нест.

Эволютсияи CI дар дастаи рушди мобилӣ

Вақте ки он инкишоф намеёбад, он аст офати маҳаллӣ. Тамоми даста наметавонад чизе ҷамъ кунад ва онро барои санҷиш пешниҳод кунад.

Чунин шуд, ки ман аксар вақт дар вазифаҳои инфрасохторӣ кор мекардам: таҳлил, шабака, пойгоҳи додаҳо. Яъне ман он функсияҳо ва синфҳоеро навишта будам, ки дигар таҳиягарон истифода мебаранд. Аз ин сабаб, ман зуд-зуд дар чунин ҳолатҳо дучор мешудам. Ман ҳатто ин расмро муддате овезон доштам.

Эволютсияи CI дар дастаи рушди мобилӣ

Азбаски ин ба мо мувофиқ набуд, мо ба омӯхтани вариантҳо оид ба пешгирии ин кор шурӯъ кардем.

Чӣ тавр инкишофро вайрон накунед

Интихоби якум: аз нав сохтани ҳама дархостҳои кашидан ҳангоми навсозии таҳия. Агар, дар мисоли мо, дархости кашидан бо хусусияти A аввалин шуда ба таҳия дохил карда шавад, дархости кашидани хусусияти B аз нав сохта мешавад ва мувофиқан, санҷишҳо аз сабаби хатогии ҷамъоварӣ ноком мешаванд.

Барои фаҳмидани он ки ин чӣ қадар вақт мегирад, мисолро бо ду PR баррасӣ кунед. Мо ду PR мекушоем: ду сохтмон, ду санҷиш. Пас аз он ки PR-и якум ба таҳия муттаҳид карда мешавад, дуюмаш бояд аз нав сохта шавад. Дар маҷмӯъ, ду PR се санҷишро талаб мекунанд: 2 + 1 = 3.

Дар асл, ин хуб аст. Аммо мо ба омор назар кардем ва вазъияти маъмулӣ дар дастаи мо 10 PR-и кушод буд ва баъд шумораи чекҳо ҷамъи прогрессия аст: 10 + 9 +... + 1 = 55. Яъне, қабул кардани 10 PR, шумо бояд 55 маротиба аз нав барқарор кунед. Ва ин дар ҳолати беҳтарин аст, вақте ки ҳама санҷишҳо бори аввал мегузаранд, вақте ки ҳеҷ кас дархости иловагӣ намекушояд, вақте ки ин даҳҳо онҳо коркард мешаванд.

Худро ҳамчун як таҳиягар тасаввур кунед, ки бояд аввалин шуда тугмаи "муттаҳид"-ро пахш кунад, зеро агар ҳамсоя ин корро кунад, шумо бояд интизор шавед, ки ҳамаи сохтмонҳо дубора аз нав гузаранд... Не, ин кор намекунад. , инкишофро ба таври чиддй суст мекунад.

Роҳи дуюми имконпазир: ҷамъ овардани дархостҳои кашидани пас аз баррасии код. Яъне, шумо дархости ҷалбро мекушоед, шумораи зарурии тасдиқҳоро аз ҳамкорон ҷамъ мекунед, он чизеро, ки лозим аст, ислоҳ мекунед ва сипас сохтмонҳоро оғоз мекунед. Агар онҳо муваффақ бошанд, дархости кашидан ба таҳия муттаҳид карда мешавад. Дар ин ҳолат, бозсозии иловагӣ вуҷуд надорад, аммо фикру мулоҳизаҳо хеле суст карда мешаванд. Ҳамчун таҳиякунанда, вақте ки ман дархости кашиданро мекушоям, ман фавран мехоҳам бубинам, ки оё он кор мекунад. Масалан, агар санҷиш ноком шавад, шумо бояд онро зуд ислоҳ кунед. Дар сурати таъхири сохтмон, фикру мулоҳизаҳо ва аз ин рӯ тамоми рушд суст мешавад. Ин ҳам ба мо мувофиқ набуд.

Дар натиҷа, танҳо варианти сеюм боқӣ монд - велосипед. Ҳама кодҳои мо, ҳама манбаъҳои мо дар анбори сервери Bitbucket нигоҳ дошта мешаванд. Бинобар ин, мо маҷбур шудем, ки плагинро барои Bitbucket таҳия кунем.

Эволютсияи CI дар дастаи рушди мобилӣ

Ин плагин механизми якҷоякунии дархости кашиданро бекор мекунад. Оғоз стандартӣ аст: PR кушода мешавад, ҳама маҷлисҳо оғоз мешаванд, баррасии код анҷом дода мешавад. Аммо пас аз ба итмом расидани баррасии код ва таҳиякунанда қарор мекунад, ки "якҷоя" -ро клик кунад, плагинро тафтиш мекунад, ки дар он ҳолати таҳияшуда тафтиш гузаронида шудааст. Агар таҳия пас аз сохтан навсозӣ шуда бошад, плагин имкон намедиҳад, ки чунин дархости ҷалб ба филиали асосӣ якҷоя карда шавад. Он танҳо сохтмонҳои нисбатан навтаринро аз нав оғоз мекунад.

Эволютсияи CI дар дастаи рушди мобилӣ

Дар мисоли мо бо тағиротҳои зиддунақиз, чунин сохтмонҳо аз сабаби хатогии компиляция ноком мешаванд. Мутаносибан, таҳиягари хусусияти B бояд кодро ислоҳ кунад, чекҳоро аз нав оғоз кунад, пас плагин дархости кашиданро ба таври худкор татбиқ мекунад.

Пеш аз татбиқи ин плагин, мо ба ҳисоби миёна 2,7 даврони баррасии як дархости кашидан гирифтем. Бо плагин 3,6 оғоз ёфт. Ин ба мо мувофиқ буд.

Қобили зикр аст, ки ин плагин як нуқсон дорад: он танҳо як маротиба сохтмонро аз нав оғоз мекунад. Яъне, то ҳол як равзанаи хурде вуҷуд дорад, ки тавассути он тағйироти ба ҳам мухолиф ба вуҷуд омада метавонанд. Аммо эҳтимолияти ин кам аст ва мо ин муомиларо байни шумораи оғоз ва эҳтимоли нокомӣ анҷом додем. Дар ду сол хамагй як маротиба тир холй кард, аз ин ру, шояд бехуда нарафт.

Барои навиштани версияи якуми плагини Bitbucket ба мо ду ҳафта лозим шуд.

Чекхои нав

Дар ҳамин ҳол, дастаи мо афзоиш ёфт. Чекҳои нав илова карда шуданд.

Мо фикр мекардем: чаро ба хатогихо рох додан мумкин аст, агар онхоро пешгирй кардан мумкин бошад? Ва барои ҳамин онҳо амалӣ шуданд таҳлили коди статикӣ. Мо бо lint оғоз кардем, ки ба Android SDK дохил карда шудааст. Аммо он вақт ӯ бо коди Котлин чӣ гуна кор карданро умуман намедонист ва мо аллакай 75% аризаро дар Котлин навишта будем. Аз ин рӯ, дарунсохташуда ба линт илова карда шуданд Санҷишҳои Android Studio.

Барои ин, мо маҷбур шудем, ки таҳрифи зиёде кунем: Android Studio-ро гиред, онро дар Docker бастабандӣ кунед ва онро дар CI бо монитори виртуалӣ иҷро кунед, то фикр кунад, ки он дар ноутбуки воқеӣ кор мекунад. Аммо он кор кард.

Маҳз дар ҳамин давра мо бисёр навиштанро сар кардем санҷишҳои асбобҳо ва ба амал бароварда шуд санҷиши скриншот. Ин вақте аст, ки скриншоти истинод барои намуди алоҳидаи хурд тавлид мешавад ва санҷиш аз гирифтани скриншот аз намоиш ва муқоисаи он бо стандарти мустақими пиксел ба пиксел иборат аст. Агар ихтилоф вуҷуд дошта бошад, ин маънои онро дорад, ки тарҳ дар ҷое нодуруст рафтааст ё дар услубҳо чизе нодуруст аст.

Аммо санҷишҳои асбобҳо ва санҷишҳои скриншотҳо бояд дар дастгоҳҳо иҷро карда шаванд: дар эмуляторҳо ё дар дастгоҳҳои воқеӣ. Бо назардошти он, ки санчишхо бисьёранд ва онхо зуд-зуд гузаронда мешаванд, тамоми хочагй лозим аст. Оғоз кардани хоҷагии шахсии шумо хеле меҳнатталаб аст, аз ин рӯ мо як варианти тайёрро ёфтем - Firebase Test Lab.

Лабораторияи озмоишии Firebase

Он барои он интихоб карда шуд, ки Firebase маҳсулоти Google аст, яъне он бояд боэътимод бошад ва ҳеҷ гоҳ мурдан аз эҳтимол дур нест. Нархҳо оқилонаанд: $5 дар як соати кори дастгоҳи воқеӣ, 1 $ дар як соати кори эмулятор.

Татбиқи озмоишгоҳи Firebase дар CI мо тақрибан се ҳафта лозим шуд.

Аммо даста афзоишро идома дод ва Firebase, мутаассифона, моро ноумед кард. Дар он вақт, ӯ ягон SLA надошт. Баъзан Firebase моро водор сохт, ки шумораи зарурии дастгоҳҳо барои санҷишҳо озод карда шаванд ва ҳамон тавре ки мо мехостем, фавран иҷро кардани онҳоро оғоз накард. Интизорӣ дар навбат то ним соат тӯл мекашид, ки хеле тӯлонӣ аст. Санҷишҳои асбобҳо дар ҳар як PR гузаронида мешуданд, таъхирҳо воқеан рушдро суст карданд ва сипас ҳисоби ҳармоҳа бо маблағи мудаввар омад. Умуман, тасмим гирифта шуд, ки аз Firebase даст кашад ва дар дохили хона кор кунад, зеро даста ба қадри кофӣ калон шудааст.

Docker + Python + bash

Мо Docker-ро гирифтем, эмуляторҳоро ба он пур кардем, дар Python як барномаи оддӣ навишт, ки дар лаҳзаи зарурӣ шумораи зарурии эмуляторҳоро дар версияи зарурӣ меорад ва ҳангоми зарурат онҳоро қатъ мекунад. Ва, албатта, якчанд скриптҳои баш - мо бе онҳо куҷо мешудем?

Барои эҷоди муҳити санҷишии мо панҷ ҳафта лозим шуд.

Дар натиҷа, барои ҳар як дархости ҷалб рӯйхати васеъи бастани чекҳо мавҷуд буд:

  • маҷмӯи ARK;
  • Санҷишҳои Junit;
  • Линт;
  • Санҷишҳои Android Studio;
  • Санҷишҳои асбобҳо;
  • Санҷишҳои скриншот.

Ин бисьёр вайроншавии эхтимолиро пешгирй кард. Аз ҷиҳати техникӣ ҳама чиз кор мекард, аммо таҳиягарон шикоят карданд, ки интизории натиҷаҳо хеле тӯлонӣ аст.

Чӣ қадар дароз аст? Мо маълумотро аз Bitbucket ва TeamCity ба системаи таҳлил бор кардем ва дарк кардем вақти миёнаи интизорӣ 45 дақиқа. Яъне, таҳиякунанда ҳангоми кушодани дархости кашидан ба ҳисоби миёна 45 дақиқа барои натиҷаҳои сохтмон интизор мешавад. Ба андешаи ман, ин бисёр аст ва шумо ин тавр кор карда наметавонед.

Албатта, мо карор додем, ки тамоми сохт-монро тезонем.

Биёед суръатро тезонем

Вақте ки биноҳо аксар вақт дар навбат меистанд, аввалин коре, ки мо мекунем, ин аст бештар аппаратура харид — инкишофи экстенсивй содатарин аст. Сохтмонҳо навбат монданро қатъ карданд, аммо вақти интизорӣ каме кам шуд, зеро худи баъзе санҷишҳо вақти хеле дарозро талаб мекарданд.

Хориҷ кардани чекҳое, ки аз ҳад зиёд тӯл мекашанд

Интегратсияи пайвастаи мо метавонад ин гуна хатоҳо ва мушкилотро ҳал кунад.

  • намеравад. Вақте ки чизе аз сабаби тағироти ихтилофӣ сохта намешавад, CI метавонад хатогиро дар бар гирад. Тавре ки ман гуфтам, пас ҳеҷ кас чизе ҷамъ карда наметавонад, рушд қатъ мешавад ва ҳама асабонӣ мешаванд.
  • Хатогӣ дар рафтор. Масалан, вақте ки барнома сохта мешавад, аммо ҳангоми пахш кардани тугма вайрон мешавад ё тугма тамоман пахш намешавад. Ин бад аст, зеро чунин хато метавонад ба корбар дастрас шавад.
  • Хатогӣ дар тарҳрезӣ. Масалан, тугма пахш карда мешавад, аммо 10 пиксел ба тарафи чап кӯчонида шудааст.
  • Афзоиши карзи техникй.

Пас аз дидани ин рӯйхат мо фаҳмидем, ки танҳо ду нуктаи аввал муҳиманд. Мо мехоҳем, ки пеш аз ҳама чунин мушкилотро ҳал кунем. Хатогиҳо дар тарҳ дар марҳилаи баррасии тарҳ ошкор карда мешаванд ва пас аз он ба осонӣ ислоҳ кардан мумкин аст. Мубориза бо қарзи техникӣ раванд ва банақшагирии алоҳидаро талаб мекунад, аз ин рӯ мо тасмим гирифтем, ки онро дар дархости ҷалб озмоиш накунем.

Дар асоси ин тасниф, мо тамоми рӯйхати чекҳоро ба ларза овардем. Хати Линт ва ба кор андохтани онро як шабонаруз ба таъхир андохт: факат барои он ки дар бораи чй кадар проблемахо дар лоиха хисобот дода шавад. Мо розй шудем, ки бо карзи техникй алохида кор кунем, ва Санҷишҳои Android Studio комилан партофта шуданд. Android Studio дар Docker барои гузаронидани санҷишҳо ҷолиб ба назар мерасад, аммо дар дастгирӣ мушкилоти зиёдеро ба вуҷуд меорад. Ҳар як навсозии версияҳои Android Studio маънои мубориза бо хатогиҳои нофаҳмо мебошад. Дастгирии санҷишҳои скриншот низ душвор буд, зеро китобхона чандон устувор набуд ва мусбатҳои бардурӯғ мавҷуданд. Санҷишҳои скриншот аз рӯйхати санҷиш хориҷ карда шуданд.

Дар натиҷа, мо бо инҳо мондем:

  • маҷмӯи ARK;
  • Санҷишҳои Junit;
  • Санҷишҳои асбобҳо.

Кэши дурдасти Gradle

Бе санҷишҳои вазнин ҳама чиз беҳтар шуд. Аммо барои комилият маҳдудият вуҷуд надорад!

Аризаи мо аллакай ба тақрибан 150 модули градл тақсим шудааст. Кэши дурдасти Gradle одатан дар ин ҳолат хуб кор мекунад, аз ин рӯ мо тасмим гирифтем, ки онро санҷем.

Кэши дурдасти Gradle як хидматест, ки метавонад артефактҳоро барои вазифаҳои инфиродӣ дар модулҳои инфиродӣ кэш кунад. Gradle, ба ҷои дар асл тартиб додани рамз, HTTP-ро истифода мебарад, то кэши дурдастро бикӯбад ва бипурсад, ки оё касе ин вазифаро аллакай иҷро кардааст. Агар ҳа, он танҳо натиҷаро зеркашӣ мекунад.

Иҷрои кэши дурдасти Gradle осон аст, зеро Gradle тасвири Docker-ро таъмин мекунад. Мо ин корро дар зарфи се соат ичро кардем.

Ба шумо танҳо лозим буд, ки Docker -ро оғоз кунед ва дар лоиҳа як сатр нависед. Аммо гарчанде ки онро зуд ба кор андохтан мумкин аст, барои хуб кор карданаш вақти зиёдеро талаб мекунад.

Дар зер графики гумшудаи кэш оварда шудааст.

Эволютсияи CI дар дастаи рушди мобилӣ

Дар ибтидо, фоизи гум кардани кэш тақрибан 65 буд. Пас аз се ҳафта, мо тавонистем ин арзишро то 20% афзоиш диҳем. Маълум шуд, ки вазифаҳое, ки замимаи Android ҷамъоварӣ мекунад, вобастагии аҷиби гузаранда доранд, ки аз ин сабаб Gradle кэшро аз даст додааст.

Бо пайваст кардани кэш, мо сохтмонро хеле суръат додем. Аммо гайр аз монтаж, озмоишхои асбобсозй низ мавчуданд ва онхо вакти зиёдро талаб мекунанд. Шояд барои ҳар як дархости кашидан на ҳама санҷишҳо гузаронида шаванд. Барои фаҳмидани он, мо таҳлили таъсирро истифода мебарем.

Таҳлили таъсир

Бо дархости кашидан, мо git diff ҷамъ мекунем ва модулҳои тағирёфтаи Gradle-ро пайдо мекунем.

Эволютсияи CI дар дастаи рушди мобилӣ

Танҳо гузаронидани санҷишҳои асбобсозӣ, ки модулҳои тағирёфта ва ҳамаи модулҳои аз онҳо вобастаро тафтиш мекунанд, маъно дорад. Гузаронидани санҷишҳо барои модулҳои ҳамсоя ҳеҷ маъно надорад: код дар он ҷо тағир наёфтааст ва ҳеҷ чиз шикаста наметавонад.

Санҷишҳои асбобсозӣ он қадар оддӣ нестанд, зеро онҳо бояд дар модули Ариза дар сатҳи боло ҷойгир бошанд. Мо эвристикаро бо таҳлили байткод истифода мебарем, то бифаҳмем, ки ҳар як санҷиш ба кадом модул тааллуқ дорад.

Такмили кори санҷишҳои асбобсозӣ, то ки онҳо танҳо модулҳои ҷалбшударо санҷанд, тақрибан ҳашт ҳафта тӯл кашид.

Тадбирхои тезон-дани тафтиш бомуваффакият натича доданд. Аз 45 дақиқа мо тақрибан ба 15 расидем. Ин аллакай муқаррарӣ аст, ки чоряки як соат барои сохтмон интизор шавед.

Аммо ҳоло таҳиягарон шикоят карданд, ки онҳо намефаҳманд, ки кадом сохтмонҳо оғоз карда мешаванд, логро дар куҷо дидан мумкин аст, чаро сохтмон сурх аст, кадом озмоиш ноком шудааст ва ғайра.

Эволютсияи CI дар дастаи рушди мобилӣ

Мушкилот бо фикру мулоҳизаҳо рушдро суст мекунад, аз ин рӯ мо кӯшиш кардем, ки дар бораи ҳар як PR маълумоти дақиқ ва муфассал пешниҳод кунем ва то ҳадди имкон созем. Мо аз шарҳҳо дар Bitbucket ба PR оғоз кардем, ки нишон дод, ки кадом сохтмон ноком шуд ва чаро ва дар Slack паёмҳои мақсаднок навишт. Дар охир, мо барои саҳифа як панели PR офаридем, ки бо рӯйхати ҳамаи сохтмонҳое, ки дар айни замон кор мекунанд ва ҳолати онҳо: навбат, иҷро, садама ё анҷомёфта. Шумо метавонед ба сохтмон клик кунед ва ба сабти он биравед.

Эволютсияи CI дар дастаи рушди мобилӣ

Шаш ҳафта барои фикру мулоҳизаҳои муфассал сарф карда шуд.

Нақшаҳо

Биёед ба таърихи нав гузарем. Масъалаи бозгаштро ҳал карда, мо ба сатҳи нав расидем - мо тасмим гирифтем, ки фермаи эмулятори худро созем. Вақте ки санҷишҳо ва эмуляторҳои зиёд мавҷуданд, идора кардани онҳо душвор аст. Дар натиҷа, ҳамаи эмуляторҳои мо ба кластери k8s бо идоракунии чандири захираҳо кӯчиданд.

Гайр аз ин, накшахои дигар низ хастанд.

  • Бозгашти Lint (ва дигар таҳлилҳои статикӣ). Мо аллакай дар ин самт кор карда истодаем.
  • Ҳама чизро дар блокатори PR иҷро кунед санҷишҳои ниҳоӣ дар ҳама версияҳои SDK.

Ҳамин тавр, мо таърихи рушди ҳамгироии муттасил дар Авиторо пайгирӣ кардем. Ҳоло мехоҳам аз нуқтаи назари ботаҷриба чанд маслиҳат диҳам.

Маслињат

Агар ман метавонистам танҳо як маслиҳат диҳам, ин чунин хоҳад буд:

Лутфан бо скриптҳои shell эҳтиёт шавед!

Bash як воситаи хеле фасеҳ ва пурқувват аст, он барои навиштани скриптҳо хеле қулай ва зуд аст. Аммо бо он шумо метавонед ба дом афтодед ва мутаассифона, мо ба он афтодем.

Ҳамааш бо скриптҳои оддӣ, ки дар мошинҳои сохтани мо кор мекарданд, оғоз ёфт:

#!/usr/bin/env bash
./gradlew assembleDebug

Аммо, тавре ки шумо медонед, ҳама чиз бо мурури замон инкишоф меёбад ва мураккабтар мешавад - биёед як скриптро аз дигараш иҷро кунем, биёед баъзе параметрҳоро дар он ҷо гузорем - дар ниҳоят мо бояд функсияеро нависем, ки дар кадом сатҳи лонасозии мо ҳоло дар тартиб қарор дорем. иқтибосҳои заруриро ворид кунед, ҳама чизро оғоз кунед.

Эволютсияи CI дар дастаи рушди мобилӣ

Шумо метавонед хароҷоти меҳнатро барои таҳияи чунин скриптҳо тасаввур кунед. Ман ба шумо маслиҳат медиҳам, ки ба ин дом наафтед.

Чиро иваз кардан мумкин аст?

  • Ҳар як забони скрипт. Навиштан ба Python ё Kotlin Script қулайтар аст, зеро он барномасозӣ аст, на скриптҳо.
  • Ё тамоми мантиқи сохтмонро дар шакл тавсиф кунед Вазифаҳои фармоишии gradle барои лоиҳаи шумо.

Мо тасмим гирифтем, ки варианти дуюмро интихоб кунем ва ҳоло мо ҳама скриптҳои bash-ро мунтазам нест карда истодаем ва бисёр вазифаҳои фармоишии gradle менависем.

Маслиҳат №2: Инфрасохторро дар код нигоҳ доред.

Ин қулай аст, вақте ки танзимоти Интегратсияи муттасил на дар интерфейси UI Ҷенкинс ё TeamCity ва ғайра, балки дар шакли файлҳои матнӣ мустақиман дар анбори лоиҳа нигоҳ дошта мешавад. Ин версияро медиҳад. Баргардонидан ё сохтани код дар шохаи дигар душвор нахоҳад буд.

Скриптҳоро дар лоиҳа нигоҳ доштан мумкин аст. Бо муҳити зист чӣ бояд кард?

Маслиҳат №3: Docker метавонад дар муҳити зист кӯмак кунад.

Он бешубҳа ба таҳиягарони Android кӯмак хоҳад кард; мутаассифона, iOS ҳоло надорад.

Ин як мисоли файли оддии докер аст, ки дорои jdk ва android-sdk:

FROM openjdk:8

ENV SDK_URL="https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip" 
    ANDROID_HOME="/usr/local/android-sdk" 
    ANDROID_VERSION=26 
    ANDROID_BUILD_TOOLS_VERSION=26.0.2

# Download Android SDK
RUN mkdir "$ANDROID_HOME" .android 
    && cd "$ANDROID_HOME" 
    && curl -o sdk.zip $SDK_URL 
    && unzip sdk.zip 
    && rm sdk.zip 
    && yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses

# Install Android Build Tool and Libraries
RUN $ANDROID_HOME/tools/bin/sdkmanager --update
RUN $ANDROID_HOME/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS_VERSION}" 
    "platforms;android-${ANDROID_VERSION}" 
    "platform-tools"

RUN mkdir /application
WORKDIR /application

Пас аз навиштани ин файли Docker (ман ба шумо сирро мегӯям, шумо онро навиштан шарт нест, балки онро аз GitHub омода кунед) ва тасвирро ҷамъоварӣ кунед, шумо як мошини виртуалӣ мегиред, ки дар он шумо метавонед барнома созед. ва санҷишҳои Junit -ро иҷро кунед.

Ду сабаби асосии он, ки ин маъно дорад, миқёспазирӣ ва такрорпазирӣ мебошанд. Бо истифода аз docker, шумо метавонед ба зудӣ даҳҳо агентҳои созандаро ба вуҷуд оред, ки ба ҳамон муҳити қаблӣ монанд хоҳанд буд. Ин ҳаёти муҳандисони CI-ро хеле осон мекунад. Ба докер тела додани android-sdk хеле осон аст, аммо бо эмуляторҳо ин каме мушкилтар аст: шумо бояд каме сахттар кор кунед (ё нусхаи тайёрро аз GitHub дубора зеркашӣ кунед).

Маслиҳати № 4: фаромӯш накунед, ки санҷиш на ба хотири санҷиш, балки барои одамон сурат мегирад.

Барои таҳиягарон фикру мулоҳизаҳои зуд ва муҳимтар аз ҳама равшан муҳим аст: чӣ шикаст, кадом озмоиш ноком шуд, ман дар куҷо метавонам Buildlog-ро бубинам.

Маслиҳати №5: Ҳангоми таҳияи ҳамгироии муттасил прагматик бошед.

Равшан фаҳмед, ки кадом намуди хатогиҳоро пешгирӣ кардан мехоҳед, чӣ қадар захираҳо, вақт ва вақти компютерро сарф кардан мехоҳед. Санҷишҳое, ки аз ҳад зиёд тӯл мекашанд, метавонанд, масалан, як шабонарӯз ба таъхир андохта шаванд. Ва онҳое, ки хатогиҳои на он қадар муҳим доранд, бояд комилан тарк карда шаванд.

Маслиҳати №6: Асбобҳои тайёрро истифода баред.

Ҳоло бисёр ширкатҳое ҳастанд, ки абри CI-ро таъмин мекунанд.

Эволютсияи CI дар дастаи рушди мобилӣ

Ин як ҳалли хуб барои дастаҳои хурд аст. Ба шумо лозим нест, ки чизеро дастгирӣ кунед, танҳо каме пул пардохт кунед, аризаи худро созед ва ҳатто санҷишҳои асбобҳоро иҷро кунед.

Маслиҳати №7: Дар як гурӯҳи калон, қарорҳои дохилӣ фоидаовартаранд.

Аммо дер ё зуд, вақте ки даста афзоиш меёбад, қарорҳои дохилӣ фоидаовартар мешаванд. Дар ин қарорҳо як мушкилот вуҷуд дорад. Дар иктисодиёт конуни кам шудани даромад мавчуд аст: дар хар як лоиха хар як такмили минбаъда душвортар ва бештар маблаггузориро талаб мекунад.

Иқтисодиёт тамоми ҳаёти моро, аз ҷумла Интегратсияи муттасил тавсиф мекунад. Ман ҷадвали хароҷоти меҳнатро барои ҳар як марҳилаи рушди Интегратсияи муттасили мо таҳия кардам.

Эволютсияи CI дар дастаи рушди мобилӣ

Маълум аст, ки хар як бехбудй торафт душвортар мегардад. Ба ин график нигоҳ карда, шумо метавонед фаҳмед, ки Интегратсияи муттасил бояд мувофиқи афзоиши андозаи даста таҳия карда шавад. Барои як гурӯҳи ду нафар, сарфи 50 рӯз барои таҳияи хоҷагии эмулятори дохилӣ як идеяи миёна аст. Аммо дар айни замон, барои як дастаи калон, умуман иҷро накардани Интегратсияи доимӣ низ фикри бад аст, зеро мушкилоти ҳамгироӣ, ислоҳи иртибот ва ғайра. ин боз хам зиёдтар вакт мегирад.

Мо аз он оғоз кардем, ки автоматизатсия лозим аст, зеро одамон қимат доранд, хато мекунанд ва танбал мешаванд. Аммо одамон инчунин автоматӣ мекунанд. Бинобар ин, хамаи проблемахои якхела ба автоматизация дахл доранд.

  • Автоматизатсия қимат аст. Графики мехнатро дар хотир доред.
  • Вақте ки сухан дар бораи автоматизатсия меравад, одамон хато мекунанд.
  • Баъзан автоматизатсия кардан хеле танбал аст, зеро ҳама чиз ҳамин тавр кор мекунад. Чаро чизи дигареро беҳтар кардан лозим аст, чаро ин ҳама Интегратсияи муттасил?

Аммо ман омор дорам: хатогиҳо дар 20% маҷлисҳо дида мешаванд. Ва ин аз он сабаб нест, ки таҳиягарони мо кодро бад менависанд. Ин дар он аст, ки таҳиягарон итминон доранд, ки агар онҳо ягон хатогӣ кунанд, он дар таҳия намегардад, онро тафтиши автоматӣ дастгир мекунанд. Мувофиқи он, таҳиягарон метавонанд ба ҷои кор ва озмоиши ягон чизи маҳаллӣ дар навиштани код ва чизҳои ҷолиб вақти бештар сарф кунанд.

Интегратсияи доимиро машқ кунед. Аммо ба меъёр.

Воқеан, Николай Нестеров на танҳо худаш гузоришҳои бузург медиҳад, балки узви кумитаи барномавӣ низ мебошад. AppsConf ва ба дигарон кӯмак мекунад, ки барои шумо нутқҳои пурмазмун тайёр кунанд. Мукаммал ва муфид будани барномаи конфронси навбатиро метавон аз рӯи мавзӯъҳои дар ҷадвал. Ва барои тафсилот, рӯзҳои 22-23 апрел ба Infospace биёед.

Манбаъ: will.com

Илова Эзоҳ