Kontejnerové images
Každá úloha na GitLab CI se spouští v izolovaném prostředí – kontejneru.
Pomocí direktivy image v .gitlab-ci.yml
můžete specifikovat kontejnerový (docker) image, ze kterého se kontejner vytvoří.
Pokud tuto direktivu na úrovni jobu ani pipeline nespecifikujete, použije se jako výchozí image ict/images/alpine/ci:latest.
Lokální image
GitLab v sobě integruje Container Registry, službu pro uchovávání a distribuci kontejnerových (docker) images.
Každý projekt na GitLabu může mít svůj prostor pro ukládání images, které je navíc možné generovat automatizovaně přes CI (viz Vytváření images). Pokud projekt poskytuje nějaké images, jejich seznam najdete pod Package & Registries › Container Registry v daném projektu (nebo skupině).
Celé jméno lokálního image vždy obsahuje adresu registru a cestu projektu, volitelně pak další názvy rozlišující různé images v rámci jednoho projektu, vše oddělené lomítkem. A nakonec dvojtečkou oddělený tag, který zpravidla identifikuje konkrétní verzi image (více zde).
<registry-url>/<namespace>/[<subgroup>/[<subsubgroup>/]]<project-slug>[/<name-1>[/<name-2>[/<name-3>]]]:<tag>
Například:
${CI_REGISTRY}/ict/images/alpine/ci:latest
– image v projektu ict/images/alpine${CI_REGISTRY}/ict/images/jekyll:4.2
– image v projektu ict/images/jekyll
Pokud image nepoužijete přímo v .gitlab-ci.yml
(direktiva image
), nahraďte proměnnou registru (${CI_REGISTRY}
) hodnotou gitlab.fit.cvut.cz:5050
.
Výsledný .gitlab-ci.yml
pak může vypadat třeba takto:
build:
image: ${CI_REGISTRY}/ict/images/alpine/ci:latest
before_script:
- apk add -U build-base # install base build dependencies for C/C++
script:
- make # build stuff
Images od ICT
Ve skupině ict/images najdete images spravované ICT oddělením. Všechny tyto images jsou automatizovaně generované a pravidelně aktualizované.
ict/images/alpine
Tyto images se sestavují ve dvou variantách:
ict/images/alpine/ci
– Výchozí image určený pro použití v CI. Obsahuje balíčky curl, git, openssh-client a je přizpůsoben pro práci v CI.ict/images/alpine/base
– Minimální image odpovídající image alpine z Docker Hubu. Navíc má přednastavenou časovou zónu Europe/Prague a fakultní mirror Alpine repositářů.
Obě varianty jsou sestavovány pro každou podporovanou release větev,
která je reprezentována tagem (např. 3.20
, 3.19
, edge
, …). Tag latest
je alias pro poslední stabilní větev.
Docker Hub
Na GitLabu je možné také využívat images z Docker Hubu i jiných veřejných kontejnerových/docker registrů.
Důležité:
Vzhledem k limitu na počet stažených images je nutné omezit používání images z Docker Hubu a implementovat techniky pro efektivní přístup k Docker Hubu.
Pokud však skutečně potřebujete použít images z Docker Hubu a váš projekt je pod skupinou (nikoliv přímo pod uživatelem), použijte Dependency Proxy. Díky tomu se vámi použitý docker image uloží v cache a nestahuje se pokaždé znovu oproti rate limitu. Od verze 17.10 Dependency Proxy implementuje autentizaci s Docker Hubem. Autentizace je doporučený způsob použití Dependency Proxy (Autentizovaní uživatelé mají výrazně zvýšený rate limit). Pokud se projekt nenachází ve skupině, stáhněte image manuálně z Docker Hubu a následně ho nahrajte do image registry na GitLabu viz příklad manuálního stažení.
V případě využití Docker Hubu uvnitř pipeline (například v předpisu Dockerfile sestavovaného image) je nutné na začátku jobu přidat krok přihlášení na Docker Hub, aby následné stahování probíhalo autentizovaně s rozšířeným rate limitem.
To provedete ekvivalentem příkazu buildah login <username> <password> docker.io
v nástroji, který používáte k sestavení image.
Pro tento krok je nutné vytvořit si na Docker Hubu vlastní účet.
build:
image: ${CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX}/debian:stable-slim
script:
- cat /etc/os-release
podman pull alpine
podman login pechmst1 glpat-s3ehoFmvPTSB5a8PAEXk gitlab.fit.cvut.cz:5050 1
podman push alpine gitlab.fit.cvut.cz:5050/ict/images/alpine/ci:mirrored-image 2
- Využijte váš GitLab username a osobní token se scopes alespoň read_registry a write_registry, abyste mohli zapisovat image do svých repozitářů.
- Jako cestu zadejte cestu k vašemu repozitáři.