preloader
  • Bitbucket 'self-hosted' runner en el entorno Kubernetes
blog-thumb

Ejecución de bitbucket runners autohospedados en Kubernetes

Los runners le permiten ejecutar pipelines desde sus repositorios. Bitbucket le permite alojar estos runners en su propia infraestructura, los llamados self-hosted runners.

En este artículo, lo guiaremos a través de cómo crear un runner autohospedado a nivel de workspace y ejecutarlo en Kubernetes.

Creando un runner en bitbucket

El primer paso es crear un nuevo runner. Vamos a crearlo a nivel del workspace:

Vaya a su perfil y haga clic en el workspace que desee.

bitbucket-image-01

Haga clic en configuración y seleccione workspace runners.

bitbucket-image-02 bitbucket-image-03

Añadir runner.

bitbucket-image-04

Defina el nombre para el runner y una label. Las labels self.hosted y linux son valores predeterminados, debemos agregar una nueva label para poder identificar en el pipeline en qué runner se debe ejecutar el build, si hay otros runners creados.

Clickea en next. Se generará una salida con el siguiente 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 este comando, ya que vamos a utilizar los valores de las variables presentadas para la configuración de nuestro runner autohospedado y haga clic en finish.

Observe que el runner se creó en el workspace, pero su estado es UNREGISTRED. Después de configurar el runner y ejecutarlo en el entorno de Kubernetes, su estado cambiará a ONLINE.

bitbucket-image-05

Configuración de Kubernetes

El siguiente paso es compilar los archivos de Kubernetes para alojar el runner.

Primero manejemos las variables dadas por el 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 \ 
  • Copiar el valor de las variables ACCOUNT_UUID y RUNNER_UUID sin las { }.
  • Las variables OAUTH_CLIENT_ID y OAUTH_CLIENT_SECRET debe convertirse a base64.

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

Una vez hecho esto, pasamos a la etapa de construcción de los archivos de Kubernetes:

  • secret.yaml
  • job.yaml

Agregue los valores de las variables:

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: En el archivo job.yaml, las variables accountUuid y runnerUuid, en la sección ‘container variables’, deben agregarse entre “ ” y { }, de esa 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

Ahora apliquemos las configuraciones creadas anteriormente.

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

Probando el nuevo runner


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

¡Su runner autohospedado está listo!

Para obtener más información acerca de los runners, visite la documentación de bitbucket runners.

¿Necesita ayuda?

Accede a nuestra página de Contacto y chatea con nosotros.

¡Éxito!

Lectura adicional:

Pipelines runners frequently asked questions