Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • gitlab-org/omnibus-gitlab
  • ph1ll/omnibus-gitlab
  • JobV/omnibus-gitlab
  • yakatz/omnibus-gitlab
  • HyangSa/omnibus-gitlab
  • bbodenmiller/omnibus-gitlab
  • goniz/omnibus-gitlab
  • dblessing/omnibus-gitlab
  • Drahamim/omnibus-gitlab
  • thorrsson/omnibus-gitlab
  • digitalpardoe/omnibus-gitlab
  • mnestor/omnibus-gitlab
  • neonlex/omnibus-gitlab
  • csschwe/omnibus-gitlab
  • mwessel/omnibus-gitlab
  • nathansamson/omnibus-gitlab
  • portman.chris/omnibus-gitlab
  • puiterwijk/omnibus-gitlab
  • roidelapluie/omnibus-gitlab
  • e29qwg/omnibus-gitlab
  • michaelfenn87/omnibus-gitlab
  • sque/omnibus-gitlab
  • kay.strobach/omnibus-gitlab
  • deshke/omnibus-gitlab
  • axil/omnibus-gitlab
  • mh0713/omnibus-gitlab
  • chjwdzhr/omnibus-gitlab
  • arun-y/omnibus-gitlab
  • 344208651/omnibus-gitlab
  • LongLiveCHIEF/omnibus-gitlab
  • nfeliciano/omnibus-gitlab
  • toalexjin/omnibus-gitlab
  • mike12489/omnibus-gitlab
  • genezys/omnibus-gitlab
  • mattes/omnibus-gitlab
  • dionysiusmarquis/omnibus-gitlab
  • DavidS/omnibus-gitlab
  • alexandreab/omnibus-gitlab
  • kevwilde/omnibus-gitlab
  • Taylor1791/omnibus-gitlab
  • shen390s/omnibus-gitlab
  • Roger.Bai/omnibus-gitlab
  • sanderboom/omnibus-gitlab
  • boy12371/omnibus-gitlab
  • loushang001/omnibus-gitlab
  • john-l-stechschulte/omnibus-gitlab
  • nepomuc/omnibus-gitlab
  • ssube/omnibus-gitlab
  • Thireus/omnibus-gitlab
  • stanhu/omnibus-gitlab
  • VERRONS/omnibus-gitlab
  • hierarchy/omnibus-gitlab
  • gabeio/omnibus-gitlab
  • ashby/omnibus-gitlab
  • petracvv/omnibus-gitlab
  • mryanb/omnibus-gitlab
  • geoffrey-grebert/omnibus-gitlab
  • masonjm/omnibus-gitlab
  • owenspencer/omnibus-gitlab
  • wakin/omnibus-gitlab
  • codename/omnibus-gitlab
  • jasonwbarnett/omnibus-gitlab
  • salsa-dev/omnibus-gitlab
  • rdoursenaud/omnibus-gitlab
  • karengc/omnibus-gitlab
  • tduehr/omnibus-gitlab
  • matt-firtion/omnibus-gitlab
  • myovchev/omnibus-gitlab
  • hiroponz/omnibus-gitlab
  • esemplare/omnibus-gitlab
  • liulu/omnibus-gitlab
  • headdetect/omnibus-gitlab
  • DennisRichard/omnibus-gitlab
  • luyh/omnibus-gitlab
  • nell/omnibus-gitlab
  • TomikoDemby/omnibus-gitlab
  • szechyjs/omnibus-gitlab
  • aussieaggie/omnibus-gitlab
  • chn/omnibus-gitlab
  • jurisdesk/omnibus-gitlab
  • jnijhof/omnibus-gitlab
  • matterbot/omnibus-gitlab
  • dzaporozhets/omnibus-gitlab
  • seweryn.zeman/omnibus-gitlab
  • slovell/omnibus-gitlab
  • pdeffendol/omnibus-gitlab
  • rburgst/omnibus-gitlab
  • azahadsyed/omnibus-gitlab
  • francisco-filho/omnibus-gitlab
  • pbouillet/omnibus-gitlab
  • Urchin/omnibus-gitlab
  • keson/omnibus-gitlab
  • patricio/omnibus-gitlab
  • blckshrk/omnibus-gitlab
  • mmonaco/omnibus-gitlab
  • mcfedr/omnibus-gitlab
  • kohenkatz/omnibus-gitlab
  • mzaideel/omnibus-gitlab
  • dawg/omnibus-gitlab
  • badloop/omnibus-gitlab
  • rkmylo/omnibus-gitlab
  • rannen/omnibus-gitlab
  • jicehef/omnibus-gitlab
  • Pascual/omnibus-gitlab
  • khiem291/omnibus-gitlab
  • lfbrock/omnibus-gitlab
  • scottyates/omnibus-gitlab
  • rosiv/omnibus-gitlab
  • sanjay_hp/omnibus-gitlab
  • yaohonv/omnibus-gitlab
  • jerez-leo13/omnibus-gitlab
  • mrexodia/omnibus-gitlab
  • jeroenj/omnibus-gitlab
  • Daerst/omnibus-gitlab
  • stevenorman/omnibus-gitlab
  • chrisruffalo/omnibus-gitlab
  • dany.jupille/omnibus-gitlab
  • Agupane/omnibus-gitlab
  • glitch003/omnibus-gitlab
  • dwenb-gitlab/omnibus-gitlab
  • kpac/omnibus-gitlab
  • AliAskari/omnibus-gitlab
  • Kaoshae/omnibus-gitlab
  • francoisprunier/omnibus-gitlab
  • artem-forks/omnibus-gitlab
  • 0bject.destroy/omnibus-gitlab
  • bomba/omnibus-gitlab
  • lajfox/omnibus-gitlab
  • TC01/omnibus-gitlab
  • florian.hustede/omnibus-gitlab
  • bevin/omnibus-gitlab
  • 00dav00/omnibus-gitlab
  • manojskdm/omnibus-gitlab
  • 1beb/omnibus-gitlab
  • oova/omnibus-gitlab
  • frennkie/omnibus-gitlab
  • zwvc/omnibus-gitlab
  • glensc/omnibus-gitlab
  • penweizgx/omnibus-gitlab
  • ghasrfakhri/omnibus-gitlab
  • Dyscrete/omnibus-gitlab
  • aral/omnibus-gitlab
  • mxhcxp/omnibus-gitlab
  • wu0407/omnibus-gitlab
  • jmcgeheeiv/omnibus-gitlab
  • phsteve/omnibus-gitlab
  • jbyrd/omnibus-gitlab
  • Pitel/omnibus-gitlab
  • shockerli/omnibus-gitlab
  • cwz8202/omnibus-gitlab
  • MrEhbr/omnibus-gitlab
  • usr01/omnibus-gitlab
  • mattermost/omnibus-gitlab
  • it33/omnibus-gitlab
  • stepheny038/omnibus-gitlab
  • esclear/omnibus-gitlab
  • jstsch/omnibus-gitlab
  • ei-grad/omnibus-gitlab
  • brunsa2/omnibus-gitlab
  • jakob-englisch/omnibus-gitlab
  • permalance/omnibus-gitlab
  • luichan/omnibus-gitlab
  • sknolin/omnibus-gitlab
  • gaariacg/omnibus-gitlab
  • Zorth/omnibus-gitlab
  • jacobvosmaer-gitlab/omnibus-gitlab
  • florian-n/omnibus-gitlab
  • truppproject/omnibus-gitlab
  • markpundsack/omnibus-gitlab
  • X0nic/omnibus-gitlab
  • joernhees/omnibus-gitlab
  • crunchtime-ali/omnibus-gitlab
  • LTheobald/omnibus-gitlab
  • ousmaneTra/omnibus-gitlab
  • oyarzun/omnibus-gitlab
  • libresoftsolutions/omnibus-gitlab
  • kingcody/omnibus-gitlab
  • dandunckelman/omnibus-gitlab
  • sluc23/omnibus-gitlab
  • abuango/omnibus-gitlab
  • sascha97915/omnibus-gitlab
  • bartlaarhoven/omnibus-gitlab
  • ngpestelos/omnibus-gitlab
  • clantant/omnibus-gitlab
  • cataphract/omnibus-gitlab
  • leebenson/omnibus-gitlab
  • ernetas/omnibus-gitlab
  • zeiv/omnibus-gitlab
  • narakuphoenix/omnibus-gitlab
  • Grey2k/omnibus-gitlab
  • akabir/omnibus-gitlab
  • OliverHrdz/omnibus-gitlab
  • rut2/omnibus-gitlab
  • jsk-txt/omnibus-gitlab
  • bronzdoc/omnibus-gitlab
  • WarheadsSE/omnibus-gitlab
  • jasonblais/omnibus-gitlab
  • ruvasik/omnibus-gitlab
  • ddude/omnibus-gitlab
  • nlaveck/omnibus-gitlab
  • halfgaar/omnibus-gitlab
  • ivadim/omnibus-gitlab
  • jgsqware/omnibus-gitlab
  • NeroBurner/omnibus-gitlab
  • dserodio/omnibus-gitlab
  • hvlad/omnibus-gitlab
  • saucissound/omnibus-gitlab
  • whywaita/omnibus-gitlab
  • ianbaum/omnibus-gitlab
  • ampedandwired/omnibus-gitlab
  • furoka/omnibus-gitlab
  • asziranyi/omnibus-gitlab
  • gaveen/omnibus-gitlab
  • gecgooden/omnibus-gitlab
  • plafoucriere/omnibus-gitlab
  • andreyevbr/omnibus-gitlab
  • Horgix/omnibus-gitlab
  • dcmspe/omnibus-gitlab
  • juliusmore/omnibus-gitlab
  • w_hayes/omnibus-gitlab
  • MarkHerhold/omnibus-gitlab
  • kamalbctg/omnibus-gitlab
  • costincaraivan/omnibus-gitlab
  • phoenigmatic/omnibus-gitlab
  • joergi/omnibus-gitlab
  • visualrobots/omnibus-gitlab
  • philip.wood/omnibus-gitlab
  • jaylinski/omnibus-gitlab
  • tulipsnepal/omnibus-gitlab
  • davidhrbac/omnibus-gitlab
  • mkungla/omnibus-gitlab
  • Rencs/omnibus-gitlab
  • ReSearchITEng/omnibus-gitlab
  • Olivier87/omnibus-gitlab
  • oschwede/omnibus-gitlab
  • kay54088/omnibus-gitlab
  • daxelrod/omnibus-gitlab
  • ofaurax/omnibus-gitlab
  • gbraad/omnibus-gitlab
  • criloz/omnibus-gitlab
  • webframp/omnibus-gitlab
  • ramaraju/omnibus-gitlab
  • denkweite/omnibus-gitlab
  • Rudikza/omnibus-gitlab
  • anwar.yagoub/omnibus-gitlab
  • Riztazz/omnibus-gitlab
  • JSMenezes/omnibus-gitlab
  • mschaeben/omnibus-gitlab
  • gagern/omnibus-gitlab
  • twang2218/omnibus-gitlab
  • omarmohsen/omnibus-gitlab
  • jasonroehm/omnibus-gitlab
  • aumayr/omnibus-gitlab
  • underyx/omnibus-gitlab
  • lloeki/omnibus-gitlab
  • padahu/omnibus-gitlab
  • rosanocangussu1/omnibus-gitlab
  • Temtaime/omnibus-gitlab
  • robvl66/omnibus-gitlab
  • bruxy/omnibus-gitlab
  • manni9281/omnibus-gitlab
  • AviDuda/omnibus-gitlab
  • technostar98/omnibus-gitlab
  • zhangjl1574/omnibus-gitlab
  • sokchanny7/omnibus-gitlab
  • haad/omnibus-gitlab
  • chkpnt/omnibus-gitlab
  • taebong0905/omnibus-gitlab
  • guilhermeborgesti/omnibus-gitlab
  • DaAwesomeP/omnibus-gitlab
  • baparici/omnibus-gitlab
  • mozill32/omnibus-gitlab
  • nerro/omnibus-gitlab
  • hiyang/omnibus-gitlab
  • alexanderschnitzler/omnibus-gitlab
  • mihai.lazar/omnibus-gitlab
  • m.boulaayoun/omnibus-gitlab
  • LipperZack/omnibus-gitlab
  • siemens/omnibus-gitlab
  • zagaluke/omnibus-gitlab
  • doomsayer13/omnibus-gitlab
  • smircea/omnibus-gitlab
  • nils.werner/omnibus-gitlab
  • ayufan/omnibus-gitlab
  • jasonsuzhou/omnibus-gitlab
  • TRPmwiesen/omnibus-gitlab
  • RapidSport/omnibus-gitlab
  • oatberrycrunch/omnibus-gitlab
  • fzied/omnibus-gitlab
  • alejdg/omnibus-gitlab
  • kaiohenrique/omnibus-gitlab
  • BenoitKnecht/omnibus-gitlab
  • ronfravi/omnibus-gitlab
  • kahbenya/omnibus-gitlab
  • parruda/omnibus-gitlab
  • denimamab/omnibus-gitlab
  • senk/omnibus-gitlab
  • shinya.maeda/omnibus-gitlab
  • fabrice.herbeaux/omnibus-gitlab
  • jeremyyin/omnibus-gitlab
  • Rockyspade/omnibus-gitlab
  • phlbrz/omnibus-gitlab
  • blazewalker462/omnibus-gitlab
  • mariotr/omnibus-gitlab
  • alanchia2000/omnibus-gitlab
  • miouge/omnibus-gitlab
  • voitJ/omnibus-gitlab
  • pchojnacki-gitlab/omnibus-gitlab
  • BSCheshir/omnibus-gitlab
  • Mattlk13/omnibus-gitlab
  • brentjanderson/omnibus-gitlab
  • PServers/omnibus-gitlab
  • mowijo/omnibus-gitlab
  • zebek/omnibus-gitlab
  • sanglt/omnibus-gitlab
  • timbavati/omnibus-gitlab
  • tanyan2004/omnibus-gitlab
  • jkeys/omnibus-gitlab
  • jastkand/omnibus-gitlab
  • Zoubeyer/omnibus-gitlab
  • mkubenka/omnibus-gitlab
  • hexagon6/omnibus-gitlab
  • lamto/omnibus-gitlab
  • wuxyyin/omnibus-gitlab
  • gabothep/omnibus-gitlab
  • techguru/omnibus-gitlab
  • Cong5/omnibus-gitlab
  • MacDonald/omnibus-gitlab
  • dfy167/omnibus-gitlab
  • xer0x/omnibus-gitlab
  • jyunfan2015/omnibus-gitlab
  • larsla/omnibus-gitlab
  • okulygin/omnibus-gitlab
  • rkgarcia/omnibus-gitlab
  • anapsix/omnibus-gitlab
  • sonnt/omnibus-gitlab
  • zpallin/omnibus-gitlab
  • Krijger/omnibus-gitlab
  • jfcoz/omnibus-gitlab
  • songww/omnibus-gitlab
  • ravisorg/omnibus-gitlab
  • caleno/omnibus-gitlab
  • esethna/omnibus-gitlab
  • jaksd/omnibus-gitlab
  • kavurmam/omnibus-gitlab
  • asmolero/omnibus-gitlab
  • shalithakaru/omnibus-gitlab
  • ouattchidi/omnibus-gitlab
  • 275John/omnibus-gitlab
  • certik/omnibus-gitlab
  • nick.volynkin/omnibus-gitlab
  • jderusse/omnibus-gitlab
  • rawlingsj/omnibus-gitlab
  • JeffSchering/omnibus-gitlab
  • sjenning/omnibus-gitlab
  • Macioszek/omnibus-gitlab
  • jboyles/omnibus-gitlab
  • neogineer/omnibus-gitlab
  • pfrayer/omnibus-gitlab
  • ryehle/omnibus-gitlab
  • ATMartin/omnibus-gitlab
  • esethna2/omnibus-gitlab
  • cbrucks/omnibus-gitlab
  • sylvainb1/omnibus-gitlab
  • charlenchen/omnibus-gitlab
  • tjuerge/omnibus-gitlab
  • twk3/omnibus-gitlab
  • alquimista3301/omnibus-gitlab
  • offdutypirate/omnibus-gitlab
  • wlamal855/omnibus-gitlab
  • PrakashSinghRawat/omnibus-gitlab
  • stratosgear/omnibus-gitlab
  • ewan.ramsay36/omnibus-gitlab
  • erickpece/omnibus-gitlab
  • ilyuharud/omnibus-gitlab
  • hh/omnibus-gitlab
  • smortex/omnibus-gitlab
  • hombit/omnibus-gitlab
  • dinglianju/omnibus-gitlab
  • chg1995/omnibus-gitlab
  • galen_liu/omnibus-gitlab
  • mohammadeslami/omnibus-gitlab
  • ZhiyuanChen/omnibus-gitlab
  • kkirsche/omnibus-gitlab
  • liulantao/omnibus-gitlab
  • sinichkin/omnibus-gitlab
  • fingnet/omnibus-gitlab
  • tclaff/omnibus-gitlab
  • alexkeramidas/omnibus-gitlab
  • joustie/omnibus-gitlab
  • gitlab-contrib/omnibus-gitlab
  • tribut/omnibus-gitlab
  • richardc/omnibus-gitlab
  • romewing/omnibus-gitlab
  • lukasraska/omnibus-gitlab
  • AdrianPrado/omnibus-gitlab
  • ralphg6/omnibus-gitlab
  • loai.net/omnibus-gitlab
  • claudio.vellage/omnibus-gitlab
  • categulario/omnibus-gitlab
  • s_c/omnibus-gitlab
  • zeb/omnibus-gitlab
  • HaPPyWaLLaCe/omnibus-gitlab
  • jobles11/omnibus-gitlab
  • waxmiguel/omnibus-gitlab
  • gvieira37/omnibus-gitlab
  • g3rhard/omnibus-gitlab
  • eivissa.com/omnibus-gitlab
  • ediaz-inteliti/omnibus-gitlab
  • BobFrankly/omnibus-gitlab
  • raistlinzx/omnibus-gitlab
  • stefan.harald.reiterer/omnibus-gitlab
  • adam.dehnel/omnibus-gitlab
  • AhmetBas/omnibus-gitlab
  • mmmickmason2/omnibus-gitlab
  • AtlanticF/omnibus-gitlab
  • bobashforth/omnibus-gitlab
  • tensibai/omnibus-gitlab
  • abhinav3295/omnibus-gitlab
  • mydigitalself/omnibus-gitlab
  • ravindraAux/omnibus-gitlab
  • minchina91/omnibus-gitlab
  • charmkun/omnibus-gitlab
  • murray.crane/omnibus-gitlab
  • stormanger/omnibus-gitlab
  • geoweirphone/omnibus-gitlab
  • spyoungtech/omnibus-gitlab
  • allamand/omnibus-gitlab
  • romain.maffina/omnibus-gitlab
  • githubjeka/omnibus-gitlab
  • 7c00/omnibus-gitlab
  • webmaster1989/omnibus-gitlab
  • homotechsual/omnibus-gitlab
  • fzoske/omnibus-gitlab
  • cebor/omnibus-gitlab
  • palagend/omnibus-gitlab
  • rnizaev/omnibus-gitlab
  • li_yuchang/omnibus-gitlab
  • zhanhb/omnibus-gitlab
  • aurel.lavorel/omnibus-gitlab
  • Maram_hasoneh88/omnibus-gitlab
  • cyberhicham/omnibus-gitlab
  • tudorbarascu1/omnibus-gitlab
  • wonko21/omnibus-gitlab
  • robson.f/omnibus-gitlab
  • Jellyfrog/omnibus-gitlab
  • jasoncoal/omnibus-gitlab
  • jmbadia.dekra/omnibus-gitlab
  • aminaiee/omnibus-gitlab
  • mlapierre/omnibus-gitlab
  • fooishbar/omnibus-gitlab
  • tuomoa/omnibus-gitlab
  • kai.eichinger/omnibus-gitlab
  • flokli/omnibus-gitlab
  • insomniaqc/omnibus-gitlab
  • Turmio/omnibus-gitlab
  • CleverUnderDog/omnibus-gitlab
  • kuluev27/omnibus-gitlab
  • codekaiju/omnibus-gitlab
  • alvaroaleman/omnibus-gitlab
  • suguojun/omnibus-gitlab
  • gkarthiks/omnibus-gitlab
  • maxmeyer/omnibus-gitlab
  • phorkyas/omnibus-gitlab
  • fengwang811203/omnibus-gitlab
  • LENOIR/omnibus-gitlab
  • dcpc.dev/omnibus-gitlab
  • Vashiru/omnibus-gitlab
  • anjann/omnibus-gitlab
  • nlr/omnibus-gitlab
  • huandzh/omnibus-gitlab
  • tpt2213/omnibus-gitlab
  • Sumerbreez/omnibus-gitlab
  • davidsterling003/omnibus-gitlab
  • MyIgel/omnibus-gitlab
  • johnxu-cn/omnibus-gitlab
  • netpengo/omnibus-gitlab
  • yaojinman/omnibus-gitlab
  • jof/omnibus-gitlab
  • devnied/omnibus-gitlab
  • chanjarster/omnibus-gitlab
  • aishen1874/omnibus-gitlab
  • gitlabcn/omnibus-gitlab
  • woon/omnibus-gitlab
  • jgitlab12345/omnibus-gitlab
  • lodz1925/omnibus-gitlab
  • Valerielemoine31/omnibus-gitlab
  • newbare/omnibus-gitlab
  • ankitEcoG/omnibus-gitlab
  • phy25/omnibus-gitlab
  • masahashi/omnibus-gitlab
  • RithLK/omnibus-gitlab
  • wchandler/omnibus-gitlab
  • cebe/omnibus-gitlab
  • skaplun/omnibus-gitlab
  • shaikali/omnibus-gitlab
  • HarunSMetin/omnibus-gitlab
  • mulholland0318/omnibus-gitlab
  • libaba/omnibus-gitlab
  • nballener/omnibus-gitlab
  • justdot/omnibus-gitlab
  • rnestler/omnibus-gitlab
  • rmarshall/omnibus-gitlab
  • userpro1988/omnibus-gitlab
  • emmezeta/omnibus-gitlab
  • jiik.alone/omnibus-gitlab
  • everglowzh/omnibus-gitlab
  • mishak/omnibus-gitlab
  • perlun/omnibus-gitlab
  • LordMike/omnibus-gitlab
  • alindeman/omnibus-gitlab
  • adrianolek/omnibus-gitlab
  • sszott/omnibus-gitlab
  • waitingsong/omnibus-gitlab
  • hgarg81/omnibus-gitlab
  • nineforty5/omnibus-gitlab
  • Bubbyrulz/omnibus-gitlab
  • paulrbr/omnibus-gitlab
  • kurojiyu/omnibus-gitlab
  • jperville/omnibus-gitlab
  • theoreichel/omnibus-gitlab
  • adrianmoisey/omnibus-gitlab
  • fretlink/omnibus-gitlab
  • craph1/omnibus-gitlab
  • steve12312/omnibus-gitlab
  • e31k/omnibus-gitlab
  • chohtet/omnibus-gitlab
  • jgay/omnibus-gitlab
  • JonathonReinhart/omnibus-gitlab
  • dpitkin/omnibus-gitlab
  • forked-repo/gitlab-org/omnibus-gitlab
  • nettiapfelmus808/omnibus-gitlab
  • danielhass/omnibus-gitlab
  • predakanga/omnibus-gitlab
  • tienbien44/omnibus-gitlab
  • zmatuszyk/omnibus-gitlab
  • p4fg/omnibus-gitlab
  • aflinn/omnibus-gitlab
  • rtat.net/omnibus-gitlab
  • EladLeev/omnibus-gitlab
  • littlefox94/omnibus-gitlab
  • tiffanyc214/omnibus-gitlab
  • alejoasd/omnibus-gitlab
  • dereisele/omnibus-gitlab
  • davtdl/omnibus-gitlab
  • pepijnve/omnibus-gitlab
  • littlewingsy/omnibus-gitlab
  • nottheeconomist/omnibus-gitlab
  • cschroder/omnibus-gitlab
  • qxo1/omnibus-gitlab
  • jelhan/omnibus-gitlab
  • fang130tao/omnibus-gitlab
  • myamani/omnibus-gitlab
  • dgiebert/omnibus-gitlab
  • j4ckie1/omnibus-gitlab
  • FossoresLP/omnibus-gitlab
  • mort___/omnibus-gitlab
  • aqeelrcs/omnibus-gitlab
  • x-eysz7x/omnibus-gitlab
  • myersg86/omnibus-gitlab
  • jritchey/omnibus-gitlab
  • dan-barbulescu/omnibus-gitlab
  • frank.stappers/omnibus-gitlab
  • ahmadsherif/omnibus-gitlab
  • marcus.leonato/omnibus-gitlab
  • stevenreno69/omnibus-gitlab
  • lebertdvd/omnibus-gitlab
  • thrasymache/omnibus-gitlab
  • BageDevimo/omnibus-gitlab
  • essakhi/omnibus-gitlab
  • jschneideratoney/omnibus-gitlab
  • mikecave/omnibus-gitlab
  • caleblwilliamson/omnibus-gitlab
  • dutchrapley/omnibus-gitlab
  • vidazach/omnibus-gitlab
  • newk1/omnibus-gitlab
  • missphyrgames/omnibus-gitlab
  • rafagd/omnibus-gitlab
  • andy.wilson/omnibus-gitlab
  • mastour-anas/omnibus-gitlab
  • mihou.cn/omnibus-gitlab
  • jerome.auge/omnibus-gitlab
  • jk2K/omnibus-gitlab
  • tisaksen/omnibus-gitlab
  • jonakarl/omnibus-gitlab
  • Rymorsei/omnibus-gitlab
  • balu/omnibus-gitlab
  • lljaicjj/omnibus-gitlab
  • promaethius/omnibus-gitlab
  • luizaas/omnibus-gitlab
  • golenz/omnibus-gitlab
  • berendkleinhaneveld/omnibus-gitlab
  • akash.ghode/omnibus-gitlab
  • dhollinger/omnibus-gitlab
  • bianyifan/omnibus-gitlab
  • iMouath/omnibus-gitlab
  • jacob.hackman/omnibus-gitlab
  • axil44/omnibus-gitlab
  • ghickey/omnibus-gitlab
  • nnelson/omnibus-gitlab
  • harish.aravilli/omnibus-gitlab
  • benmccormick/omnibus-gitlab
  • danacr/omnibus-gitlab
  • flymanhi/omnibus-gitlab
  • ryanoboril/omnibus-gitlab
  • anandh_n/omnibus-gitlab
  • theodyfirdaus/omnibus-gitlab
  • belegnar/omnibus-gitlab
  • bguinebault/omnibus-gitlab
  • aftra03/omnibus-gitlab
  • mskvkin/omnibus-gitlab
  • qzhaogitlab/omnibus-gitlab
  • ba2014sheer/omnibus-gitlab
  • saipraneeth836/omnibus-gitlab
  • phich/omnibus-gitlab
  • jansauer/omnibus-gitlab
  • daveRendon/omnibus-gitlab
  • mic00/omnibus-gitlab
  • auua/omnibus-gitlab
  • J0WI/omnibus-gitlab
  • dodocat/omnibus-gitlab
  • zj-gitlab/omnibus-gitlab
  • DadoFR/omnibus-gitlab
  • gerome.chardon/omnibus-gitlab
  • schrotie/omnibus-gitlab
  • zxjinn/omnibus-gitlab
  • ryross/omnibus-gitlab
  • dengxiang.zhou/omnibus-gitlab
  • tebogo.moloi/omnibus-gitlab
  • justinegeffen/omnibus-gitlab
  • artemkaxboy/omnibus-gitlab
  • yang1950600/omnibus-gitlab
  • sdvassil/omnibus-gitlab
  • rzakirov/omnibus-gitlab
  • arielb2/omnibus-gitlab
  • yushuhsiao1/omnibus-gitlab
  • miccom86/omnibus-gitlab
  • octoquad/omnibus-gitlab
  • veera-group/omnibus-gitlab
  • justyna.araszkiewicz/omnibus-gitlab
  • hoanlut54/omnibus-gitlab
  • mountash/omnibus-gitlab
  • ushasree554/omnibus-gitlab
  • samoorth/omnibus-gitlab
  • ParthikGhosh/omnibus-gitlab
  • cknott/omnibus-gitlab
  • ich.liebe.dich.adan/omnibus-gitlab
  • enash2727/omnibus-gitlab
  • anuphongamp/omnibus-gitlab
  • josharian/omnibus-gitlab
  • bpsrobotics/omnibus-gitlab
  • nuwe1/omnibus-gitlab
  • haveiss/omnibus-gitlab
  • bjoernf/omnibus-gitlab
  • TheSnowfield/omnibus-gitlab
  • BeaCalvo38/omnibus-gitlab
  • patrickschneider23/omnibus-gitlab
  • diablozzq/omnibus-gitlab
  • ifilatov/omnibus-gitlab
  • fnkr/omnibus-gitlab
  • max-wittig/omnibus-gitlab
  • emanuel_ongres/omnibus-gitlab
  • ruslan.bondarev1/omnibus-gitlab
  • Matthewrich679/omnibus-gitlab
  • galvertez/omnibus-gitlab
  • 17600426765/omnibus-gitlab
  • harryliu2000/omnibus-gitlab
  • rehab/omnibus-gitlab
  • artemsterkh/omnibus-gitlab
  • reprazent/omnibus-gitlab
  • Sang.Latwal001/omnibus-gitlab
  • OrliRi/omnibus-gitlab
  • lertchai/omnibus-gitlab
  • hnzlmnn/omnibus-gitlab
  • sarun515s/omnibus-gitlab
  • amrithrajr/omnibus-gitlab
  • ship0113/omnibus-gitlab
  • cperex97/omnibus-gitlab
  • Ash560/omnibus-gitlab
  • eric_blosser/omnibus-gitlab
  • remyj38/omnibus-gitlab
  • azazelmm1982/omnibus-gitlab
  • abartzgitlab/omnibus-gitlab
  • Lnyannini/omnibus-gitlab
  • cosomeister/omnibus-gitlab
  • joukewitteveen/omnibus-gitlab
  • the_s/omnibus-gitlab
  • AD5GB/omnibus-gitlab
  • hcgrove/omnibus-gitlab
  • pashkapo/omnibus-gitlab
  • w0pr/omnibus-gitlab
  • aseques/omnibus-gitlab
  • folleraide69/omnibus-gitlab
  • blitziggy/omnibus-gitlab
  • jonsikes91/omnibus-gitlab
  • mharmonikas/omnibus-gitlab
  • ajbourg/omnibus-gitlab
  • julian.ferry/omnibus-gitlab
  • subbaraogv/omnibus-gitlab
  • YutingShao/omnibus-gitlab
  • ldidry/omnibus-gitlab
  • zubairdurrani222/omnibus-gitlab
  • canaltinova/omnibus-gitlab
  • fubaa/omnibus-gitlab
  • sym01/omnibus-gitlab
  • alexasahis/omnibus-gitlab
  • ramy1155n/omnibus-gitlab
  • nraj0408/omnibus-gitlab
  • Loki-Afro/omnibus-gitlab
  • cbrandel/omnibus-gitlab
  • sluongng/omnibus-gitlab
  • vladob/omnibus-gitlab
  • haghighi/omnibus-gitlab
  • ggardet/omnibus-gitlab
  • rupa.schomaker/omnibus-gitlab
  • hoangtran.tn.93/omnibus-gitlab
  • mingch94/omnibus-gitlab
  • tempelorg/omnibus-gitlab
  • ahsmiller2/omnibus-gitlab
  • Alteya/omnibus-gitlab
  • 15210968154/omnibus-gitlab
  • edgardorodriguez50/omnibus-gitlab
  • DavidCameron865/omnibus-gitlab
  • stesmi/omnibus-gitlab
  • chiehmin18/omnibus-gitlab
  • yairi.medinac/omnibus-gitlab
  • raju249/omnibus-gitlab
  • jeroenvisser101/omnibus-gitlab
  • msschl/omnibus-gitlab
  • ovv/omnibus-gitlab
  • chuckf/omnibus-gitlab
  • Rdx11/omnibus-gitlab
  • jellainelagumbay/omnibus-gitlab
  • jj148841/omnibus-gitlab
  • Phatphat1712/omnibus-gitlab
  • hungryForCrypto23/omnibus-gitlab
  • HexalGJ/omnibus-gitlab
  • FiZi/omnibus-gitlab
  • mahdimedrhm/omnibus-gitlab
  • safu/omnibus-gitlab
  • Edgar452/omnibus-gitlab
  • utkarsh2102/omnibus-gitlab
  • rama_std/omnibus-gitlab
  • gypsophlia/omnibus-gitlab
  • jamesd4y/omnibus-gitlab
  • Krasauskas/omnibus-gitlab
  • corneliusludmann/omnibus-gitlab
  • Gitblogspot/omnibus-gitlab
  • rsrchboy/omnibus-gitlab
  • melvincv/omnibus-gitlab
  • jdbloun/omnibus-gitlab
  • 46511dedi/omnibus-gitlab
  • cpaulik/omnibus-gitlab
  • yeganeh.n666/omnibus-gitlab
  • jpgeek/omnibus-gitlab
  • nkosea1/omnibus-gitlab
  • diraol/omnibus-gitlab
  • shanezhiu/omnibus-gitlab
  • krmartin1/omnibus-gitlab
  • unixandria-lmao/omnibus-gitlab
  • federica.govoni2310/omnibus-gitlab
  • ansjaj1/omnibus-gitlab
  • gaopu/omnibus-gitlab
  • isildur1/omnibus-gitlab
  • real.dark.sat/omnibus-gitlab
  • feistel/omnibus-gitlab
  • harunisiaho1/omnibus-gitlab
  • amiraliakbari/omnibus-gitlab
  • kimberlygardner35/omnibus-gitlab
  • Michael_Guo/omnibus-gitlab
  • vidhya.h/omnibus-gitlab
  • varunkumar5880/omnibus-gitlab
  • HiKey/omnibus-gitlab
  • dimrozakis/omnibus-gitlab
  • frikke/omnibus-gitlab
  • we88c0de/omnibus-gitlab
  • Achido/omnibus-gitlab
  • mobcoder-sani/omnibus-gitlab
  • EdwinSmulders/omnibus-gitlab
  • gitlab.com-gitbucket.com-github.com/omnibus-gitlab
  • LupinChiu/omnibus-gitlab
  • adrianjagielak/omnibus-gitlab
  • tiensuchabo/omnibus-gitlab
  • rrrrrrmb/omnibus-gitlab
  • caosonbaon/omnibus-gitlab
  • ramonbrugman/omnibus-gitlab
  • weihongbin1/omnibus-gitlab
  • andrewdisley1/omnibus-gitlab
  • baby.cupid25/omnibus-gitlab
  • s-ayush2903/omnibus-gitlab
  • bigcook12345/omnibus-gitlab
  • break4life123/omnibus-gitlab
  • bagage/omnibus-gitlab
  • alexislefebvre/omnibus-gitlab
  • ali-sadat/omnibus-gitlab
  • hufa/omnibus-gitlab
  • marciosousa85/omnibus-gitlab
  • ercan.ucan/omnibus-gitlab
  • iamandrewdennis/omnibus-gitlab
  • alabdli777/omnibus-gitlab
  • ralf02/omnibus-gitlab
  • tarchur/omnibus-gitlab
  • aszs/omnibus-gitlab
  • roberto25/omnibus-gitlab
  • bafir24/omnibus-gitlab
  • rllane17/omnibus-gitlab
  • ifrido/omnibus-gitlab
  • Emajeru/omnibus-gitlab
  • nfishe/omnibus-gitlab
  • lunaisnotaboy/omnibus-gitlab
  • winkies/omnibus-gitlab
  • kro13om222/omnibus-gitlab
  • SteveJordache/omnibus-gitlab
  • ashbringer7077/omnibus-gitlab
  • briandols/omnibus-gitlab
  • jk779/omnibus-gitlab
  • kernelcuster/omnibus-gitlab
  • leroux.lucas/omnibus-gitlab
  • eratechid/omnibus-gitlab
  • pindank/omnibus-gitlab
  • L-uang/omnibus-gitlab
  • sandercox/omnibus-gitlab
  • icbd/omnibus-gitlab
  • hongtaoluo/omnibus-gitlab
  • networkredux/omnibus-gitlab
  • knightzac/omnibus-gitlab
  • mik3lo/omnibus-gitlab
  • dev_louis/omnibus-gitlab
  • tkoeppen/omnibus-gitlab
  • castris/omnibus-gitlab
  • talitmrsvr/omnibus-gitlab
  • benyapa17493/omnibus-gitlab
  • vincent_stchu/omnibus-gitlab
  • stephankirsten/omnibus-gitlab
  • j_bharath/omnibus-gitlab
  • adilhussain203/omnibus-gitlab
  • bloodhell/omnibus-gitlab
  • andre.merten/omnibus-gitlab
  • neclimdul/omnibus-gitlab
  • felixonmars/omnibus-gitlab
  • aminalizadeh.developer/omnibus-gitlab
  • Walli99/omnibus-gitlab
  • fidrees88/omnibus-gitlab
  • taoyouh/omnibus-gitlab
  • nipunhaldar24/omnibus-gitlab
  • sathieu/omnibus-gitlab
  • 93eortega/omnibus-gitlab
  • 0racl3z/omnibus-gitlab
  • behrmann/omnibus-gitlab
  • frances-allen-sec/omnibus-gitlab
  • rozenbergpinchas/omnibus-gitlab
  • nirmalyakar00/omnibus-gitlab
  • brennenpike/omnibus-gitlab
  • aayjaychan/omnibus-gitlab
  • kng000010/omnibus-gitlab
  • brennan-macaig/omnibus-gitlab
  • creeves666/omnibus-gitlab
  • ankita.singh.200020/omnibus-gitlab
  • HuseyinEmreAksoy/omnibus-gitlab
  • subro608/omnibus-gitlab
  • cruelsmith/omnibus-gitlab
  • HaroldKnowlden/omnibus-gitlab
  • vatsanvindictive/omnibus-gitlab
  • bblevins23/omnibus-gitlab
  • fede_e_b/omnibus-gitlab
  • dalodemir/omnibus-gitlab
  • orozot/omnibus-gitlab
  • UncleMaple/omnibus-gitlab
  • aroun/omnibus-gitlab
  • chucks3659/omnibus-gitlab
  • aapeli/omnibus-gitlab
  • hy832058/omnibus-gitlab
  • xxknaggiexx/omnibus-gitlab
  • milosz.galazka/omnibus-gitlab
  • mirsal/omnibus-gitlab
  • Kolan92/omnibus-gitlab
  • spirosoik/omnibus-gitlab
  • dadangnh/omnibus-gitlab
  • Nexuscompute/omnibus-gitlab
  • syseleven/omnibus-gitlab
  • alexis.grebe/omnibus-gitlab
  • lhmzhou/omnibus-gitlab
  • TamerlanG1/omnibus-gitlab
  • 011d/omnibus-gitlab
  • RedstoneWizard08/omnibus-gitlab
  • jeijoe3/omnibus-gitlab
  • PhSi/omnibus-gitlab
  • swatimandave/omnibus-gitlab
  • aeyyalhedfa/omnibus-gitlab
  • huytnth2010022/omnibus-gitlab
  • werner.robitza/omnibus-gitlab
  • strbum/omnibus-gitlab
  • Fhiltyphil88/omnibus-gitlab
  • monizz.em/omnibus-gitlab
  • sue445/omnibus-gitlab
  • tofa14061972/omnibus-gitlab
  • cHiv0rz/omnibus-gitlab
  • nwj4142/omnibus-gitlab
  • xgaia/omnibus-gitlab
  • miguelgarciabilbao/omnibus-gitlab
  • pk212/omnibus-gitlab
  • swingcool/omnibus-gitlab
  • khakhana1/omnibus-gitlab
  • robert.altinger/omnibus-gitlab
  • amityadav9918/omnibus-gitlab
  • NotNullDev/omnibus-gitlab
  • wwjenkins/omnibus-gitlab
  • mahdi21174/omnibus-gitlab
  • oott123/omnibus-gitlab
  • jatobi/omnibus-gitlab
  • Victor0hugoo/omnibus-gitlab
  • shakokakhadze/omnibus-gitlab
  • BosskurrMH/omnibus-gitlab
  • paddy-hack/omnibus-gitlab
  • Fredd0ye/omnibus-gitlab
  • oregonpillow/omnibus-gitlab
  • srza/omnibus-gitlab
  • taucher2003-group/omnibus-gitlab
  • gregoire74jourdain/omnibus-gitlab
  • celesram45/omnibus-gitlab
  • MasterdisasterHD/omnibus-gitlab
  • myii/omnibus-gitlab
  • kwootje/omnibus-gitlab
  • ion.mesca/omnibus-gitlab
  • zhzhang93/omnibus-gitlab
  • srvirameus/omnibus-gitlab
  • DanMircea1/omnibus-gitlab
  • gilmoreg4240/omnibus-gitlab
  • oliver.broome/omnibus-gitlab
  • palaciosdominic00/omnibus-gitlab
  • lemzoba/omnibus-gitlab
  • shockleyje/omnibus-gitlab
  • kinolaev/omnibus-gitlab
  • kgilteran/omnibus-gitlab
  • dimivaivadim/omnibus-gitlab
  • awm16899/omnibus-gitlab
  • lxb1226/omnibus-gitlab
  • k.jingyang/omnibus-gitlab
  • pm9551/omnibus-gitlab
  • findmeifyoucanx0/omnibus-gitlab
  • masood.kamyab/omnibus-gitlab
  • Liqiun/omnibus-gitlab
  • GIRLSAVENUE12/omnibus-gitlab
  • amdnjb/omnibus-gitlab
  • Yoda-BZH/omnibus-gitlab
  • holly.yang/omnibus-gitlab
  • Benjamin_Loison/omnibus-gitlab
  • shamsahmadms/omnibus-gitlab
  • nandarachmat08/omnibus-gitlab
  • ahus1/omnibus-gitlab
  • hagarzain69/omnibus-gitlab
  • zeeZ/omnibus-gitlab
  • sgregory2/omnibus-gitlab
  • chenglin.tian/omnibus-gitlab
  • somardrahcir4/omnibus-gitlab
  • csskevin/omnibus-gitlab
  • Freaknuttz8er/omnibus-gitlab
  • alotibitoto152/omnibus-gitlab
  • adivinho/omnibus-gitlab
  • wd665544/omnibus-gitlab
  • jw561415/omnibus-gitlab
  • afsanhhydry12/omnibus-gitlab
  • rafirahmanraif7/omnibus-gitlab
  • ergoz/omnibus-gitlab
  • dariuszdoboszq/omnibus-gitlab
  • ramasusarla357/omnibus-gitlab
  • gitlab-community/omnibus-gitlab
  • zhangwenlong8911/omnibus-gitlab
  • chapa/omnibus-gitlab
  • luzhiyuan.deer/omnibus-gitlab
  • shrikantalone90/omnibus-gitlab
  • sankalp9094108/omnibus-gitlab
  • AnaelMobilia/omnibus-gitlab
  • thomas.borlee/omnibus-gitlab
  • bhairavdhanwade/omnibus-gitlab
  • black26/omnibus-gitlab
  • v.antonov/omnibus-gitlab
  • znolan6/omnibus-gitlab
  • suroor.4u2/omnibus-gitlab
  • pleia2/omnibus-gitlab
  • emirates.com.sa/omnibus-gitlab
  • vermeeren/omnibus-gitlab
  • kellerassel007/omnibus-gitlab
  • psureshbabu/omnibus-gitlab
  • Nirvanasake/omnibus-gitlab
  • michael.eischer/omnibus-gitlab
  • rowindey/omnibus-gitlab
  • anupamnautiyal/omnibus-gitlab
  • Marzieh.rahmani/omnibus-gitlab
  • zineddinechabbaki/omnibus-gitlab
  • puryabzp/omnibus-gitlab
  • andreaskrauss/omnibus-gitlab
  • kapileshwarsimha/omnibus-gitlab
  • LoicMahieu/omnibus-gitlab
  • ss-fork/omnibus-gitlab
  • syedzubeen/omnibus-gitlab
  • V0V4N/omnibus-gitlab
  • marxarelli/omnibus-gitlab
  • Samlily-Xie/omnibus-gitlab
  • khill-fbmc/omnibus-gitlab
  • davoodeh/omnibus-gitlab
  • mjavadhpour/omnibus-gitlab
  • qinggemei/omnibus-gitlab
  • wjrarneson78/omnibus-gitlab
  • adamsonerica9/omnibus-gitlab
  • Dieyzarr/omnibus-gitlab
  • Alexand/omnibus-gitlab
  • aaxhrj/omnibus-gitlab
  • alexand-group/test-renovate-group/omnibus-gitlab
  • PolaricEntropy/omnibus-gitlab
  • mousa.afhd/omnibus-gitlab
  • xsizxenjin/omnibus-gitlab
  • ttungekar/omnibus-gitlab
  • rdcamel/omnibus-gitlab
  • lqb/omnibus-gitlab
  • avalor1/omnibus-gitlab
  • etews/omnibus-gitlab
  • alexandralicht0/omnibus-gitlab
  • JinXinWang/omnibus-gitlab
  • Obinna26/omnibus-gitlab
  • YarLyashenko/omnibus-gitlab
  • amjadkhichi007/omnibus-gitlab
  • Xyz00777/omnibus-gitlab
  • gwe32/omnibus-gitlab
  • scop/omnibus-gitlab
  • joserovic.dimacali.dropify/omnibus-gitlab
  • syvb/omnibus-gitlab
  • ronaldbradford/omnibus-gitlab
  • ped0071/omnibus-gitlab
  • nsnegro718/omnibus-gitlab
  • m1ry/omnibus-gitlab
  • odyhpi/omnibus-gitlab
  • Hawthorne001/omnibus-gitlab
  • ssii_samuel/omnibus-gitlab
  • lilliam.arce/omnibus-gitlab
  • gitlab-renovate-forks/omnibus-gitlab
  • bufferoverflow/omnibus-gitlab
  • nachimeryam/omnibus-gitlab
  • abirhasantor/omnibus-gitlab
  • bluezoo/third-party/official/gitlab-org/omnibus-gitlab
  • a.songer/omnibus-gitlab
  • festive_elk/omnibus-gitlab
  • shawtylow2801/omnibus-gitlab
  • olaobajua/omnibus-gitlab
  • Vesias/omnibus-gitlab
  • MaKaNu/omnibus-gitlab
  • chyhave/omnibus-gitlab
  • yushao.sqpc/omnibus-gitlab
  • ShineZaw123/omnibus-gitlab
  • andreas-bellmann/omnibus-gitlab
  • Mexico_admin/omnibus-gitlab
  • navalboyblue/kryptonite-gold
  • galwood/omnibus-gitlab
  • ls-aavenel/omnibus-gitlab
  • axugl/omnibus-gitlab-packager
  • CODEREPO-GITTv/omnibus-gitlab
  • lucus.li/omnibus-gitlab
  • NicolasCasademont/omnibus-gitlab
  • reality.ds6/omnibus-gitlab
  • tylorjohnson30/omnibus-gitlab
  • jcole-ext/omnibus-gitlab
  • aliabodonea5551/omnibus-gitlab
  • manhqthp1999/omnibus-gitlab
  • jamesbledsoe2022/omnibus-gitlab
  • edwardpaton/omnibus-gitlab
  • gitlab-com/localization/tech-docs-forked-projects/prod/omnibus-gitlab
  • Dragonwolf99/omnibus-gitlab
  • khulnasoft-devops/stack-flow
  • magicstone.org/stack-flow
  • markandrewj/omnibus-gitlab
  • ndrpnt/omnibus-gitlab
  • Yedfree/omnibus-gitlab
1072 results
Show changes
Commits on Source (15)
Showing
with 312 additions and 978 deletions
...@@ -61,11 +61,11 @@ variables: ...@@ -61,11 +61,11 @@ variables:
CACHE_KEY_SUFFIX: '-v2' CACHE_KEY_SUFFIX: '-v2'
CACHE_EDITION: "CE" CACHE_EDITION: "CE"
ISSUE_BOT_LABELS_EXTRA: "group::distribution" ISSUE_BOT_LABELS_EXTRA: "group::distribution"
BUNDLER_VERSION: "2.4.12" BUNDLER_VERSION: "2.4.13"
# NOTE: When `NEXT_RUBY_VERSION` is updated, flip # NOTE: When `NEXT_RUBY_VERSION` is updated, flip
# `USE_NEXT_RUBY_VERSION_IN_*` variables to false to avoid surprises. # `USE_NEXT_RUBY_VERSION_IN_*` variables to false to avoid surprises.
NEXT_RUBY_VERSION: "3.0.6" NEXT_RUBY_VERSION: "3.0.6"
GET_GEO_TAG: "0.6.0" GET_GEO_TAG: "0.7.1"
CANONICAL_PROJECT_PATH: 'gitlab-org/omnibus-gitlab' CANONICAL_PROJECT_PATH: 'gitlab-org/omnibus-gitlab'
SECURITY_PROJECT_PATH: 'gitlab-org/security/omnibus-gitlab' SECURITY_PROJECT_PATH: 'gitlab-org/security/omnibus-gitlab'
DEV_PROJECT_PATH: 'gitlab/omnibus-gitlab' DEV_PROJECT_PATH: 'gitlab/omnibus-gitlab'
......
...@@ -3,6 +3,87 @@ ...@@ -3,6 +3,87 @@
The latest version of this file can be found at the master branch of the The latest version of this file can be found at the master branch of the
omnibus-gitlab repository. omnibus-gitlab repository.
## 16.0.0 (2023-05-18)
### Added (6 changes)
- [Add AlmaLinux 9 packages](gitlab-org/omnibus-gitlab@61f050298f5293367e8aa8e6acb4c25a25192512) ([merge request](gitlab-org/omnibus-gitlab!6817))
- [Add SMTP timeout configuration options](gitlab-org/omnibus-gitlab@50e7a5b96bbe8fedd3a555a73fd36799e8ac6925) ([merge request](gitlab-org/omnibus-gitlab!6874))
- [Add EPL 2.0 as acceptable license](gitlab-org/omnibus-gitlab@06466fcdc5427c27395de0396a32ba513dbb1dc0) ([merge request](gitlab-org/omnibus-gitlab!6853))
- [Add ability to set log directory group for runit managed services](gitlab-org/omnibus-gitlab@ecfca36c98ddb95fc7157b3484c94670f0db1386) ([merge request](gitlab-org/omnibus-gitlab!6809))
- [Allow configuring an embedding database](gitlab-org/omnibus-gitlab@586eea00c656a02a3541f3beb0da8a2940581094) ([merge request](gitlab-org/omnibus-gitlab!6823))
- [Add `GITLAB_PRE_RECONFIGURE_SCRIPT` variable support to Docker image](gitlab-org/omnibus-gitlab@69c83d60cc6ef1796a4b22be0aac988b9d31e4c0) by @ergoz ([merge request](gitlab-org/omnibus-gitlab!6744))
### Fixed (4 changes)
- [Update Redis URL implementation to work with Ruby 3.1+](gitlab-org/omnibus-gitlab@5df3c4d34cb30efb184eb9586f77e682fe140ab1) ([merge request](gitlab-org/omnibus-gitlab!6864))
- [EL Stream releases have different VERSION strings](gitlab-org/omnibus-gitlab@93845747f901d00c9a383b0681a8bc63a451d10d) ([merge request](gitlab-org/omnibus-gitlab!6884))
- [Make it possible to run Puma v6](gitlab-org/omnibus-gitlab@d378406baf91c9d7074c7de6539ed9a30ff37184) ([merge request](gitlab-org/omnibus-gitlab!6854))
- [Symlink the public ssh key to /ets/ssh folder](gitlab-org/omnibus-gitlab@33e1af97797af90161ab8d6d946d3c74dbe0ae08) ([merge request](gitlab-org/omnibus-gitlab!6732))
### Changed (10 changes)
- [Bump rubygems to 3.4.13](gitlab-org/omnibus-gitlab@56c0d2ee28e4bf9e9e3307d8fe1435e072676d38) ([merge request](gitlab-org/omnibus-gitlab!6880))
- [Validate that SMTP settings do not enable both TLS and STARTTLS](gitlab-org/omnibus-gitlab@30be4382b7a765c983e6f50eb3c9f45dbb87f0b4) ([merge request](gitlab-org/omnibus-gitlab!6863))
- [Default to two database connections i.e. main and ci](gitlab-org/omnibus-gitlab@cd3fcb86b03041f11aaed66d3830aea4de866b6d) ([merge request](gitlab-org/omnibus-gitlab!6850))
- [Prune extraneous precompiled shared libraries in gems](gitlab-org/omnibus-gitlab@4aa93d9bb8668c2d23f2e1a381504ea439f57071) ([merge request](gitlab-org/omnibus-gitlab!6869))
- [Update libre2 to 2023-03-01](gitlab-org/omnibus-gitlab@bf75e78ce0d8a4ab56b35402b5b4ec75cd5d718c) ([merge request](gitlab-org/omnibus-gitlab!6733))
- [Bump container-registry version to 3.72.0](gitlab-org/omnibus-gitlab@f135f9bd322f0e54147d42e28610f0941e84005c) ([merge request](gitlab-org/omnibus-gitlab!6859))
- [Build use golang 1.19.8](gitlab-org/omnibus-gitlab@fc4b211526c6770165a36bdddf8d9b340fbcd1d4) ([merge request](gitlab-org/omnibus-gitlab!6851))
- [Update RubyGems to v3.4.12](gitlab-org/omnibus-gitlab@8366c46608f87ef35e539dc8b47058f94ab31925) ([merge request](gitlab-org/omnibus-gitlab!6843))
- [Make 15.11 minimum required version to upgrade to 16.0](gitlab-org/omnibus-gitlab@5a2cc648af2dac967de78846742b86d0278d1ad1) ([merge request](gitlab-org/omnibus-gitlab!6833))
- [Remove gitaly-ruby build](gitlab-org/omnibus-gitlab@08138799d93064f7c760c7d708b4483495eb920f) ([merge request](gitlab-org/omnibus-gitlab!6837))
### Deprecated (12 changes)
- [Document Grafana deprecation](gitlab-org/omnibus-gitlab@069a9ab67dac6f7fd6ae8be8d34b303b7eb390c7) ([merge request](gitlab-org/omnibus-gitlab!6878))
- [Turn off Grafana unless forced](gitlab-org/omnibus-gitlab@5d11d3defe583eea0aaf4a741af2676b55c17208) ([merge request](gitlab-org/omnibus-gitlab!6847))
- [Deprecate usage of node['gitlab']['web-server'] in gitlab.rb](gitlab-org/omnibus-gitlab@5b590ecefeeb5b84855262f65bc2c6d5a2a720b9) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['storage-check'] in gitlab.rb](gitlab-org/omnibus-gitlab@4845016b0b2de70c45361ccd7efdcb4b3c0883e7) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['prometheus-monitoring'] in gitlab.rb](gitlab-org/omnibus-gitlab@aad1b69270a0a4265079a8e2845b19813eccc274) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['omnibus-gitconfig'] in gitlab.rb](gitlab-org/omnibus-gitlab@c4cc17e9d74f00774d17d858736eb3776c2dbea6) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['manage-storage-directories']](gitlab-org/omnibus-gitlab@7d6b0aed8b99bac356da1ce447278d8e09199c63) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['manage-accounts'] in gitlab.rb](gitlab-org/omnibus-gitlab@8ad1c813565f487f8cd2a2f47920467827980e70) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['high-availability'] in gitlab.rb](gitlab-org/omnibus-gitlab@6288b920d5753524b6e27806077531ad5d6fa95c) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['gitlab-ci'] in gitlab.rb](gitlab-org/omnibus-gitlab@b0551cbc86507f4f62d233d32cba4aa44153d2c5) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [Deprecate usage of node['gitlab']['*-external-url'] in gitlab.rb](gitlab-org/omnibus-gitlab@f8d7a6639fcd9278a1e95099f8d934a098e4a888) ([merge request](gitlab-org/omnibus-gitlab!6766))
- [gitaly: Remove gitaly-ruby configuration](gitlab-org/omnibus-gitlab@5a69dd55c230ce74add138aa0c0e255e1c98de0a) ([merge request](gitlab-org/omnibus-gitlab!6826))
### Removed (5 changes)
- [Remove old Praefect configuration remapping](gitlab-org/omnibus-gitlab@deccf323279ab1b82c05e632d8f1203b13508b2c) ([merge request](gitlab-org/omnibus-gitlab!6867))
- [Disable Consul telemetry compatibility](gitlab-org/omnibus-gitlab@5c404cdf79c692cb90af60b381f0883ea0f4ac6c) ([merge request](gitlab-org/omnibus-gitlab!6872))
- [Remove select2 from software list](gitlab-org/omnibus-gitlab@61e4a2907a83eb6b83bd46cf4d88f281764c6f0e) ([merge request](gitlab-org/omnibus-gitlab!6871))
- [Remove puma_worker_killer](gitlab-org/omnibus-gitlab@88dd1dc6dfc51b37f41b302b46af1d1ed1b0cef6) ([merge request](gitlab-org/omnibus-gitlab!6845))
- [Remove rails 'default_can_create_group' setting](gitlab-org/omnibus-gitlab@205c0c96092796d6ecbff23fb5692defcba10749) ([merge request](gitlab-org/omnibus-gitlab!6819))
### Security (2 changes)
- [Patch Openssl for CVE-2023-0464](gitlab-org/omnibus-gitlab@190e03ea2669535a98d3be8a43f723e1b2c0ebbb)
- [Patch Grafana against session cookie vulnerability and CVE-2023-1410](gitlab-org/omnibus-gitlab@5366ca75405e2fe30f01bd2be5066409c179cba4)
### Other (5 changes)
- [Fix broken link in GitLab 15 docs](gitlab-org/omnibus-gitlab@7002b28aed05822c6e8f248d369b144cf1372d63) by @felix.divo ([merge request](gitlab-org/omnibus-gitlab!6882))
- [Use Ubuntu 22.04 as base for the GitLab Docker image.](gitlab-org/omnibus-gitlab@0728bc4104b5e1c883e38a2ace42acdcac252349) ([merge request](gitlab-org/omnibus-gitlab!6830))
- [Postpone cinc EOL message](gitlab-org/omnibus-gitlab@d549962217889f3104f972e0ebb93ad8e3bda08a) ([merge request](gitlab-org/omnibus-gitlab!6857))
- [Drop bundler software definition](gitlab-org/omnibus-gitlab@3f08274227a17adf5f7d42403804af198895a726) ([merge request](gitlab-org/omnibus-gitlab!6849))
- [Update Mattermost to 7.10.0](gitlab-org/omnibus-gitlab@ec498e8b899bfaf00d07d161a5a03ae9aed66612) by @akis.maziotis ([merge request](gitlab-org/omnibus-gitlab!6827))
## 15.11.5 (2023-05-19)
No changes.
## 15.11.4 (2023-05-16)
### Added (1 change)
- [Add SMTP timeout configuration options](gitlab-org/omnibus-gitlab@42c08ac804b58e31b67f81193589a3d1d2523d07) ([merge request](gitlab-org/omnibus-gitlab!6888))
### Changed (1 change)
- [Validate that SMTP settings do not enable both TLS and STARTTLS](gitlab-org/omnibus-gitlab@0bc5f6a53fad0873563f3456b368a84da6128a50) ([merge request](gitlab-org/omnibus-gitlab!6876))
## 15.11.3 (2023-05-10) ## 15.11.3 (2023-05-10)
No changes. No changes.
......
...@@ -578,4 +578,4 @@ DEPENDENCIES ...@@ -578,4 +578,4 @@ DEPENDENCIES
yard yard
BUNDLED WITH BUNDLED WITH
2.4.12 2.4.13
...@@ -47,6 +47,13 @@ registry['log_directory'] = "/var/log/gitlab/registry" ...@@ -47,6 +47,13 @@ registry['log_directory'] = "/var/log/gitlab/registry"
... ...
``` ```
Gitaly and Mattermost have different log directory configs:
```ruby
gitaly['configuration']['logging']['dir'] = "/var/log/gitlab/registry"
mattermost['log_file_directory'] = "/var/log/gitlab/registry"
```
Run `sudo gitlab-ctl reconfigure` to configure your instance with these settings. Run `sudo gitlab-ctl reconfigure` to configure your instance with these settings.
## runit logs ## runit logs
...@@ -226,7 +233,7 @@ gitaly['logging_format'] = '' ...@@ -226,7 +233,7 @@ gitaly['logging_format'] = ''
gitlab_shell['log_format'] = 'text' gitlab_shell['log_format'] = 'text'
gitlab_workhorse['log_format'] = 'text' gitlab_workhorse['log_format'] = 'text'
registry['log_formatter'] = 'text' registry['log_formatter'] = 'text'
sidekiq['log_format'] = 'default' sidekiq['log_format'] = 'text'
gitlab_pages['log_format'] = 'text' gitlab_pages['log_format'] = 'text'
``` ```
......
...@@ -2443,7 +2443,6 @@ external_url 'GENERATED_EXTERNAL_URL' ...@@ -2443,7 +2443,6 @@ external_url 'GENERATED_EXTERNAL_URL'
# deployments, see https://docs.gitlab.com/ee/administration/gitaly/index.html . # deployments, see https://docs.gitlab.com/ee/administration/gitaly/index.html .
# gitaly['enable'] = true # gitaly['enable'] = true
# gitaly['dir'] = "/var/opt/gitlab/gitaly" # gitaly['dir'] = "/var/opt/gitlab/gitaly"
# gitaly['log_directory'] = "/var/log/gitlab/gitaly"
# gitaly['log_group'] = nil # gitaly['log_group'] = nil
# gitaly['bin_path'] = "/opt/gitlab/embedded/bin/gitaly" # gitaly['bin_path'] = "/opt/gitlab/embedded/bin/gitaly"
# gitaly['env_directory'] = "/opt/gitlab/etc/gitaly/env" # gitaly['env_directory'] = "/opt/gitlab/etc/gitaly/env"
...@@ -2474,6 +2473,7 @@ external_url 'GENERATED_EXTERNAL_URL' ...@@ -2474,6 +2473,7 @@ external_url 'GENERATED_EXTERNAL_URL'
# }, # },
# graceful_restart_timeout: '1m', # Grace time for a gitaly process to finish ongoing requests # graceful_restart_timeout: '1m', # Grace time for a gitaly process to finish ongoing requests
# logging: { # logging: {
# dir: "/var/log/gitlab/gitaly"
# level: 'warn', # level: 'warn',
# format: 'json', # format: 'json',
# sentry_dsn: 'https://<key>:<secret>@sentry.io/<project>', # sentry_dsn: 'https://<key>:<secret>@sentry.io/<project>',
...@@ -2517,7 +2517,7 @@ external_url 'GENERATED_EXTERNAL_URL' ...@@ -2517,7 +2517,7 @@ external_url 'GENERATED_EXTERNAL_URL'
# hierarchy_root: 'gitaly', # hierarchy_root: 'gitaly',
# memory_bytes: 1048576, # memory_bytes: 1048576,
# cpu_shares: 512, # cpu_shares: 512,
# cpu_quota_us: 400000 # cpu_quota_us: 400000,
# repositories: { # repositories: {
# count: 1000, # count: 1000,
# memory_bytes: 12884901888, # memory_bytes: 12884901888,
......
...@@ -4,7 +4,6 @@ default['gitaly']['dir'] = "/var/opt/gitlab/gitaly" ...@@ -4,7 +4,6 @@ default['gitaly']['dir'] = "/var/opt/gitlab/gitaly"
default['gitaly']['env_directory'] = "/opt/gitlab/etc/gitaly/env" default['gitaly']['env_directory'] = "/opt/gitlab/etc/gitaly/env"
# default['gitaly']['env'] is set in ../recipes/enable.rb # default['gitaly']['env'] is set in ../recipes/enable.rb
default['gitaly']['bin_path'] = "/opt/gitlab/embedded/bin/gitaly" default['gitaly']['bin_path'] = "/opt/gitlab/embedded/bin/gitaly"
default['gitaly']['storage'] = []
default['gitaly']['open_files_ulimit'] = 15000 default['gitaly']['open_files_ulimit'] = 15000
default['gitaly']['consul_service_name'] = 'gitaly' default['gitaly']['consul_service_name'] = 'gitaly'
default['gitaly']['consul_service_meta'] = nil default['gitaly']['consul_service_meta'] = nil
...@@ -21,5 +20,6 @@ default['gitaly']['configuration'] = { ...@@ -21,5 +20,6 @@ default['gitaly']['configuration'] = {
git: { git: {
use_bundled_binaries: true, use_bundled_binaries: true,
bin_path: "#{node['package']['install-dir']}/embedded/bin/git" bin_path: "#{node['package']['install-dir']}/embedded/bin/git"
} },
storage: []
} }
...@@ -27,33 +27,12 @@ module Gitaly ...@@ -27,33 +27,12 @@ module Gitaly
parse_git_data_dirs parse_git_data_dirs
parse_gitaly_storages parse_gitaly_storages
parse_gitconfig parse_gitconfig
parse_legacy_cgroup_variables
remap_legacy_values
check_array_entries
end
def parse_legacy_cgroup_variables
# Don't map these if the new configuraton is set. Doing so would set the old keys
# and raise an error as both keys are set.
return unless Gitlab['gitaly'].dig('configuration', 'cgroups').nil?
# maintain backwards compatibility with pre 15.0 Gitaly cgroups config
cgroups_repositories_memory_bytes = Gitlab['gitaly']['cgroups_repositories_memory_bytes'] || (Gitlab['gitaly']['cgroups_memory_limit'] if Gitlab['gitaly']['cgroups_memory_enabled'])
cgroups_repositories_cpu_shares = Gitlab['gitaly']['cgroups_repositories_cpu_shares'] || (Gitlab['gitaly']['cgroups_cpu_shares'] if Gitlab['gitaly']['cgroups_cpu_enabled'])
cgroups_repositories_count = Gitlab['gitaly']['cgroups_repositories_count'] || Gitlab['gitaly']['cgroups_count']
cgroups_cpu_shares = Gitlab['gitaly']['cgroups_cpu_shares'] if Gitlab['gitaly']['cgroups_repositories_count'] && cgroups_repositories_count&.positive?
Gitlab['gitaly']['cgroups_cpu_shares'] = cgroups_cpu_shares
Gitlab['gitaly']['cgroups_repositories_count'] = cgroups_repositories_count
Gitlab['gitaly']['cgroups_repositories_memory_bytes'] = cgroups_repositories_memory_bytes
Gitlab['gitaly']['cgroups_repositories_cpu_shares'] = cgroups_repositories_cpu_shares
end end
def gitaly_address def gitaly_address
socket_path = user_config.dig('configuration', 'socket_path') || user_config['socket_path'] || package_default.dig('configuration', 'socket_path') listen_addr = user_config.dig('configuration', 'listen_addr') || package_default.dig('configuration', 'listen_addr')
listen_addr = user_config.dig('configuration', 'listen_addr') || user_config['listen_addr'] || package_default.dig('configuration', 'listen_addr') socket_path = user_config.dig('configuration', 'socket_path') || package_default.dig('configuration', 'socket_path')
tls_listen_addr = user_config.dig('configuration', 'tls_listen_addr') || user_config['tls_listen_addr'] || package_default.dig('configuration', 'tls_listen_addr') tls_listen_addr = user_config.dig('configuration', 'tls_listen_addr') || package_default.dig('configuration', 'tls_listen_addr')
# Default to using socket path if available # Default to using socket path if available
if tls_listen_addr && !tls_listen_addr.empty? if tls_listen_addr && !tls_listen_addr.empty?
...@@ -84,7 +63,7 @@ module Gitaly ...@@ -84,7 +63,7 @@ module Gitaly
end end
def parse_gitaly_storages def parse_gitaly_storages
return unless Gitlab['gitaly']['storage'].nil? && Gitlab['gitaly'].dig('configuration', 'storage').nil? return unless Gitlab['gitaly'].dig('configuration', 'storage').nil?
storages = [] storages = []
Gitlab['gitlab_rails']['repositories_storages'].each do |key, value| Gitlab['gitlab_rails']['repositories_storages'].each do |key, value|
...@@ -100,9 +79,9 @@ module Gitaly ...@@ -100,9 +79,9 @@ module Gitaly
# Compute the default gitconfig from the old Omnibus gitconfig setting. # Compute the default gitconfig from the old Omnibus gitconfig setting.
# This depends on the Gitlab cookbook having been parsed already. # This depends on the Gitlab cookbook having been parsed already.
def parse_gitconfig def parse_gitconfig
# If the administrator has set `gitaly['gitconfig']` then we do not add a # If the administrator has set `gitaly[:configuration][:git][:config]` then we do not add a
# fallback gitconfig. # fallback gitconfig.
return unless Gitlab['gitaly']['gitconfig'].nil? return unless Gitlab['gitaly'].dig('configuration', 'git', 'config').nil?
# Furthermore, if the administrator has not overridden the # Furthermore, if the administrator has not overridden the
# `omnibus_gitconfig` we do not have to migrate anything either. Most # `omnibus_gitconfig` we do not have to migrate anything either. Most
...@@ -165,7 +144,20 @@ module Gitaly ...@@ -165,7 +144,20 @@ module Gitaly
return unless gitaly_gitconfig.any? return unless gitaly_gitconfig.any?
Gitlab['gitaly']['gitconfig'] = gitaly_gitconfig tmp_source_hash = {
configuration: {
git: {
config: gitaly_gitconfig.map do |entry|
{
key: [entry['section'], entry['subsection'], entry['key']].compact.join('.'),
value: entry['value']
}
end
}
}
}
Chef::Mixin::DeepMerge.deep_merge!(tmp_source_hash, Gitlab['gitaly'])
end end
private private
...@@ -177,163 +169,5 @@ module Gitaly ...@@ -177,163 +169,5 @@ module Gitaly
def package_default def package_default
Gitlab['node']['gitaly'].to_hash Gitlab['node']['gitaly'].to_hash
end end
# remap_legacy_values moves configuration values from their legacy locations to where they are
# in Gitaly's own configuration. All of the configuration was previously grouped under Gitlab['gitaly']
# but now Gitaly's own config is under Gitlab['gitaly']['configuration']. This then allows us to
# simply encode the map as TOML to get the resulting Gitaly configuration file without having to manually
# template every key. As existing configuration files may can still have the configuration in its old place,
# this method provides backwards compatibility by moving the old values to their new locations. This can
# compatibility wrapper can be removed in 16.0
def remap_legacy_values
Gitlab['gitaly']['configuration'] = {} unless Gitlab['gitaly']['configuration']
remap_recursive(
{
socket_path: 'socket_path',
runtime_dir: 'runtime_dir',
listen_addr: 'listen_addr',
prometheus_listen_addr: 'prometheus_listen_addr',
tls_listen_addr: 'tls_listen_addr',
tls: {
certificate_path: 'certificate_path',
key_path: 'key_path'
},
graceful_restart_timeout: 'graceful_restart_timeout',
logging: {
level: 'logging_level',
format: 'logging_format',
sentry_dsn: 'logging_sentry_dsn',
sentry_environment: 'logging_sentry_environment',
dir: 'log_directory'
},
prometheus: {
grpc_latency_buckets: lambda {
return [] unless Gitlab['gitaly'].key?('prometheus_grpc_latency_buckets')
raise "Legacy configuration key 'prometheus_grpc_latency_buckets' can't be set when its new key 'configuration.prometheus.grpc_latency_buckets' is set." if (Gitlab['gitaly'].dig('configuration', 'prometheus') || {}).key?('grpc_latency_buckets')
# The legacy value is not actually an array but a string like '[0, 1, 2]'.
# The template evaluated Ruby code, so the array string got evaluated to
# an array. Parse the array into a Ruby array here.
JSON.parse(Gitlab['gitaly']['prometheus_grpc_latency_buckets'])
},
},
auth: {
token: 'auth_token',
transitioning: 'auth_transitioning'
},
git: {
catfile_cache_size: 'git_catfile_cache_size',
bin_path: 'git_bin_path',
use_bundled_binaries: 'use_bundled_git',
signing_key: 'gpg_signing_key_path',
config: lambda {
return [] unless Gitlab['gitaly']['gitconfig']
raise "Legacy configuration keys 'gitconfig' and 'omnibus_gitconfig' can't be set when its new key 'configuration.git.config' is set." if (Gitlab['gitaly'].dig('configuration', 'git') || {}).key?('config')
Gitlab['gitaly']['gitconfig'].map do |entry|
{
key: [entry['section'], entry['subsection'], entry['key']].compact.join('.'),
value: entry['value']
}
end
}
},
storage: 'storage',
hooks: {
custom_hooks_dir: 'custom_hooks_dir'
},
daily_maintenance: {
disabled: 'daily_maintenance_disabled',
start_hour: 'daily_maintenance_start_hour',
start_minute: 'daily_maintenance_start_minute',
duration: 'daily_maintenance_duration',
storages: 'daily_maintenance_storages'
},
cgroups: {
mountpoint: 'cgroups_mountpoint',
hierarchy_root: 'cgroups_hierarchy_root',
memory_bytes: 'cgroups_memory_bytes',
cpu_shares: 'cgroups_cpu_shares',
repositories: {
count: 'cgroups_repositories_count',
memory_bytes: 'cgroups_repositories_memory_bytes',
cpu_shares: 'cgroups_repositories_cpu_shares'
}
},
concurrency: 'concurrency',
rate_limiting: 'rate_limiting',
pack_objects_cache: {
enabled: 'pack_objects_cache_enabled',
dir: 'pack_objects_cache_dir',
max_age: 'pack_objects_cache_max_age'
}
},
Gitlab['gitaly']['configuration'],
['configuration']
)
end
# remap_recursive goes over the mappings to remap the configuration from the old format into the new
# format:
# - Hash values indicate a subsection in the destination configuration. Hashes are recursed into to
# build the expected configuration structure.
# - Proc values are mapping functions that return the new value when executed.
# - String values indicate an old configuration key that should be copied into the new configuration
# under the new key.
#
# new_parent contains the parent key path on each level of recursion.
def remap_recursive(mappings, new_configuration, new_parent)
mappings.each do |new_key, mapping|
# If this is a hash, recurse the tree to create the correct structure.
if mapping.is_a?(Hash)
new_value = remap_recursive(
mappings[new_key],
# If there is already a section in the new configuration under the key, use that. If not,
# initialize and empty hash for the section.
Gitlab['gitaly'].dig(*[new_parent, new_key].flatten) || {},
[new_parent, new_key].flatten
)
new_configuration[new_key] = new_value unless new_value.empty?
next
end
# If this is a Proc, it's a mapping function that returns the value for the
# new key.
if mapping.is_a?(Proc)
new_value = mapping.call
new_configuration[new_key] = new_value unless new_value.empty?
next
end
# If the mapping is not a hash nor a lambda, then it is a String. The value gets copied from the
# mapping to the new_key as is.
#
# If there is no old key, then there's nothing to map. Proceed to the next key.
next unless Gitlab['gitaly'].key?(mapping)
# Raise an error if both the old key and the new key are present in the configuration as it would be
# ambigious which key is ued in the final configuration.
raise "Legacy configuration key '#{mapping}' can't be set when its new key '#{[new_parent, new_key].flatten.join('.')}' is set." if new_configuration.key?(new_key)
new_configuration[new_key] = Gitlab['gitaly'][mapping]
end
new_configuration
end
# check_array_entries checks that array values in the new configuration are actually arrays.
# These values were historically configured as strings. This check guards against copy paster mistakes
# users may do while migrating to the new configuration. This check can be removed along the
# backwards compatibility code in 16.0.
def check_array_entries
[
[:prometheus, :grpc_latency_buckets]
].each do |key_path|
value = Gitlab['gitaly']['configuration'].dig(*key_path)
raise "gitaly['configuration']#{key_path.map { |e| "[:#{e}]" }.join('')} must be an array, not a string" unless value.nil? || value.is_a?(Array)
end
end
end end
end end
...@@ -57,7 +57,7 @@ module Gitlab ...@@ -57,7 +57,7 @@ module Gitlab
attribute('spamcheck') attribute('spamcheck')
attribute('patroni').use { Patroni } attribute('patroni').use { Patroni }
attribute('gitaly').use { Gitaly } attribute('gitaly').use { Gitaly }
attribute('praefect').use { Praefect } attribute('praefect')
attribute('mattermost', priority: 30).use { GitlabMattermost } # Mattermost checks if GitLab is enabled on the same box attribute('mattermost', priority: 30).use { GitlabMattermost } # Mattermost checks if GitLab is enabled on the same box
attribute('letsencrypt', priority: 17).use { LetsEncrypt } # After GitlabRails, but before Registry and Mattermost attribute('letsencrypt', priority: 17).use { LetsEncrypt } # After GitlabRails, but before Registry and Mattermost
attribute('crond') attribute('crond')
......
...@@ -287,7 +287,7 @@ module Gitlab ...@@ -287,7 +287,7 @@ module Gitlab
{ {
config_keys: %w(gitaly cgroups_count), config_keys: %w(gitaly cgroups_count),
deprecation: '15.1', deprecation: '15.1',
removal: '16.1', # https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6828 removal: '16.0', # https://gitlab.com/gitlab-org/omnibus-gitlab/-/issues/6828
note: "Use `gitaly['cgroups_repositories_count']` instead." note: "Use `gitaly['cgroups_repositories_count']` instead."
}, },
{ {
......
...@@ -13,7 +13,6 @@ default['praefect']['configuration'] = { ...@@ -13,7 +13,6 @@ default['praefect']['configuration'] = {
logging: { logging: {
format: 'json', format: 'json',
}, },
prometheus_exclude_database_from_default_metrics: true,
auth: { auth: {
transitioning: false transitioning: false
}, },
......
require 'tomlib'
module Praefect
class << self
def parse_variables
parse_virtual_storages
remap_legacy_values
check_array_entries
end
# remap_legacy_values moves configuration values from their legacy locations to where they are
# in Praefect's own configuration. All of the configuration was previously grouped under Gitlab['praefect']
# but now Praefect's own config is under Gitlab['praefect']['configuration']. This then allows us to
# simply encode the map as TOML to get the resulting Praefect configuration file without having to manually
# template every key. As existing configuration files may can still have the configuration in its old place,
# this method provides backwards compatibility by moving the old values to their new locations. This can
# compatibility wrapper can be removed in 16.0
def remap_legacy_values
Gitlab['praefect']['configuration'] = {} unless Gitlab['praefect']['configuration']
remap_recursive(
{
listen_addr: 'listen_addr',
socket_path: 'socket_path',
prometheus_listen_addr: 'prometheus_listen_addr',
tls_listen_addr: 'tls_listen_addr',
prometheus_exclude_database_from_default_metrics: 'separate_database_metrics',
auth: {
token: 'auth_token',
transitioning: 'auth_transitioning',
},
logging: {
format: 'logging_format',
level: 'logging_level',
},
failover: {
enabled: 'failover_enabled',
},
background_verification: {
delete_invalid_records: 'background_verification_delete_invalid_records',
verification_interval: 'background_verification_verification_interval',
},
reconciliation: {
scheduling_interval: 'reconciliation_scheduling_interval',
histogram_buckets: lambda {
return [] unless Gitlab['praefect'].key?('reconciliation_histogram_buckets')
raise "Legacy configuration key 'reconciliation_histogram_buckets' can't be set when its new key 'configuration.reconciliation.histogram_buckets' is set." if (Gitlab['praefect'].dig('configuration', 'reconciliation') || {}).key?('histogram_buckets')
# The legacy key is not actually an array but a string like '[0, 1, 2]'.
# The template evaluated Ruby code, so the array string got evaluated to
# an array. Parse the array into a Ruby array here.
JSON.parse(Gitlab['praefect']['reconciliation_histogram_buckets'])
},
},
tls: {
certificate_path: 'certificate_path',
key_path: 'key_path',
},
database: {
host: 'database_host',
port: 'database_port',
user: 'database_user',
password: 'database_password',
dbname: 'database_dbname',
sslmode: 'database_sslmode',
sslcert: 'database_sslcert',
sslkey: 'database_sslkey',
sslrootcert: 'database_sslrootcert',
session_pooled: {
host: 'database_direct_host',
port: 'database_direct_port',
user: 'database_direct_user',
password: 'database_direct_password',
dbname: 'database_direct_dbname',
sslmode: 'database_direct_sslmode',
sslcert: 'database_direct_sslcert',
sslkey: 'database_direct_sslkey',
sslrootcert: 'database_direct_sslrootcert',
}
},
sentry: {
sentry_dsn: 'sentry_dsn',
sentry_environment: 'sentry_environment',
},
prometheus: {
grpc_latency_buckets: lambda {
return [] unless Gitlab['praefect'].key?('prometheus_grpc_latency_buckets')
raise "Legacy configuration key 'prometheus_grpc_latency_buckets' can't be set when its new key 'configuration.prometheus.grpc_latency_buckets' is set." if (Gitlab['praefect'].dig('configuration', 'prometheus') || {}).key?('grpc_latency_buckets')
# The legacy key is not actually an array but a string like '[0, 1, 2]'.
# The template evaluated Ruby code, so the array string got evaluated to
# an array. Parse the array into a Ruby array here.
JSON.parse(Gitlab['praefect']['prometheus_grpc_latency_buckets'])
},
},
graceful_stop_timeout: 'graceful_stop_timeout',
virtual_storage: lambda {
return [] unless Gitlab['praefect']['virtual_storages']
raise "Legacy configuration key 'virtual_storages' can't be set when its new key 'configuration.virtual_storage' is set." if Gitlab['praefect']['configuration'].key?('virtual_storage')
Gitlab['praefect']['virtual_storages'].map do |name, details|
virtual_storage = {
name: name,
node: details['nodes'].map do |name, details|
{
storage: name,
address: details['address'],
token: details['token'],
}
end
}
virtual_storage['default_replication_factor'] = details['default_replication_factor'] if details['default_replication_factor']
virtual_storage
end
}
},
Gitlab['praefect']['configuration'],
['configuration']
)
end
# remap_recursive goes over the mappings to remap the configuration from the old format into the new
# format:
# - Hash values indicate a subsection in the destination configuration. Hashes are recursed into to
# build the expected configuration structure.
# - Proc values are mapping functions that return the new value when executed.
# - String values indicate an old configuration key that should be copied into the new configuration
# under the new key.
#
# new_parent contains the parent key path on each level of recursion.
def remap_recursive(mappings, new_configuration, new_parent)
mappings.each do |new_key, mapping|
# If this is a hash, recurse the tree to create the correct structure.
if mapping.is_a?(Hash)
new_value = remap_recursive(
mappings[new_key],
# If there is already a section in the new configuration under the key, use that. If not,
# initialize and empty hash for the section.
Gitlab['praefect'].dig(*[new_parent, new_key].flatten) || {},
[new_parent, new_key].flatten
)
new_configuration[new_key] = new_value unless new_value.empty?
next
end
# If this is a Proc, it's a mapping function that returns the value for the
# new key.
if mapping.is_a?(Proc)
new_value = mapping.call
new_configuration[new_key] = new_value unless new_value.empty?
next
end
# If the mapping is not a hash nor a lambda, then it is a String. The value gets copied from the
# mapping to the new_key as is.
#
# If there is no old key, then there's nothing to map. Proceed to the next key.
next unless Gitlab['praefect'].key?(mapping)
# Raise an error if both the old key and the new key are present in the configuration as it would be
# ambigious which key is ued in the final configuration.
raise "Legacy configuration key '#{mapping}' can't be set when its new key '#{[new_parent, new_key].flatten.join('.')}' is set." if new_configuration.key?(new_key)
new_configuration[new_key] = Gitlab['praefect'][mapping]
end
new_configuration
end
# check_array_entries checks that array values in the new configuration are actually arrays.
# These values were historically configured as strings. This check guards against copy paster mistakes
# users may do while migrating to the new configuration. This check can be removed along the
# backwards compatibility code in 16.0.
def check_array_entries
[
[:prometheus, :grpc_latency_buckets],
[:reconciliation, :histogram_buckets]
].each do |key_path|
value = Gitlab['praefect']['configuration'].dig(*key_path)
raise "praefect['configuration']#{key_path.map { |e| "[:#{e}]" }.join('')} must be an array, not a string" unless value.nil? || value.is_a?(Array)
end
end
def parse_virtual_storages
return if Gitlab['praefect']['virtual_storages'].nil?
raise "Praefect virtual_storages must be a hash" unless Gitlab['praefect']['virtual_storages'].is_a?(Hash)
Gitlab['praefect']['virtual_storages'].each do |virtual_storage, config_keys|
next unless config_keys.key?('nodes')
raise "Nodes of Praefect virtual storage `#{virtual_storage}` must be a hash" unless config_keys['nodes'].is_a?(Hash)
end
end
end
end
...@@ -30,9 +30,9 @@ module Praefect ...@@ -30,9 +30,9 @@ module Praefect
VIRTUAL_STORAGE_DESC = <<~EOS.freeze VIRTUAL_STORAGE_DESC = <<~EOS.freeze
Name of the virtual storage where the repository resides (mandatory). Name of the virtual storage where the repository resides (mandatory).
%%The virtual-storage-name can be found in /etc/gitlab/gitlab.rb under praefect["virtual_storages"]. %%The virtual-storage-name can be found in /etc/gitlab/gitlab.rb under praefect["configuration"]["virtual_storage"].
%%If praefect["virtual_storages"] = { "default" => {"nodes" => { ... }}, %%If praefect["configuration"]["virtual_storage"] = [{ "name" => "default" , "nodes" => [{ ... }]},
%%"storage_1" => {"nodes" => { ... }}}, the virtual-storage-name would be either "default", or "storage_1". %%{ "name" => "storage_1", "nodes" => [{ ... }]}], the virtual-storage-name would be either "default", or "storage_1".
%%This can also be found in the Project Detail page in the Admin Panel under "Gitaly storage name".' %%This can also be found in the Project Detail page in the Admin Panel under "Gitaly storage name".'
EOS EOS
......
...@@ -17,7 +17,7 @@ RSpec.describe 'gitaly' do ...@@ -17,7 +17,7 @@ RSpec.describe 'gitaly' do
let(:logging_sentry_dsn) { 'https://my_key:my_secret@sentry.io/test_project' } let(:logging_sentry_dsn) { 'https://my_key:my_secret@sentry.io/test_project' }
let(:logging_sentry_environment) { 'production' } let(:logging_sentry_environment) { 'production' }
let(:prometheus_grpc_latency_buckets) do let(:prometheus_grpc_latency_buckets) do
'[0.001, 0.005, 0.025, 0.1, 0.5, 1.0, 10.0, 30.0, 60.0, 300.0, 1500.0]' [0.001, 0.005, 0.025, 0.1, 0.5, 1.0, 10.0, 30.0, 60.0, 300.0, 1500.0]
end end
let(:auth_token) { '123secret456' } let(:auth_token) { '123secret456' }
let(:auth_transitioning) { true } let(:auth_transitioning) { true }
...@@ -93,7 +93,6 @@ RSpec.describe 'gitaly' do ...@@ -93,7 +93,6 @@ RSpec.describe 'gitaly' do
ignore_gitconfig: true, ignore_gitconfig: true,
use_bundled_binaries: true use_bundled_binaries: true
}, },
cgroups: { repositories: {} },
gitlab: { gitlab: {
relative_url_root: '', relative_url_root: '',
url: 'http+unix://%2Fvar%2Fopt%2Fgitlab%2Fgitlab-workhorse%2Fsockets%2Fsocket' url: 'http+unix://%2Fvar%2Fopt%2Fgitlab%2Fgitlab-workhorse%2Fsockets%2Fsocket'
...@@ -151,42 +150,6 @@ RSpec.describe 'gitaly' do ...@@ -151,42 +150,6 @@ RSpec.describe 'gitaly' do
end end
end end
context 'with pre 15.0 cgroups settings' do
before do
stub_gitlab_rb(
gitaly: {
cgroups_mountpoint: cgroups_mountpoint,
cgroups_count: 100,
cgroups_hierarchy_root: cgroups_hierarchy_root,
cgroups_memory_limit: cgroups_memory_bytes,
cgroups_memory_enabled: true,
cgroups_cpu_shares: cgroups_cpu_shares,
cgroups_cpu_enabled: true,
pack_objects_cache_enabled: pack_objects_cache_enabled,
pack_objects_cache_dir: pack_objects_cache_dir,
pack_objects_cache_max_age: pack_objects_cache_max_age,
custom_hooks_dir: gitaly_custom_hooks_dir
}
)
end
it 'populates gitaly cgroups with correct values' do
cgroups_section = Regexp.new([
%r{\[cgroups\]},
%r{mountpoint = "#{cgroups_mountpoint}"},
%r{hierarchy_root = "#{cgroups_hierarchy_root}"},
%r{\[cgroups.repositories\]},
%r{count = 100},
%r{memory_bytes = #{cgroups_memory_bytes}},
%r{cpu_shares = #{cgroups_cpu_shares}},
].map(&:to_s).join('\s+'))
expect(chef_run).to render_file(config_path).with_content { |content|
expect(content).to match(cgroups_section)
}
end
end
context 'sets cgroups settings' do context 'sets cgroups settings' do
before do before do
stub_gitlab_rb( stub_gitlab_rb(
...@@ -231,44 +194,6 @@ RSpec.describe 'gitaly' do ...@@ -231,44 +194,6 @@ RSpec.describe 'gitaly' do
end end
end end
context 'with new gitconfig' do
it 'raises an error with legacy gitconfig set' do
stub_gitlab_rb(
{
gitaly: {
gitconfig: [{ key: 'legacy_key', value: 'legacy_value' }],
configuration: {
git: {
config: [{ key: 'new_key', value: 'new_value' }]
}
}
}
}
)
expect { chef_run }.to raise_error "Legacy configuration keys 'gitconfig' and 'omnibus_gitconfig' can't be set when its new key 'configuration.git.config' is set."
end
it 'raises an error if omnibus_gitconfig is set' do
stub_gitlab_rb(
{
omnibus_gitconfig: {
system: { nondefault: ['bar = baz'] }
},
gitaly: {
configuration: {
git: {
config: [{ key: 'new_key', value: 'new_value' }]
}
}
}
}
)
expect { chef_run }.to raise_error "Legacy configuration keys 'gitconfig' and 'omnibus_gitconfig' can't be set when its new key 'configuration.git.config' is set."
end
end
context 'with Omnibus gitconfig' do context 'with Omnibus gitconfig' do
let(:omnibus_gitconfig) { nil } let(:omnibus_gitconfig) { nil }
let(:gitaly_gitconfig) { nil } let(:gitaly_gitconfig) { nil }
...@@ -279,7 +204,11 @@ RSpec.describe 'gitaly' do ...@@ -279,7 +204,11 @@ RSpec.describe 'gitaly' do
system: omnibus_gitconfig, system: omnibus_gitconfig,
}, },
gitaly: { gitaly: {
gitconfig: gitaly_gitconfig, configuration: {
git: {
config: gitaly_gitconfig,
}
}
} }
) )
end end
...@@ -395,7 +324,7 @@ RSpec.describe 'gitaly' do ...@@ -395,7 +324,7 @@ RSpec.describe 'gitaly' do
end end
end end
context 'with Gitaly gitconfig' do context 'with Gitaly configuration git config' do
let(:gitaly_gitconfig) do let(:gitaly_gitconfig) do
[ [
{ key: "core.fsckObjects", value: "true" }, { key: "core.fsckObjects", value: "true" },
...@@ -448,82 +377,6 @@ RSpec.describe 'gitaly' do ...@@ -448,82 +377,6 @@ RSpec.describe 'gitaly' do
} }
end end
end end
context 'with sections' do
let(:gitaly_gitconfig) do
[
{ section: 'core', key: 'fsckObjects', value: 'true' },
{ section: 'core', key: 'somethingElse', value: 'true' },
{ section: 'another', key: 'section', value: 'true' },
]
end
it 'writes the correct keys' do
gitconfig_section = Regexp.new([
%r{\[\[git.config\]\]},
%r{key = "core.fsckObjects"},
%r{value = "true"},
%r{},
%r{\[\[git.config\]\]},
%r{key = "core.somethingElse"},
%r{value = "true"},
%r{},
%r{\[\[git.config\]\]},
%r{key = "another.section"},
%r{value = "true"},
].map(&:to_s).join('\s+'))
expect(chef_run).to render_file(config_path).with_content { |content|
expect(content).to match(gitconfig_section)
expect(content).not_to include("overridden")
}
end
end
context 'with subsections' do
let(:gitaly_gitconfig) do
[
{ section: 'http', subsection: 'http://example.com', key: 'insteadOf', value: 'http://rewritten.example.com' },
{ key: 'http.http://another.example.com.insteadOf', value: 'http://rewritten.example.com' },
]
end
it 'writes the correct keys' do
gitconfig_section = Regexp.new([
%r{\[\[git.config\]\]},
%r{key = "http.http://example.com.insteadOf"},
%r{value = "http://rewritten.example.com"},
%r{},
%r{\[\[git.config\]\]},
%r{key = "http.http://another.example.com.insteadOf"},
%r{value = "http://rewritten.example.com"},
].map(&:to_s).join('\s+'))
expect(chef_run).to render_file(config_path).with_content { |content|
expect(content).to match(gitconfig_section)
expect(content).not_to include("overridden")
}
end
end
end
context 'with array configured as string' do
it 'raises an error with prometheus grpc latency buckets' do
stub_gitlab_rb(
{
gitaly: {
enable: true,
configuration: {
prometheus: {
grpc_latency_buckets: '[0, 1, 2]'
}
}
}
}
)
expect { chef_run }.to raise_error("gitaly['configuration'][:prometheus][:grpc_latency_buckets] must be an array, not a string")
end
end end
context 'with some defaults overridden with custom configuration' do context 'with some defaults overridden with custom configuration' do
...@@ -587,48 +440,10 @@ RSpec.describe 'gitaly' do ...@@ -587,48 +440,10 @@ RSpec.describe 'gitaly' do
} }
], ],
cgroups: { cgroups: {
cpu_shares: 100, cpu_shares: 100
}
}
)
end
end
context 'with old key and its new key set' do
it 'raises an error in generic case' do
stub_gitlab_rb(
{
gitaly: {
enable: true,
certificate_path: 'legacy_certificate_path_key',
configuration: {
tls: {
certificate_path: 'new_certificate_path_key',
}
}
}
}
)
expect { chef_run }.to raise_error "Legacy configuration key 'certificate_path' can't be set when its new key 'configuration.tls.certificate_path' is set."
end
it 'raises an error in generic case' do
stub_gitlab_rb(
{
gitaly: {
enable: true,
prometheus_grpc_latency_buckets: '[0, 1, 2]',
configuration: {
prometheus: {
grpc_latency_buckets: '[0, 1, 3]',
}
}
} }
} }
) )
expect { chef_run }.to raise_error "Legacy configuration key 'prometheus_grpc_latency_buckets' can't be set when its new key 'configuration.prometheus.grpc_latency_buckets' is set."
end end
end end
...@@ -636,70 +451,88 @@ RSpec.describe 'gitaly' do ...@@ -636,70 +451,88 @@ RSpec.describe 'gitaly' do
before do before do
stub_gitlab_rb( stub_gitlab_rb(
gitaly: { gitaly: {
concurrency: [
{
rpc: '/gitaly.SmartHTTPService/PostReceivePack',
max_per_repo: 20
},
{
rpc: '/gitaly.SSHService/SSHUploadPack',
max_per_repo: 5
}
],
storage: [
{ name: 'default', path: '/tmp/path-1' },
{ name: 'nfs1', path: '/mnt/nfs1' }
],
rate_limiting: [
{
rpc: '/gitaly.SmartHTTPService/PostReceivePack',
interval: '1s',
burst: 100
}, {
rpc: '/gitaly.SSHService/SSHUploadPack',
interval: '1s',
burst: 200,
}
],
socket_path: socket_path,
runtime_dir: runtime_dir,
listen_addr: listen_addr,
tls_listen_addr: tls_listen_addr,
certificate_path: certificate_path,
key_path: key_path,
gpg_signing_key_path: gpg_signing_key_path,
prometheus_listen_addr: prometheus_listen_addr,
logging_level: logging_level,
logging_format: logging_format,
logging_sentry_dsn: logging_sentry_dsn,
logging_sentry_environment: logging_sentry_environment,
prometheus_grpc_latency_buckets: prometheus_grpc_latency_buckets,
auth_token: auth_token,
auth_transitioning: auth_transitioning,
graceful_restart_timeout: graceful_restart_timeout,
git_catfile_cache_size: git_catfile_cache_size,
git_bin_path: git_bin_path,
use_bundled_git: false,
open_files_ulimit: open_files_ulimit, open_files_ulimit: open_files_ulimit,
daily_maintenance_start_hour: daily_maintenance_start_hour,
daily_maintenance_start_minute: daily_maintenance_start_minute,
daily_maintenance_duration: daily_maintenance_duration,
daily_maintenance_storages: %w(storage0 storage1),
daily_maintenance_disabled: daily_maintenance_disabled,
cgroups_mountpoint: cgroups_mountpoint,
cgroups_hierarchy_root: cgroups_hierarchy_root,
cgroups_memory_bytes: cgroups_memory_bytes,
cgroups_cpu_shares: cgroups_cpu_shares,
cgroups_repositories_count: cgroups_repositories_count,
cgroups_repositories_memory_bytes: cgroups_repositories_memory_bytes,
cgroups_repositories_cpu_shares: cgroups_repositories_cpu_shares,
pack_objects_cache_enabled: pack_objects_cache_enabled,
pack_objects_cache_dir: pack_objects_cache_dir,
pack_objects_cache_max_age: pack_objects_cache_max_age,
custom_hooks_dir: gitaly_custom_hooks_dir,
# Sanity check that configuration values get printed out. # Sanity check that configuration values get printed out.
configuration: { configuration: {
socket_path: socket_path,
listen_addr: listen_addr,
tls_listen_addr: tls_listen_addr,
string_value: 'some value', string_value: 'some value',
runtime_dir: runtime_dir,
git: {
signing_key: gpg_signing_key_path,
bin_path: git_bin_path,
catfile_cache_size: git_catfile_cache_size,
use_bundled_binaries: false,
},
prometheus: {
grpc_latency_buckets: prometheus_grpc_latency_buckets
},
prometheus_listen_addr: prometheus_listen_addr,
graceful_restart_timeout: graceful_restart_timeout,
auth: {
token: auth_token,
transitioning: auth_transitioning,
},
tls: {
certificate_path: certificate_path,
key_path: key_path,
},
storage: [
{ name: 'default', path: '/tmp/path-1' },
{ name: 'nfs1', path: '/mnt/nfs1' }
],
logging: {
level: logging_level,
format: logging_format,
sentry_dsn: logging_sentry_dsn,
sentry_environment: logging_sentry_environment,
},
hooks: { custom_hooks_dir: gitaly_custom_hooks_dir },
pack_objects_cache: {
enabled: pack_objects_cache_enabled,
dir: pack_objects_cache_dir,
max_age: pack_objects_cache_max_age,
},
cgroups: {
mountpoint: cgroups_mountpoint,
hierarchy_root: cgroups_hierarchy_root,
memory_bytes: cgroups_memory_bytes,
cpu_shares: cgroups_cpu_shares,
repositories: {
count: cgroups_repositories_count,
memory_bytes: cgroups_repositories_memory_bytes,
cpu_shares: cgroups_repositories_cpu_shares,
},
},
daily_maintenance: {
disabled: daily_maintenance_disabled,
start_hour: daily_maintenance_start_hour,
start_minute: daily_maintenance_start_minute,
duration: daily_maintenance_duration,
storages: %w(storage0 storage1),
},
concurrency: [
{
rpc: '/gitaly.SmartHTTPService/PostReceivePack',
max_per_repo: 20
},
{
rpc: '/gitaly.SSHService/SSHUploadPack',
max_per_repo: 5
}
],
rate_limiting: [
{
rpc: '/gitaly.SmartHTTPService/PostReceivePack',
interval: '1s',
burst: 100
}, {
rpc: '/gitaly.SSHService/SSHUploadPack',
interval: '1s',
burst: 200,
}
],
subsection: { subsection: {
array_value: [1, 2, 3] array_value: [1, 2, 3]
} }
...@@ -865,16 +698,6 @@ RSpec.describe 'gitaly' do ...@@ -865,16 +698,6 @@ RSpec.describe 'gitaly' do
.with_content(/svlogd -tt \/var\/log\/gitlab\/gitaly/) .with_content(/svlogd -tt \/var\/log\/gitlab\/gitaly/)
end end
context 'when maintenance is disabled' do
let(:daily_maintenance_disabled) { true }
it 'renders daily_maintenance with disabled set to true' do
expect(chef_run).to render_file(config_path).with_content { |content|
expect(content).to include("[daily_maintenance]\ndisabled = true\n")
}
end
end
context 'when using git_data_dirs storage configuration' do context 'when using git_data_dirs storage configuration' do
context 'using local gitaly' do context 'using local gitaly' do
before do before do
...@@ -956,35 +779,6 @@ RSpec.describe 'gitaly' do ...@@ -956,35 +779,6 @@ RSpec.describe 'gitaly' do
.with_content(%r{\[\[storage\]\]\s+name = "nfs1"\s+path = "/mnt/nfs1/repositories"}) .with_content(%r{\[\[storage\]\]\s+name = "nfs1"\s+path = "/mnt/nfs1/repositories"})
end end
end end
context "using legacy gitaly['storage'] key" do
before do
stub_gitlab_rb(
gitaly: {
storage: [
{
'name' => 'nfs1',
'path' => '/mnt/nfs1/repositories'
},
{
'name' => 'default',
'path' => '/tmp/default/git-data/repositories'
}
]
},
git_data_dirs: {
'default' => { 'path' => '/tmp/gitaly-git-data' },
}
)
end
it 'populates gitaly config.toml with custom storages from gitaly configuration' do
expect(chef_run).to render_file(config_path)
.with_content(%r{\[\[storage\]\]\s+name = "default"\s+path = "/tmp/default/git-data/repositories"})
expect(chef_run).to render_file(config_path)
.with_content(%r{\[\[storage\]\]\s+name = "nfs1"\s+path = "/mnt/nfs1/repositories"})
end
end
end end
end end
end end
...@@ -1004,63 +798,7 @@ RSpec.describe 'gitaly' do ...@@ -1004,63 +798,7 @@ RSpec.describe 'gitaly' do
end end
end end
shared_examples 'empty concurrency configuration' do
it 'does not generate a gitaly concurrency configuration' do
expect(chef_run).not_to render_file(config_path)
.with_content(%r{\[\[concurrency\]\]})
end
end
shared_examples 'empty rate limiting configuration' do
it 'does not generate a gitaly concurrency configuration' do
expect(chef_run).not_to render_file(config_path)
.with_content(%r{\[\[rate_limiting\]\]})
end
end
context 'when not using concurrency configuration' do context 'when not using concurrency configuration' do
context 'when concurrency configuration is not set' do
before do
stub_gitlab_rb(
{
gitaly: {
}
}
)
end
it_behaves_like 'empty concurrency configuration'
it_behaves_like 'empty rate limiting configuration'
end
context 'when concurrency configuration is empty' do
before do
stub_gitlab_rb(
{
gitaly: {
concurrency: []
}
}
)
end
it_behaves_like 'empty concurrency configuration'
end
context 'when rate limiting configuration is empty' do
before do
stub_gitlab_rb(
{
gitaly: {
rate_limiting: []
}
}
)
end
it_behaves_like 'empty rate limiting configuration'
end
context 'when max_queue_size and max_queue_wait are empty' do context 'when max_queue_size and max_queue_wait are empty' do
before do before do
stub_gitlab_rb( stub_gitlab_rb(
...@@ -1119,12 +857,14 @@ RSpec.describe 'gitaly' do ...@@ -1119,12 +857,14 @@ RSpec.describe 'gitaly' do
stub_gitlab_rb( stub_gitlab_rb(
{ {
gitaly: { gitaly: {
concurrency: [ configuration: {
{ concurrency: [
'rpc' => "/gitaly.SmartHTTPService/PostReceivePack", {
'max_queue_wait' => "10s", 'rpc' => "/gitaly.SmartHTTPService/PostReceivePack",
} 'max_queue_wait' => "10s",
] }
]
}
} }
} }
) )
...@@ -1265,8 +1005,10 @@ RSpec.describe 'gitaly::git_data_dirs' do ...@@ -1265,8 +1005,10 @@ RSpec.describe 'gitaly::git_data_dirs' do
'path' => '/tmp/user/git-data' 'path' => '/tmp/user/git-data'
} }
}, gitaly: { }, gitaly: {
socket_path: '', configuration: {
listen_addr: 'localhost:8123' socket_path: '',
listen_addr: 'localhost:8123'
}
}) })
end end
...@@ -1283,7 +1025,10 @@ RSpec.describe 'gitaly::git_data_dirs' do ...@@ -1283,7 +1025,10 @@ RSpec.describe 'gitaly::git_data_dirs' do
'path' => '/tmp/user/git-data' 'path' => '/tmp/user/git-data'
} }
}, gitaly: { }, gitaly: {
socket_path: '', tls_listen_addr: 'localhost:8123' configuration: {
socket_path: '',
tls_listen_addr: 'localhost:8123'
}
}) })
end end
...@@ -1300,7 +1045,10 @@ RSpec.describe 'gitaly::git_data_dirs' do ...@@ -1300,7 +1045,10 @@ RSpec.describe 'gitaly::git_data_dirs' do
'path' => '/tmp/user/git-data' 'path' => '/tmp/user/git-data'
} }
}, gitaly: { }, gitaly: {
socket_path: '/some/socket/path.socket', tls_listen_addr: 'localhost:8123' configuration: {
socket_path: '/some/socket/path.socket',
tls_listen_addr: 'localhost:8123'
}
}) })
end end
......
...@@ -107,7 +107,11 @@ RSpec.describe 'gitlab::logrotate_folder_and_configs_spec' do ...@@ -107,7 +107,11 @@ RSpec.describe 'gitlab::logrotate_folder_and_configs_spec' do
services: ['gitlab-rails', 'gitaly'] services: ['gitlab-rails', 'gitaly']
}, },
gitaly: { gitaly: {
log_directory: '/my/log/directory' configuration: {
logging: {
dir: '/my/log/directory'
}
}
} }
) )
expect(chef_run).to create_template('/var/opt/gitlab/logrotate/logrotate.d/gitlab-rails') expect(chef_run).to create_template('/var/opt/gitlab/logrotate/logrotate.d/gitlab-rails')
......
require 'chef_helper' require 'chef_helper'
RSpec.describe 'praefect' do RSpec.describe 'praefect' do
let(:chef_run) { ChefSpec::SoloRunner.new(step_into: %w(runit_service env_dir)).converge('gitlab::default') } let(:chef_run) { ChefSpec::SoloRunner.new(step_into: %w(runit_service env_dir)).converge('gitlab::default') }
let(:prometheus_grpc_latency_buckets) do let(:prometheus_grpc_latency_buckets) do
'[0.001, 0.005, 0.025, 0.1, 0.5, 1.0, 10.0, 30.0, 60.0, 300.0, 1500.0]' [0.001, 0.005, 0.025, 0.1, 0.5, 1.0, 10.0, 30.0, 60.0, 300.0, 1500.0]
end end
before do before do
...@@ -44,7 +45,6 @@ RSpec.describe 'praefect' do ...@@ -44,7 +45,6 @@ RSpec.describe 'praefect' do
'listen_addr' => 'localhost:2305', 'listen_addr' => 'localhost:2305',
'logging' => { 'format' => 'json' }, 'logging' => { 'format' => 'json' },
'prometheus_listen_addr' => 'localhost:9652', 'prometheus_listen_addr' => 'localhost:9652',
'prometheus_exclude_database_from_default_metrics' => true,
'failover' => { 'enabled' => true }, 'failover' => { 'enabled' => true },
} }
...@@ -83,7 +83,6 @@ RSpec.describe 'praefect' do ...@@ -83,7 +83,6 @@ RSpec.describe 'praefect' do
format: 'custom_format', format: 'custom_format',
has_no_default: 'should get output' has_no_default: 'should get output'
}, },
prometheus_exclude_database_from_default_metrics: false,
auth: { auth: {
transitioning: true transitioning: true
}, },
...@@ -143,7 +142,6 @@ RSpec.describe 'praefect' do ...@@ -143,7 +142,6 @@ RSpec.describe 'praefect' do
'format' => 'custom_format', 'format' => 'custom_format',
'has_no_default' => 'should get output' 'has_no_default' => 'should get output'
}, },
'prometheus_exclude_database_from_default_metrics' => false,
'prometheus_listen_addr' => 'custom_prometheus_listen_addr:5432', 'prometheus_listen_addr' => 'custom_prometheus_listen_addr:5432',
'virtual_storage' => [ 'virtual_storage' => [
{ {
...@@ -183,140 +181,6 @@ RSpec.describe 'praefect' do ...@@ -183,140 +181,6 @@ RSpec.describe 'praefect' do
end end
end end
context 'with old key and its new key set' do
it 'raises an error in the generic case' do
stub_gitlab_rb(
{
praefect: {
enable: true,
database_direct_host: 'database_direct_host_legacy',
configuration: {
database: {
session_pooled: {
host: 'database_direct_host_new'
}
}
}
}
}
)
expect { chef_run }.to raise_error("Legacy configuration key 'database_direct_host' can't be set when its new key 'configuration.database.session_pooled.host' is set.")
end
it 'raises an error with prometheus_grpc_latency_buckets' do
stub_gitlab_rb(
{
praefect: {
enable: true,
prometheus_grpc_latency_buckets: '[0, 1, 2]',
configuration: {
prometheus: {
grpc_latency_buckets: [0, 1, 2]
}
}
}
}
)
expect { chef_run }.to raise_error("Legacy configuration key 'prometheus_grpc_latency_buckets' can't be set when its new key 'configuration.prometheus.grpc_latency_buckets' is set.")
end
it 'raises an error with reconciliation_histogram_buckets' do
stub_gitlab_rb(
{
praefect: {
enable: true,
reconciliation_histogram_buckets: '[0, 1, 2]',
configuration: {
reconciliation: {
histogram_buckets: [0, 1, 2]
}
}
}
}
)
expect { chef_run }.to raise_error("Legacy configuration key 'reconciliation_histogram_buckets' can't be set when its new key 'configuration.reconciliation.histogram_buckets' is set.")
end
end
context 'with old virtual_storages and new virtual_storage set' do
before do
stub_gitlab_rb(
{
praefect: {
enable: true,
virtual_storages: {
default: {
nodes: {
praefect1: {
address: 'tcp://node1.internal',
token: "praefect1-token"
}
}
}
},
configuration: {
virtual_storage: [
{
name: 'default',
node: [
{
storage: 'praefect2',
address: 'tcp://node2.internal',
token: 'praefect2-token'
}
]
}
]
}
}
}
)
end
it 'raises an error' do
expect { chef_run }.to raise_error("Legacy configuration key 'virtual_storages' can't be set when its new key 'configuration.virtual_storage' is set.")
end
end
context 'with array configured as string' do
it 'raises an error with reconciliation histogram buckets' do
stub_gitlab_rb(
{
praefect: {
enable: true,
configuration: {
reconciliation: {
histogram_buckets: '[0, 1, 2]'
}
}
}
}
)
expect { chef_run }.to raise_error("praefect['configuration'][:reconciliation][:histogram_buckets] must be an array, not a string")
end
it 'raises an error with prometheus grpc latency buckets' do
stub_gitlab_rb(
{
praefect: {
enable: true,
configuration: {
prometheus: {
grpc_latency_buckets: '[0, 1, 2]'
}
}
}
}
)
expect { chef_run }.to raise_error("praefect['configuration'][:prometheus][:grpc_latency_buckets] must be an array, not a string")
end
end
context 'with custom settings' do context 'with custom settings' do
let(:dir) { nil } let(:dir) { nil }
let(:socket_path) { '/var/opt/gitlab/praefect/praefect.socket' } let(:socket_path) { '/var/opt/gitlab/praefect/praefect.socket' }
...@@ -329,23 +193,39 @@ RSpec.describe 'praefect' do ...@@ -329,23 +193,39 @@ RSpec.describe 'praefect' do
let(:certificate_path) { '/path/to/cert.pem' } let(:certificate_path) { '/path/to/cert.pem' }
let(:key_path) { '/path/to/key.pem' } let(:key_path) { '/path/to/key.pem' }
let(:prom_addr) { 'localhost:1234' } let(:prom_addr) { 'localhost:1234' }
let(:separate_database_metrics) { false }
let(:log_level) { 'debug' } let(:log_level) { 'debug' }
let(:log_format) { 'text' } let(:log_format) { 'text' }
let(:log_group) { 'fugee' } let(:log_group) { 'fugee' }
let(:primaries) { %w[praefect1 praefect2] } let(:primaries) { %w[praefect1 praefect2] }
let(:virtual_storages) do let(:virtual_storage) do
{ [
'default' => { {
'default_replication_factor' => 2, "default_replication_factor" => 2,
'nodes' => { "name" => "default",
'praefect1' => { address: 'tcp://node1.internal', token: "praefect1-token" }, "node" => [
'praefect2' => { address: 'tcp://node2.internal', token: "praefect2-token" }, {
'praefect3' => { address: 'tcp://node3.internal', token: "praefect3-token" }, "address" => "tcp://node1.internal",
'praefect4' => { address: 'tcp://node4.internal', token: "praefect4-token" } "storage" => "praefect1",
} "token" => "praefect1-token"
},
{
"address" => "tcp://node2.internal",
"storage" => "praefect2",
"token" => "praefect2-token"
},
{
"address" => "tcp://node3.internal",
"storage" => "praefect3",
"token" => "praefect3-token"
},
{
"address" => "tcp://node4.internal",
"storage" => "praefect4",
"token" => "praefect4-token"
}
]
} }
} ]
end end
let(:failover_enabled) { true } let(:failover_enabled) { true }
let(:database_host) { 'pg.external' } let(:database_host) { 'pg.external' }
...@@ -360,7 +240,7 @@ RSpec.describe 'praefect' do ...@@ -360,7 +240,7 @@ RSpec.describe 'praefect' do
let(:database_direct_host) { 'pg.internal' } let(:database_direct_host) { 'pg.internal' }
let(:database_direct_port) { 1234 } let(:database_direct_port) { 1234 }
let(:reconciliation_scheduling_interval) { '1m' } let(:reconciliation_scheduling_interval) { '1m' }
let(:reconciliation_histogram_buckets) { '[1.0, 2.0]' } let(:reconciliation_histogram_buckets) { [1.0, 2.0] }
let(:user) { 'user123' } let(:user) { 'user123' }
let(:password) { 'password321' } let(:password) { 'password321' }
let(:ca_file) { '/path/to/ca_file' } let(:ca_file) { '/path/to/ca_file' }
...@@ -372,42 +252,59 @@ RSpec.describe 'praefect' do ...@@ -372,42 +252,59 @@ RSpec.describe 'praefect' do
stub_gitlab_rb(praefect: { stub_gitlab_rb(praefect: {
enable: true, enable: true,
dir: dir, dir: dir,
socket_path: socket_path,
auth_token: auth_token,
auth_transitioning: auth_transitioning,
sentry_dsn: sentry_dsn,
sentry_environment: sentry_environment,
listen_addr: listen_addr,
tls_listen_addr: tls_listen_addr,
certificate_path: certificate_path,
key_path: key_path,
prometheus_listen_addr: prom_addr,
prometheus_grpc_latency_buckets: prometheus_grpc_latency_buckets,
separate_database_metrics: separate_database_metrics,
logging_level: log_level,
logging_format: log_format,
log_group: log_group, log_group: log_group,
failover_enabled: failover_enabled, failover_enabled: failover_enabled,
virtual_storages: virtual_storages,
database_host: database_host,
database_port: database_port,
database_user: database_user,
database_password: database_password,
database_dbname: database_dbname,
database_sslmode: database_sslmode,
database_sslcert: database_sslcert,
database_sslkey: database_sslkey,
database_sslrootcert: database_sslrootcert,
database_direct_host: database_direct_host,
database_direct_port: database_direct_port,
reconciliation_scheduling_interval: reconciliation_scheduling_interval,
reconciliation_histogram_buckets: reconciliation_histogram_buckets,
background_verification_verification_interval: '168h',
background_verification_delete_invalid_records: true,
graceful_stop_timeout: graceful_stop_timeout,
# Sanity check that the configuration values get templated out as TOML. # Sanity check that the configuration values get templated out as TOML.
configuration: { configuration: {
string_value: 'value', string_value: 'value',
graceful_stop_timeout: graceful_stop_timeout,
listen_addr: listen_addr,
socket_path: socket_path,
auth: {
token: auth_token,
transitioning: auth_transitioning
},
logging: {
format: log_format,
level: log_level
},
background_verification: {
verification_interval: '168h',
delete_invalid_records: true,
},
prometheus: {
grpc_latency_buckets: prometheus_grpc_latency_buckets
},
reconciliation: {
scheduling_interval: reconciliation_scheduling_interval,
histogram_buckets: reconciliation_histogram_buckets,
},
sentry: {
sentry_dsn: sentry_dsn,
sentry_environment: sentry_environment
},
tls: {
certificate_path: certificate_path,
key_path: key_path,
},
tls_listen_addr: tls_listen_addr,
virtual_storage: virtual_storage,
database: {
host: database_host,
port: database_port,
user: database_user,
password: database_password,
dbname: database_dbname,
sslmode: database_sslmode,
sslcert: database_sslcert,
sslkey: database_sslkey,
sslrootcert: database_sslrootcert,
session_pooled: {
host: database_direct_host,
port: database_direct_port,
}
},
prometheus_listen_addr: prom_addr,
subsection: { subsection: {
array_value: [1, 2] array_value: [1, 2]
}, },
...@@ -422,7 +319,7 @@ RSpec.describe 'praefect' do ...@@ -422,7 +319,7 @@ RSpec.describe 'praefect' do
{ {
'auth' => { 'auth' => {
'token' => 'secrettoken123', 'token' => 'secrettoken123',
'transitioning' => false 'transitioning' => false,
}, },
'database' => { 'database' => {
'dbname' => 'praefect_production', 'dbname' => 'praefect_production',
...@@ -463,7 +360,6 @@ RSpec.describe 'praefect' do ...@@ -463,7 +360,6 @@ RSpec.describe 'praefect' do
'sentry_environment' => 'production' 'sentry_environment' => 'production'
}, },
'prometheus_listen_addr' => 'localhost:1234', 'prometheus_listen_addr' => 'localhost:1234',
'prometheus_exclude_database_from_default_metrics' => false,
'socket_path' => '/var/opt/gitlab/praefect/praefect.socket', 'socket_path' => '/var/opt/gitlab/praefect/praefect.socket',
'string_value' => 'value', 'string_value' => 'value',
'subsection' => { 'subsection' => {
...@@ -512,42 +408,6 @@ RSpec.describe 'praefect' do ...@@ -512,42 +408,6 @@ RSpec.describe 'praefect' do
expect(chef_run).to render_file(File.join(env_dir, "WRAPPER_JSON_LOGGING")) expect(chef_run).to render_file(File.join(env_dir, "WRAPPER_JSON_LOGGING"))
.with_content('false') .with_content('false')
end end
context 'with virtual_storages as an array' do
let(:virtual_storages) { [{ name: 'default', 'nodes' => [{ storage: 'praefect1', address: 'tcp://node1.internal', token: "praefect1-token" }] }] }
it 'raises an error' do
expect { chef_run }.to raise_error("Praefect virtual_storages must be a hash")
end
end
context 'with nodes of virtual storage as an array' do
let(:virtual_storages) do
{
'default' => {
'nodes' => {
'node-1' => {
'address' => 'tcp://node1.internal',
'token' => 'praefect1-token'
}
}
},
'external' => {
'nodes' => [
{
'storage' => 'node-2',
'address' => 'tcp://node2.external',
'token' => 'praefect2-token'
}
]
}
}
end
it 'raises an error' do
expect { chef_run }.to raise_error('Nodes of Praefect virtual storage `external` must be a hash')
end
end
end end
describe 'database migrations' do describe 'database migrations' do
......