- install gitlab-runner
- install podman
- Configure podman
- configure runner
- test
install gitlab-runner
Gerekli hersey güncel olarak : https://docs.gitlab.com/runner/install/linux-repository/
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" -o script.deb.sh
bash script.deb.sh
apt install gitlab-runner -y
loginctl enable-linger gitlab-runner
# Add the User ID range
usermod --add-subuids 700000-765536 gitlab-runner
# Add the Group ID range (Double check it's active)
usermod --add-subgids 700000-765536 gitlab-runner
gitlab-runner register --url https://gitlab.mydomain.com --token glrt-portakalordakalbubir Tokendir.01.1a0zqyumw
Install Podman
Gerekli bilgiler : https://podman.io/docs/installation
apt install podman -y
systemctl enable podman.socket
systemctl --user --machine=gitlab-runner@ enable --now podman.socket
su - gitlab-runner
echo 'export XDG_RUNTIME_DIR=/run/user/$(id -u)' >> .bash_profile
export XDG_RUNTIME_DIR=/run/user/999
systemctl --user status podman.socket
exit
vim /etc/gitlab-runner/config.toml
burada config.toml a HOST satirini ekliyoruz. ancak burada ki user/999 bulmak icin gitlab-runner useri olarak daha önce girdigimiz systemctl –user status podman.socket komutunda ki Listen satirina bakiyoruz.
Listen: /run/user/999/podman/podman.sock (Stream)
[runners.docker]
host = "unix:///run/user/999/podman/podman.sock"
tls_verify = false
image = "ubuntu:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
volume_keep = false
shm_size = 0
network_mtu = 0
sonra devam
systemctl restart gitlab-runner
modprobe fuse
apt -y install fuse3
apt install qemu-guest-agent -y
su - gitlab-runner
podman system migrate
podman run --entrypoint /bin/sh -ti --rm quay.io/buildah/stable:v1.43.0
exit
Buraya kadar bana en azindan yabanci pek cok komut girdim ve bunlarin aciklamalarini asagida ki gibi ögrendim.
En bastan baslayalim. Amacimiz rootless ancak container olusturabilen secure bir gitlab-runner sahibi olmak cünkü DinD root yetkileri istiyor ve bu secure degil. Ana platformumuz ubuntu 24.04 VM.
gitlab-runneri kurarken :
- loginctl enable-linger gitlab-runner
bu komut userin session inin acik kalmasini böylece runneri sürekli calisir tutuyor. Cok da elzem degil. - uid – gid
- usermod –add-subuids 700000-765536 gitlab-runner
- usermod –add-subgids 700000-765536 gitlab-runner
Bu iki komut sayasinde container icindeki user ve group id leri 70000 den baslayan ID’lere maplanierler. bunun sebebi normalde dockerda container icindeki uid ve gid host taki uid ve gid ye maplenir dolayisiyla uid si 0 olan bir container host üzerinde de “root” yetkisine sahip olur ancak tamda bu podman ile önlemek istedigimiz sey. ancak podman simdi nereye mapleyecegini bilemeyecektir cünkü 1-1 mapleme olmayacaksa nasil olacak tanimlanmasi gerekmektedir. yoksacannot set up user namespaces Permission denied (cannot chown)failed to register layer: ERRO[0000]
gibi error mesajlari ile sistem calismaz. bu ayar sayesinde Container icinde uid si 0 olan host üzerinde 70000 ve gid si 1000 olan host üzerinde 701000 gibi gid alacak ve maplenebilecektir-
- export XDG_RUNTIME_DIR=/run/user/999
XDG_RUNTIME_DIR bir standard runtime degiskenidir ve programlarin kücük datalari saklayabilecekleri hizli bir folderdir. /run RAM de bulunur ve cok hizlidir ancak reboot ile gider. ve sadece user 999 a izin verdigimizden baskasi (root) haric okuyamaz. Bunu kullandik böylece PODMAN ve systemd ye nereyi kullanmalari gerektigini göstermis olduk.
Podmani kurarken
modprobe fuse
apt -y install fuse3
Containerlarda bulunan layerlar docker tarafindan overlay kullanilarak olusturulur ancak docker bunu root yetkisi ile yapar. Podman bunun icin kernelin native overlayini kullanamaz. fuse3 kullandigimizda podman otomatik olarak fuse-overlayfs e gecer ve userspace icinde podman image layerlarini olusturabilir ve root yetkilerine ihtiyac duymaz.
bu olmadan gitlab pipeline da image kullanmak istedigmizde hata alirizunrecognized image format or cannot mount overlay: permission denied
Daha sonra mutlaka config.toml altina “devices = [“/dev/fuse”]” ekliyoruz.
[runners.docker]
host = "unix:///run/user/999/podman/podman.sock"
tls_verify = false
image = "ubuntu:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
volume_keep = false
shm_size = 0
network_mtu = 0
devices = ["/dev/fuse"]