Como usar o Podman em corredores GitLab
Existem várias maneiras de ativar executores GitLab usando Podman, duas das quais descrevi neste artigo.
Um GitLab Runner é um aplicativo que funciona com GitLab CI/CD para executar trabalhos em um pipeline na infraestrutura do GitLab. Eles são frequentemente usados para compilar aplicativos automaticamente após o código ter sido confirmado ou para executar testes em uma base de código. Você pode considerá-los como ganchos Git baseados em nuvem.
A principal instância pública do GitLab fornece muitos executores compartilhados facilmente acessíveis, prontos para uso em seu pipeline de CI. Você pode encontrar uma lista de executores compartilhados em Configurações -> CI/CD -> Executores do seu repositório no GitLab.
(Lokesh Mandvekar, CC BY-SA 4.0)
Há muitos motivos pelos quais você pode não querer depender de corredores compartilhados e, em vez disso, defender seus próprios corredores. Por exemplo, controle sobre a infraestrutura onde os executores operam para segurança e/ou privacidade adicionais, configuração flexível do executor ou minutos de CI limitados alocados à sua conta de usuário do GitLab.
Os executores do GitLab dependem de uma ferramenta executora para executar trabalhos de CI. Muitas opções estão disponíveis para executores: Docker, Kubernetes, VirtualBox e assim por diante.
Então, e Podman como executor?
Desde a v4.2.0, Podman tem suporte nativo para executores GitLab. Aqui está uma rápida olhada em duas abordagens para usar o Podman como executor para executores do GitLab.
Executor Docker
Você pode usar o Podman como um substituto imediato para o Docker em seu GitLab Runner. Veja como:
Este exemplo usou um ambiente CentOS Stream 9 em fevereiro de 2023 usando Podman v4.4.0. Deve funcionar tão bem em qualquer ambiente RHEL/CentOS Stream/Fedora com um Podman novo o suficiente. Confira a documentação do GitLab para pré-requisitos.
Primeiro, instale o Podman:
$ sudo dnf -y install podman
Instale o pacote gitlab-runner a seguir:
# Add the GitLab runner repository
$ curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
# Install the gitlab-runner package
$ sudo dnf -y install gitlab-runner
Por fim, permita que o usuário execute tarefas após o logout:
$ sudo loginctl enable-linger gitlab-runner
Configurar e registrar o corredor
Use as etapas a seguir para configurar o executor do Docker.
A instalação do pacote gitlab-runner cria uma conta de usuário gitlab-runner, mas você precisa de acesso root para manipular a conta de usuário. gitlab-runner pode ser executado em modo de usuário, mas requer alguma intervenção manual para processamento de compilação. Neste exemplo, executo-o em modo de sistema com sudo
. Isto é o que parece:
$ sudo gitlab-runner register
Runtime platform arch=amd64 os=linux pid=7978 revision=d540b510 version=15.9.1
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
https://gitlab.com
Enter the registration token:
xxxxxxxxxxxxxxxxx
Enter a description for the runner:
[lmandvek-c9s-gitlab-runner]:
Enter tags for the runner (comma-separated):
Enter optional maintenance note for the runner:
WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/380872
Registering runner... succeeded runner=GR13489419oEPYcJ8
Enter an executor: custom, docker, ssh, docker-ssh+machine, docker-ssh, parallels, shell, virtualbox, docker+machine, instance, kubernetes:
docker
Enter the default Docker image (for example, ruby:2.7):
registry.gitlab.com/rhcontainerbot/pkg-builder
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml"
Você precisará de algumas configurações adicionais para usar o Podman. Configure o executor para criar uma rede para cada trabalho. Consulte a documentação do GitLab para obter mais informações.
Primeiro, ative o serviço do sistema Podman junto com a alteração do Env em /etc/gitlab-runner/config.toml
:
[[runners]]
environment = ["FF_NETWORK_PER_BUILD=1"]
[runners.docker]
host = "unix:///run/user/1001/podman/podman.sock"
Reinicie o executor para implementar a mudança:
$ sudo gitlab-runner restart
Verifique se o novo executor está visível em Configurações -> CI/CD -> Executores do seu projeto GitLab:
(Lokesh Mandvekar, CC BY-SA 4.0)
Em seguida, verifique se seus pipelines de CI estão usando o executor. Seus logs de tarefas de CI mencionarão o nome do executor que está sendo usado junto com quaisquer informações adicionais de configuração, como sinalizadores de recursos e imagem de contêiner usada com o executor do executor.
(Lokesh Mandvekar, CC BY-SA 4.0)
Podman-em-Podman (pipglr)
Chris Evich criou o pipglr, uma configuração Podman-in-Podman para criar seus próprios GitLab Runners sem root usando Podman sem root. Essa abordagem não requer nenhuma alteração na configuração do .gitlab-ci.yaml
, portanto, você pode continuar usando a configuração existente como está.
A seguir está um guia de configuração rápida para ajudá-lo a executar isso.
Etapas de configuração
A imagem do contêiner é criada automaticamente a partir do pipglr Containerfile, então defina a imagem para esse repositório:
$ IMAGE="registry.gitlab.com/qontainers/pipglr:latest"
Em seguida, crie um segredo do Podman usando seu token de registro do GitLab:
$ echo '<actual registration token>' | podman secret create REGISTRATION_TOKEN -
Crie um config.toml
em branco que posteriormente conterá todas as configurações do seu executor. Você deve executar esta etapa para que a seguinte etapa podman container register runlabel $IMAGE
seja bem-sucedida:
$ touch ./config.toml # important: file must exist, even if empty.
Cadastre seu corredor. Você pode repetir esta etapa para registrar vários corredores. Isso é útil se você quiser executar várias tarefas de CI em paralelo com conjuntos de tags ou opções de configuração possivelmente diferentes.
$ podman container runlabel register $IMAGE
Edite o config.toml
usando o editor de sua preferência. A edição é opcional, mas geralmente necessária para alterar a imagem do contêiner usada para a tarefa de CI real. Por padrão, a imagem é definida como: registry.fedoraproject.org/fedora:latest
$ $EDITOR ./config.toml # if desired
Por fim, configure o acesso aos volumes. Vários usuários são utilizados dentro dos volumes do contêiner, portanto, você deve configurá-los especificamente para permitir o acesso. Runlabels novamente para o resgate:
$ podman container runlabel setupstorage $IMAGE
$ podman container runlabel setupcache $IMAGE
Teste o corredor
É hora de verificar as configurações. Comece iniciando o contêiner GitLab Runner:
$ podman container runlabel run $IMAGE
Permita que o usuário executor execute serviços após o logout:
$ sudo loginctl enable-linger $(id -u)
Verifique se seu novo executor está visível em Configurações -> CI/CD -> Executores do seu projeto GitLab:
(Lokesh Mandvekar, CC BY-SA 4.0)
Por fim, verifique se seus pipelines de CI estão usando seu executor:
(Lokesh Mandvekar, CC BY-SA 4.0)
Embrulhar
Existem várias maneiras de ativar executores GitLab usando Podman, duas das quais descrevi aqui. Experimente e deixe-me saber qual funciona melhor para você. Em caso de problemas com a abordagem do executor do docker, faça login para registrar um problema com o Podman upstream ou com o suporte do GitLab. Em caso de problemas com o método pipglr, registre um problema no pipglr upstream.
Feliz GitLab rodando com Podman 🙂