Pá. Zář 4th, 2026
webová stránka na sestavení správné aktualizační česty gitlabu

Po více než 20 letech v IT už vás málo co překvapí. Zrovna tak vás nepřekvapí, když někam přijdete a vidíte, že mají hromadu služeb zastaralou, neudržovanou, bez dokumentace, původní team, co se o něco staral, dávno odešel a „stále to nějak udržují při životě“.

Tento článek by vám proto mohl pomoci s tím, že když už nějaký starý gitlab v Dockeru máte, tak jak to snadno upgradovat na nejnovější verzi, jak zjistit na jaké verze máte přeskakovat, abyste nepřekročili žádný kritický upgrade a jak to zkrátka udělat tak, aby se to nezměnilo v debugovací peklo následující odpoledne?

ukázka stávajícího stavu Gitlab v16.9.1 a červeně svítící nápis UPDATE ASAP, znamenající - aktualizujte tak nejdříve, jak je to možné (as soon as possible).
Když vidíte červeně UPDATE ASAP, neznamená to, že máte update odkládat, ale naopak tomu věnovat tady a teď nejvyšší prioritu.

Musí to jít přes několik meziverzí a má to jasný postup!

Většinu Juniorů obvykle napadne, že prostě přepíšou verzi kontejner image na nejnovější a „ono to nějak dopadne“. Nedopadne, Gitlab vám v takovém případě často už nenaběhne a dopadne to tak, že budete v logu procházet hlášky, že máte moc nový gitlab a že musíte projít nějakou starší verzí, než se dostanete na nejnovější verzi.

Naštěstí tu existuje tento web, ve kterém si nalevo nakliknete, jestli upgradujete community edition, nebo enterprise, jestli to je instalované balíčkem, nebo dockerem, jaká je stávající verze a jaká je cílová verze.

Web s průvodcem a formulářem, který nabízí uživateli nalevo vykliknout si aktuální verzi gitlabu, kterou má a vpravo si vybrat verzi, na kterou chce upgradovat. Dole vybírá uživatel jestli zvolí Enterprise nebo Community edici, uprostřed vidí Distro (supported OS) s volbou buď Ubuntu, Alma Linux, nebo Docker, vpravo pak vidí možnost zaškrtnout Auto install, Zero downtime a N-1. Dole tlačítko GO, které zobrazí uživateli výsledek, kterými verzemi a příkazy si musí projít.

No a výsledek stojí za to, dole už vidíme jakými verzemi musíte projít. Jenže to není vše, u každém upgradu musíte provést nejen zálohu, ale dát gitlabu třeba 20 – 30 minut času, než proběhnou všechny tzv. Background migrations. Až všechny doběhnou, můžete pokračovat na další verze. Nedá se verze přeskakovat, musíte jednu po druhé a ano, bude to trvat. V některých firmách „skáčou“ jednu verzi za večer. Někde mohou skákat 1 verzi týdně, aby dostali prostor všichni otestovat, jestli něco někde nepřestalo fungovat (a většinou po upgradu vše jede, jak má). Jinde si vezmou víkendovou směnu a proskáčou za víkend všemi verzemi až na tu nejnovější.

ukázka výpisu verzí, kterými je nutné projít, než se postupně dostanete na nejnovější verzi gitlabu.

Náš příklad – v16.9.1 -> 18.10.3-ce.0

Web zobrazil tento postup:

docker run gitlab/gitlab-ce:16.11.10-ce.0
docker run gitlab/gitlab-ce:17.1.8-ce.0
docker run gitlab/gitlab-ce:17.3.7-ce.0
docker run gitlab/gitlab-ce:17.5.5-ce.0
docker run gitlab/gitlab-ce:17.8.7-ce.0
docker run gitlab/gitlab-ce:17.11.7-ce.0
docker run gitlab/gitlab-ce:18.2.8-ce.0
docker run gitlab/gitlab-ce:18.5.5-ce.0
docker run gitlab/gitlab-ce:18.8.9-ce.0
docker run gitlab/gitlab-ce:18.10.3-ce.0

V podstatě vám stačí, podívat se na váš docker-compose.yaml soubor a upravit tam:
services:
web:
image: ‚gitlab/gitlab-ce:16.11.10-ce.0
restart: always

A potom si vytvořte soubor upgrade.sh a do jeho obsahu vložte:

docker exec -t gitlab-ce gitlab-backup create
docker image prune -a -f
docker compose pull
docker compose up
docker logs -f gitlab-ce

chmod 755 ./upgrade.sh && ./upgrade.sh
A běžte si dát třeba kafe ke kávovaru, nebo běžte na 5 až 10 minut dělat něco jiného. Proběhne záloha, natáhne se novější image gitlabu (máme na příkladu 16.9.1, takže se stáhne hned ta první v seznamu 16.11.10-ce.0):

ukázka načítání novější verze gitlabu pomocí docker pull, což je příkaz součástí skriptu upgrade.sh

Na starším železe může upgrade jednoho gitlabu trvat i 40 minut, na nějakých starších strojích, či VM s omezenými zdroji to může trvat i déle. Proto buďte trpěliví. dokud vidíte hodně ukecaný výstup, tak jste v pohodě. Nechte to doběhnout a až to budete mít hotovo, přihlašte se na gitlab (potom, co opětovně naběhne) a dostaňte se do svého repozitáře a můžete pracovat na opravách. 😉

Ukázka nabíhajícího gitlabu s logem gitlabu a velkým nadpisem napsáno Waiting for Gitlab to boot, HTTP 502 a dole napsáno it can take up to a few minutes for gitlab to boot completely. Tedy že to může trvat až 5 minut gitlabu, než kompletně nastartuje. This page will automatically reload every 5 seconds. Tedy tato stránka je automaticky načítána každých 5 vteřin. Jakmile gitlab naběhne, tak máte jistotu, že se vám stránka automaticky obnoví s naběhnutým gitlabem. Není proto nutné obnovovat stránku.
Těsně po upgradu na gitlab v16.11.10, ještě nám tu nesvítí upozornění, že je Update available, tedy dostupný update, protože touto dobou sotva gitlab naběhl a dělá teprve všechny background migrations.
Tady už vidíme update na verzi v16.11.10
Výpis s verzí gitlabu v16.11.10 a všech jeho modulů gitlab shell, gitlab workhorse, gitlab API (v4), Gitlab KAS, ruby, rails, PostgreSQL (main), Postgresql (cli) a verzí Redisu. Nahoře svítí upozornění Update available.
Po čase když doběhnou všechny background migrations, už vidíme, že nám Gitlab hlásí, že existuje update na další verzi.

Upozornění

Nikdy neprovádějte upgrade na další verzi, dokud nedoběhly všechny Background Migrations (migrace na pozadí).

background migrations jsou dokončené, zvýrazněná je cesta autorem, kde v hlavní administraci je nutno kliknout v levém hlavní menu na Monitoring a dále na podtlačítko Background Migrations, aby bylo možné procházet a zjistit, jestli doběhly všechny background migrace. Ve frontě vidíme Queued 0, tedy 0 čekajících migrací ve frontě a 17 finished, takže máme volné dveře k upgradu na další verzi gitlabu.
Jakmile vidíme tento stav, kdy už neprobíhají žádné migrace na pozadí a všechno vidíme až po kliknutí na Finished (dokončeno) tak se teprve můžeme pustit do dalšího upgradu.

Upgrade z 16.11.10-ce.0 na 17.1.8-ce.0

Přemýšlel jsem, jestli by šlo kompletní upgrade plně zautomatizovat od nejstarší verze, po tu nejnovější. Já jsem přesvědčen, že by to šlo, ale protože se jedná o jednorázovou záležitost, která se ve většině případů už nebude opakovat a každý upgrade může způsobit nějaké potíže, které nemusí odchytit automatizovaný skript, bylo by to pravděpodobně riskantnější. Další co má negativní vliv na automatizovaný upgrade je rychlost hardwaru, na kterém to běží a velikost samotného gitlabu. Někomu by proto po upgradu trvaly všechny background rutiny 20 – 40 minut, na jiném gitlabu, který má stovky gigabajtů, by mohla stejná operace trvat i celou noc, nebo několik hodin minimálně. Šlo by to i tak zautomatizovat? Asi šlo, ale skript by se musel doptávat API gitlabu (které napříč verzemi prodělalo určité změny), jestli už všechny background migrations doběhly do konce a teprve pak iniciovat výměnu image v docker-compose.yaml a provést upgrade znovu.

U docker-compose provedeme následující příkaz:

sed -i "s|image: 'gitlab/gitlab-ce:16.11.10-ce.0'|image: 'gitlab/gitlab-ce:17.1.8-ce.0'|g" docker-compose.yaml

Pustíme ./upgrade.sh a necháme vše pracovat.

screenshot z terminálu s ukázkou promazání starých nepoužitých imagů kontejnerů a natahování nové verze gitlabu image pomocí docker pull příkazu, který je součástí upgrade.sh skriptu na verzi 17.1.8-ce.0
běh skriptu ./upgrade.sh
Ukázka modulů s verzemi gitlabu, kde nahoře jde vidět Gitlab verze v17.1.8
Bezprostředně po upgradu.
screenshot z background migrations kde se ukazuje Queued 0, tedy ve frontě 0 migrací na pozadí, informující administrátora gitlabu o tom, že má otevřené dveře k cestě na novější verzi gitlabu.
U prázdného gitlabu proběhnou všechny background migrations téměř okamžitě. U gitlabu se stovkami repozitářů to budou desítky až stovky minut.

17.1.8-ce.0 -> 17.3.7-ce.0

Následující příkaz upraví verzi 17.1.8-ce.0 na 17.3.7-ce.0

sed -i "s|image: 'gitlab/gitlab-ce:17.1.8-ce.0'|image: 'gitlab/gitlab-ce:17.3.7-ce.0'|g" docker-compose.yaml

./upgrade.sh

ukázka natažení docker pull příkazu nové verze gitlabu v17.3.7-ce.0 a smazání předchozích nepotřebných imagů předchozí verze gitlabu.
průběh natažení nového image kontejneru pro gitlab-ce

Jednu důležitou věc jsem zapomněl zmínit. Pokud máte starší Debian nebo ubuntu-server, můžete tam mít starší balíček, používající docker-compose místo docker compose. Proto přikládám skript pro tyto starší verze linuxů se staršími balíčky pro ty z vás, které čeká v dohledné době upgrade i těchto balíčků.
./upgrade.sh

#!/bin/bash
docker exec -t gitlab-ce gitlab-backup create
docker image prune -a -f
docker-compose pull
docker-compose up
docker logs -f gitlab-ce

Ukázka modulů doběhnuté verze gitlabu v17.3.7, kde ještě nesvítí výstražné upozornění, že je dostupný update na novou verzi gitlabu.
Update byl rychlý, migrace na tuto verzi budou pomalejší, protože jich je přes stovku.
Ukázka 5 dobíhajících background migrations na straně gitlabu, na které je nutné počkat. Nahoře jde vidět upozornění s OpenSSL version 3 s tlačítkem aknowledge, informuje admina gitlabu o tom, že jsou k dispozici nové verze šifrovacích protokolů a standardů v této verzi gitlabu.
Při přechodu na verzi 17.3.7 je velké množství migrací, na jejichž doběh je nutné počkat.
ukázka výpisu komponent gitlabu verze v17.3.7 s ukazujícím upozorněním Update available.
Ještě před doběhem background migrations nám gitlab už hlásí upozornění, že existuje novější verze gitlabu.

17.3.7-ce.0 -> 17.5.5-ce.0

Následujícím příkazem vyměníme v docker-compose.yaml souboru verzi ze 17.3.7-ce.0 na 17.5.5-ce.0.

sed -i "s|image: 'gitlab/gitlab-ce:17.3.7-ce.0'|image: 'gitlab/gitlab-ce:17.5.5-ce.0'|g" docker-compose.yaml

Před upgradem se ubezpečíme, že všechny background migrations doběhly.

ukázka poslední dobíhající background migrations v otevřeném rozhraní gitlabu na verzi 17.3.7-ce.0
Počkáme na poslední migraci, občas to trvá, je nutné dát gitlabu čas, ať to doběhne. U velkých instalací, nebo na slabším hardwaru si počkáte i pár hodin. Ve větších instalacích se provede upgrade jednou za noc na jednu verzi a pak se nechá následující celý den dobíhat veškeré background migrations. Jinak občas vám může některý job psát, že je ve stavu 99,00% progressu a v tomto stavu setrvat i několik hodin. Nepanikařte, je to normální.
ukázka dokončených background migrations na verzi 17.3.7-ce.0
Domigrováno jest! Takhle bude vypadat vaše vstupenka pro další verze gitlabu. Pokud neuvidíte tohle, nepouštějte se do dalšího upgradu!

Ověříme před spuštěním ./upgrade.sh verzi v docker-compose.yaml

grep gitlab-ce: docker-compose.yaml
    image: 'gitlab/gitlab-ce:17.5.5-ce.0'

A můžeme upgradovat dál.

ukázka stahování (pulling) image pro v erze gitlab 17.5.5 a nahoře vidíme promazání starých imagů verze 17.1.8-ce0, které již nebudeme potřebovat.
Tady už vidíme progress stahování nového image, skript ./upgrade.sh nám současně pročistil staré nepoužívané verze docker kontejnerů, ať šetříme místem.
error GTTP 502: Waiting for Gitlab to boot. Dále je napsáno na obrázku It can take up to a few minutes for gitlab to boot completely (může trvat až 5 minut gitlabu plně nastartovat). Tato stránka se automaticky znovunačte každých 5 vteřin.
Nepanikařte, tohle je normální. Příkaz docker ps vám prokáže, že je vše v pořádku a gitlab startuje. Stránku nemusíte refreshovat, jakmile gitlab naběhne, refreshne se automaticky sama a gitlab vám naběhne.
ukázka výpisu stavu verzí komponent gitlabu, vidíme verzi v17.5.5
GItlab naběhl automaticky v novější verzi v17.5.5
dobíhající background migrations na verzi gitlabu 17.5.5
Zase počkáme na doběh migrací

17.5.5-ce.0 -> 17.8.7-ce.0

no background migrations ukázka v gitlabu na verzi 17.5.5
Migrace doběhly, jdem protočit příkaz na výměnu verze v našem docker-compose.yaml

sed -i "s|image: 'gitlab/gitlab-ce:17.5.5-ce.0'|image: 'gitlab/gitlab-ce:17.8.7-ce.0'|g" docker-compose.yaml

Ověříme:

grep gitlab-ce: docker-compose.yaml
    image: 'gitlab/gitlab-ce:17.8.7-ce.0'

pustíme ./upgrade.sh

Výpis stavu verzí komponent gitlabu těsně po jeho upgradu. To nejdůležitější je, že vidíme verzi v17.8.7 verze gitlabu.
Výsledek po náběhu.
ukázka background migrations na verzi 17.8.7-ce.0 - kompletního seznamu migrací, které musí proběhnout s progressem 0.00%.
Seznam migrací na pozadí, které je nutné nechat dokončit do konce, než se budeme moci odvážně vydat na další verzi gitlabu.
ukázka background migrations na verzi 17.8.7-ce.0
Nezbývá momentálně nic, než čekat.

17.8.7-ce.0 – 17.11.7-ce.0

Zbytek už je rutina. Příkaz na výměnu verze.

sed -i "s|image: 'gitlab/gitlab-ce:17.8.7-ce.0'|image: 'gitlab/gitlab-ce:17.11.7-ce.0'|g" docker-compose.yaml

Zkontrolujeme, že doběhly background migrations.

Tento screenshot znamená pomyslnou zelenou v přechodu na další verze gitlabu.
v17.8.7

spustíme ./upgrade.sh a čekáme.

Ukázka spuštění skriptu ./upgrade.sh ve kterém se smaže nepoužívaný image gitlab-ce:17.5.5-ce.0 a uvolní se tak 3.43GB diskového prostoru.
Bezprostředně po stažení image se spustí povýšení na novější verzi 17.11.7-ce.0
Vítejte na verzi v17.11.7, poslední verze 17, další už budou verze 18.
Jako předtím, background migrations. Počkáme na doběh poslední z nich.

Sleduji, jestli jsou tyto background migrations náročné na procesor, či na paměť a nevšímám si nějaké významné zátěže.

ukázka příkazu htop na virtuálce, kde docker s gitlabem běží. Na první pohled se zdá, že 5.32GB ze 7.75GB vytížení RAM je hodně, ale v kontextu nízkého loadu linuxu 0.07 za poslední minutu a velmi nízké zátěže procesoru se jedná spíše o formální proces, který si potřebuje gitlab zpracovat a nechat doběhnout.
Ukázka příkazu htop na virtuálce, kde docker s gitlabem běží.

V docker ps vidím, že gitlab běžel cca 23 minut než doběhly všechny background migrace.

17.11.7-ce.0 -> 18.2.8-ce.0

Děláme významný upgrade na verzi 18.2. Ověřili jsme si, že background migrations doběhly, provádíme další příkaz na úpravu v docker-compose.yaml a můžem následně spustit ./upgrade.sh skript.

sed -i "s|image: 'gitlab/gitlab-ce:17.11.7-ce.0'|image: 'gitlab/gitlab-ce:18.2.8-ce.0'|g" docker-compose.yaml
Tento screenshot značí, že máme zelenou v upgradu
Hotovo máme gitlab verze 18.2.8, jdeme dál.

18.2.8-ce.0 -> 18.5.5-ce.0

dál

sed -i "s|image: 'gitlab/gitlab-ce:18.2.8-ce.0'|image: 'gitlab/gitlab-ce:18.5.5-ce.0'|g" docker-compose.yaml

ověříme:

grep gitlab-ce: docker-compose.yaml
    image: 'gitlab/gitlab-ce:18.5.5-ce.0'

./upgrade.sh

upgrade.sh natáhne novější docker image pro gitlab-ce:18.5.5-ce.0 a současně smaže předposlední verzi 17.11.7-ce.0, která již nebude potřeba. Tímto bylo uvolněno 3.713 GB. Nahoře vidíme doběhnutí zálohy před tímto upgradem.
Hotový upgrade na verzi 18.5.5-ce.0
máme hotovo, background migrations doběhly, můžeme pokračovat na další verzi.

18.5.5-ce.0 ->18.8.9-ce.0

Předposlední upgrade:

sed -i "s|image: 'gitlab/gitlab-ce:18.5.5-ce.0'|image: 'gitlab/gitlab-ce:18.8.9-ce.0'|g" docker-compose.yaml

ověříme:

grep gitlab-ce: docker-compose.yaml
    image: 'gitlab/gitlab-ce:18.8.9-ce.0'
Skript upgrade.sh nám uvolnil 3.737 GB smazáním již nepoužitého image verze 18.2.8-ce.0
Hotovo. Máme verzi 18.8.9
Ale počkáme si na doběh migrací.

18.8.9-ce.0 -> 18.10.3-ce.0

sed -i "s|image: 'gitlab/gitlab-ce:18.8.9-ce.0'|image: 'gitlab/gitlab-ce:18.10.3-ce.0'|g" docker-compose.yaml
./upgrade.sh
Hotovo. Nejnovější verze gitlabu k datumu jeho aktualizace.

Avatar

By Miro

Hardwaru a počítačům se věnuji již od roku 2003. Za tu dobu jsem poskládal stovky počítačů, opravil tisíce počítačů a vyřešil nespočetně problémů, vad a chyb, se kterými se setkávali uživatelé. Od roku 2005 se zabývám servery, nejen těmi herními, v roce 2007 jsem se začal věnovat Valve Source SDK level designu. Dnes spravuji v jedné osobě cca 100 serverů/diskových polí na univerzitě, řeším IT v malých, středních i mezinárodních firmách tak, aby firmy ušetřily nemalé částky při zlepšení kvality a soustředím se na snižování nákladů na IT od licencí až po hardware, software, provádím konsolidace a Quality Assurance za DevOps v on-premise i v cloudových prostředích, které firmám šetří rovněž nemalé peníze. Z velkých firem jsem měl příležitost s dalšími kolegy řešit správu 8000 serverů po celé západní Evropě s vysokou mírou automatizace a poznávání nejrůznějších evropských pracovních mentalit. Dále jsem řešil hybridní cloud ve velké firmě, orientované na trhy střední a východní Evropy. Posledních několik let se věnuji Devops pro velké zákazníky v Azure cloudu, spravuji kubernetes (AKS), Gitlab a soustřeďuji se na využití AI pro praktické účely.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

eighteen − 5 =