Ejecutar acciones de GitHub en Fedora CoreOS

Acciones de GitHub es un servicio proporcionado para configurar rápidamente flujos de trabajo de integración y entrega continuas (CI/CD). Estos flujos de trabajo se ejecutan en hosts llamados corredores. GitHub proporciona corredores alojados con un conjunto limitado de opciones de sistema operativo (Windows Server, Ubuntu , MacOS).

Otra opción es usar alojado en sí mismo runners, lo que le da al administrador del repositorio más control sobre los runners. Los ejecutores autohospedados están dedicados a un repositorio u organización. El siguiente artículo repasa los pasos para configurar ejecutores autohospedados mediante Fedora CoreOS.

Empezando

Fedora CoreOS es un sistema operativo minimalista diseñado para ser fácil de implementar y mantener a escala. El sistema operativo se actualizará automáticamente y proporcionará, de forma predeterminada, las herramientas necesarias para ejecutar contenedores. Por todas estas razones, Fedora CoreOS es una excelente opción a tener en cuenta para ejecutar flujos de trabajo de CI/CD.

El primer paso para configurar y aprovisionar un Fedora La máquina CoreOS es generar un Encendido expediente. Butano le permite generar el archivo de Ignition usando un formato más amigable (YAML).

Configurar un Fedora Corredor de CoreOS

Para ejecutar acciones de GitHub en Fedora CoreOS, el host necesita los archivos binarios y los scripts utilizados para registrar y ejecutar el corredor. Descargue los archivos binarios y scripts de la proyecto corredor de acciones e implementar en /usr/local/sbin/actions-runner.

                      version: "1.3.0"
variant: fcos
storage:
  directories:
    - path: /usr/local/sbin/actions-runner
      mode: 0755
      user:
        name: core
      group:
        name: core
  files:
    - path: /usr/local/sbin/actions-runner/actions-runner-linux.tar.gz
      overwrite: true
      contents:
        source: https://github.com/actions/runner/releases/download/v2.278.0/actions-runner-linux-x64-2.278.0.tar.gz
      mode: 0755
      user:
        name: core
      group:
        name: core
                    

Token de registro y eliminación

La configuración de corredores para un proyecto requiere un “token”. Esto evita el registro o la eliminación de ejecutores autohospedados de proyectos sin los permisos correctos. Los tokens proporcionados por Github tienen un tiempo de vencimiento de una hora. Si el corredor reinicia después de este tiempo, requerirá un nuevo token de registro.

El token puede ser problemático, en particular con Fedora Actualizaciones automáticas de CoreOS. El proceso de actualización espera que el host se reinicie al menos una vez cada dos semanas después de recibir nuevos datos.

Afortunadamente, es posible usar la API REST de GitHub para obtener estos tokens y configurar automáticamente el corredor cada vez que se reinicia el host. El siguiente script de manage-runner.sh usa las API para recuperar un token, eliminar cualquier corredor ya configurado y registrar el corredor con un nuevo token.

                      #!/bin/bash
# Handles the Github Action runner configuration.
# Remove and Registration token expires after 1 hour, if we want our runner
# to work after a reboot (auto update) we need to refresh the tokens.

# First remove the runner with a fresh remove token
REMOVE_TOKEN=$(curl -u ${GITHUB_USER}:${GITHUB_TOKEN} -X POST -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPO}/actions/runners/remove-token | jq -r '.token')
/usr/local/sbin/actions-runner/config.sh remove --token ${REMOVE_TOKEN}


# Then register the runner with a fresh registration token
REGISTRATION_TOKEN=$(curl -u ${GITHUB_USER}:${GITHUB_TOKEN} -X POST -H "Accept: application/vnd.github.v3+json" https://api.github.com/repos/${GITHUB_USER}/${GITHUB_REPO}/actions/runners/registration-token | jq -r '.token')
/usr/local/sbin/actions-runner/config.sh --url https://github.com/cverna/fcos-actions-runner --token ${REGISTRATION_TOKEN} --labels fcos --unattended
                    

El script anterior usa algunas variables de entorno que contienen un nombre de usuario de GitHub y un Token de acceso personal se utiliza para autenticar las solicitudes de la API REST. El token de acceso personal requiere los permisos del repositorio para recuperar con éxito los tokens de registro y eliminación del corredor. El token es sensible a la seguridad, por lo que es mejor almacenarlo en un archivo diferente con permisos más estrictos. En esto example ese archivo es actions-runner.

                      GITHUB_USER=<user>
GITHUB_REPO=<repo>
GITHUB_TOKEN=<personal_access_token> 
                    

A continuación se muestra el fragmento de código Butane que crea estos dos archivos: manage-runner.sh y actions-runner.

                          - path: /usr/local/sbin/actions-runner/manage-runner.sh
      contents:
        local: manage-runner.sh
      mode: 0755
      user:
        name: core
      group:
        name: core
    - path: /etc/actions-runner
      contents:
        local: actions-runner
      mode: 0700
      user:
        name: core
      group:
        name: core
                    

Ejecutar acciones en Fedora CoreOS

Finalmente, cree los servicios systemd que configurarán e iniciarán el corredor. Defina los servicios en el archivo de configuración de Butano.

                      systemd:
  units:
    - name: github-runner-configure.service
      enabled: true
      contents: |
        [Unit]
        Description=Configure the github action runner for a repository
        After=network-online.target boot-complete.target
        Requires=boot-complete.target
        [Service]
        EnvironmentFile=/etc/actions-runner
        Type=oneshot
        RemainAfterExit=yes
        User=core
        WorkingDirectory=/usr/local/sbin/actions-runner
        ExecStartPre=tar xvf actions-runner-linux.tar.gz --no-same-owner
        ExecStart=/usr/local/sbin/actions-runner/manage-runner.sh
        [Install]
        WantedBy=multi-user.target
    - name: github-runner.service
      enabled: true
      contents: |
        [Unit]
        Description=Run the github action runner
        After=github-runner-configure.service
        [Service]
        WorkingDirectory=/usr/local/sbin/actions-runner
        User=core
        ExecStart=/usr/local/sbin/actions-runner/run.sh
        [Install]
        WantedBy=multi-user.target
                    

Esto crea dos servicios, github-runner-configure.service (que se ejecuta una vez cuando el host ha terminado de iniciarse) y github-runner.service (que ejecuta los binarios del corredor de acciones y espera nuevos trabajos de CI/CD).

Ahora que la configuración de butano está completa, genere un archivo de encendido a partir de él y aprovisione un Fedora Corredor de acciones de CoreOS.

                      $ podman run -i --rm -v $PWD:/code:z --workdir /code quay.io/coreos/butane:release --pretty --strict --files-dir /code config.yaml -o config.ignition
                    

Una vez que se genera el archivo Ignition, se puede usar para aprovisionar un corredor en las plataformas donde Fedora CoreOS es disponible .

Empezar con Fedora CoreOS

Configurar una acción para usar un ejecutor autohospedado

El siguiente flujo de trabajo de acción de prueba probará el trabajador autohospedado de FCOS. Cree el siguiente archivo en su repositorio git .github/workflows/main.yml

                      # This is a basic workflow to help you get started with Actions

name: CI

# Controls when the action will run. 
on:
  # Triggers the workflow on push or pull request events but only for the main branch
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build:
    # The type of runner that the job will run on
    runs-on: fcos

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Runs a single command using the runners shell
      - name: Run a one-line script
        run: podman run --rm fedora-minimal:34 echo Hello World !
                    

Tenga en cuenta que la configuración de ejecuciones está configurada para usar un corredor con la etiqueta fcos.

El código presentado en este artículo está disponible aquí .

Related Posts