preloader
  • Bitbucket 'self-hosted' runner em ambiente Kubernetes
blog-thumb

Executando bitbucket runners auto-hospedados em Kubernetes

Os runners permitem que você execute pipelines a partir de seus repositórios. O bitbucket permite que hospede esses runners em sua própria infraestrutura, os chamados self-hosted runners.

Nesse artigo vamos ver o passo a passo de como criar um runner auto-hospedado em nível de workspace e executá-lo em Kubernetes.

Criando um runner no bitbucket

O primeiro passo é a criação de um novo runner. Vamos criá-lo em nível de workspace:

Navegue até seu perfil e clique no workspace que deseja.

bitbucket-image-01

Clique em configurações e selecione workspace runners.

bitbucket-image-02 bitbucket-image-03

Adicionar runner.

bitbucket-image-04

Defina o nome para o runner e uma label. As labels self.hosted e linux são padrões, precisamos adicionar uma nova label para podermos identificar no pipeline em qual runner o build deve ser executado, caso existam outros runners criados.

Clique em next. Será gerada uma saída com o seguinte comando docker:

docker container run -it -v /tmp:/tmp -v /var/run/docker.sock:/var/run/docker.sock \
-v /var/lib/docker/containers:/var/lib/docker/containers:ro \
-e ACCOUNT_UUID={ACCOUNT_UUID}  \
-e RUNNER_UUID={RUNNER_UUID} \
-e RUNTIME_PREREQUISITES_ENABLED=true \
-e OAUTH_CLIENT_ID=OAUTH_CLIENT_ID \
-e OAUTH_CLIENT_SECRET=OAUTH_CLIENT_SECRET \
-e WORKING_DIRECTORY=/tmp \
--name runner-87c1a9ae-c216-5512-a92d-12fb95f77f0b \ docker-public.packages.atlassian.com/sox/atlassian/bitbucket-pipelines-runner:1

Copie esse comando, pois vamos utilizar os valores das variáveis apresentadas para a configuração do nosso runner auto-hospedado e clique em finish.

Observe que o runner foi criado no workspace, mas seu status está como UNREGISTRED. Após configurarmos o runner e executá-lo no ambiente Kubernetes seu status irá mudar para ONLINE.

bitbucket-image-05

Configuração Kubernetes

O próximo passo é a construção dos arquivos kubernetes para hospedarmos o runner.

Primeiro vamos tratar as variáveis dadas pelo comando:

-e ACCOUNT_UUID={ACCOUNT_UUID}  \
-e RUNNER_UUID={RUNNER_UUID} \
-e RUNTIME_PREREQUISITES_ENABLED=true \
-e OAUTH_CLIENT_ID=OAUTH_CLIENT_ID \
-e OAUTH_CLIENT_SECRET=OAUTH_CLIENT_SECRET \
-e WORKING_DIRECTORY=/tmp \ 
  • Copie o valor das variáveis ACCOUNT_UUID e RUNNER_UUID sem as { }.
  • As variáveis OAUTH_CLIENT_ID e OAUTH_CLIENT_SECRET devem ser transformadas em base64.

echo -n OAUTH_CLIENT_ID | base64
echo -n OAUTH_CLIENT_SECRET | base64

Feito isso passamos para a etapa de construção dos arquivos Kubernetes:

  • secret.yaml
  • job.yaml

Adicione os valores das variáveis:

secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: runner-01-oauth-credentials
  labels:
    accountUuid: {ACCOUNT_UUID}
    runnerUuid: {RUNNER_UUID}
data:
  oauthClientId: {OAUTH_CLIENT_ID}
  oauthClientSecret: {OAUTH_CLIENT_SECRET}

job.yaml

Importante: No arquivo job.yaml as variáveis de accountUuid e runnerUuid, na seção de ‘container variables’, devem ser adicionadas entre “ ” e { }, dessa forma “{ACCOUNT_UUID}”

apiVersion: batch/v1
kind: Job
metadata:
      name: runner-01
spec:
  template:
    metadata:
      labels:
         accountUuid: {ACCOUNT_UUID}
         runnerUuid: {RUNNER_UUID}
    spec:
      containers:
        - name: bitbucket-runner-01
          image: docker-public.packages.atlassian.com/sox/atlassian/bitbucket-pipelines-runner
        env:
          - name: ACCOUNT_UUID
            value: “{${ACCOUNT_UUID}}”
          - name: RUNNER_UUID
            value: “{${RUNNER_UUID}}”
          - name: RUNTIME_PREREQUISITES_ENABLED
            value: true
          - name: WORKING_DIRECTORY
            value: "/tmp"
          - name: OAUTH_CLIENT_ID
            valueFrom:
              secretKeyRef:
                name: runner-01-oauth-credentials
                key: oauthClientId
          -  name: OAUTH_CLIENT_SECRET
             valueFrom:
               secretKeyRef:
                 name: runner-01-oauth-credentials
                 key: oauthClientSecret
        volumeMounts:
          - name: tmp
            mountPath: /tmp
          - name: docker-containers
            mountPath: /var/lib/docker/containers
            readOnly: true
          - name: var-run
            mountPath: /var/run
      - name: docker-in-docker
        image: docker:20.10.7-dind
        securityContext:
          privileged: true
        volumeMounts:
          - name: tmp
            mountPath: /tmp
          - name: docker-containers
            mountPath: /var/lib/docker/containers
          - name: var-run
            mountPath: /var/run
      restartPolicy: OnFailure
      volumes:
        - name: tmp
        - name: docker-containers
        - name: var-run
  backoffLimit: 6
  completions: 1
  parallelism: 1

Agora vamos aplicar as configurações construídas acima.

kubectl -n namespace apply -f secrets.yaml
kubectl -n namespace apply -f job.yaml

Testando o novo runner


pipelines:
  branches:
    'main':
      - step:
        runs-on: my.custom.label
        script:
          - echo "Hello world"

Seu runner auto-hospedado está pronto!

Para mais informações sobre runners visite a documentação bitbucket runners.

Precisa de ajuda?

Acesse nossa página de Contato e converse conosco.

Sucesso!

Leitura complementar:

Pipelines runners frequently asked questions