Activadores de flujo de trabajo manual en acciones de Github

9

Estoy configurando acciones de Github para un repositorio de proyectos.

El flujo de trabajo consta de los siguientes pasos:

  • Construyendo una imagen acoplable
  • Empujar la imagen a un registro de contenedor
  • Implementar una implementación de Kubernetes.

Sin embargo, tengo dos implementaciones diferentes de Kubernetes: una para desarrollo y otra para producción. Por lo tanto, también tengo dos flujos de trabajo de Github Action.

El flujo de trabajo de Github Action para el desarrollo se activa cada vez que se empuja una confirmación:

on:
  push:
    branches:
    - master

Pero no quiero eso para mi flujo de trabajo de producción. Necesitaría un disparador manual, como un botón Enviar a producción . No vi nada parecido a eso en los documentos.


¿Hay alguna manera de activar un flujo de trabajo manualmente en las acciones de Github?

¿Cómo puedo dividir mis flujos de trabajo de desarrollo y producción para lograr lo que quiero, ya sea en Github Actions, Docker o Kubernetes?

Antoine C.
fuente

Respuestas:

9

¿Hay alguna manera de activar un flujo de trabajo manualmente en las acciones de Github?

Tengo un pequeño truco para hacerlo ...

Con el evento de observación, puede activar manualmente una acción al marcar o desmarcar el repositorio. El código para el evento en su flujo de trabajo es:

on:
  watch
    types: [started]

Sé que es una mierda extraña, ¡pero funciona! Sin embargo, no es la mejor manera si se trata de un repositorio público con estrellas potenciales.


¿Cómo puedo dividir mis flujos de trabajo de desarrollo y producción para lograr lo que quiero, ya sea en Github Actions, Docker o Kubernetes?

En Github Actions, quiero decir, puede hacer múltiples flujos de trabajo / trabajos y filtrar por ramas o eventos específicos. Puede combinar varios eventos, por ejemplo, desencadenar un flujo de trabajo para push y con un cron a medianoche.

Sarah Abderemane
fuente
77
Jaja, esto es muy bueno:> repository_dispatchun lado, se puede combinar watchcon el if: github.actor == 'hackerman'de filtrar extraños al azar. O mejor aún, if: github.actor == github.event.repository.owner.loginpara "seguridad" adicional: D
Samira
1
¡Jaja gracias! Sí, buena idea, ¡tengo que probar esto cuando tenga tiempo! : D
Sarah Abderemane
1
Perfecto, creo que este es el mejor método, mientras que no hay algo implementado oficialmente.
Antoine C.
5

Actualización : para una solución de estilo de comando de barra "ChatOps", vea la acción barra-comando-despacho . Esto puede permitirle desencadenar flujos de trabajo con comandos de barra diagonal (p /deploy. Ej. ) A partir de problemas y comentarios de solicitud de extracción.

Aquí hay un ejemplo básico para un deploycomando de barra diagonal. REPO_ACCESS_TOKENes un token de acceso personal conrepo alcance

name: Slash Command Dispatch
on:
  issue_comment:
    types: [created]
jobs:
  slashCommandDispatch:
    runs-on: ubuntu-latest
    steps:
      - name: Slash Command Dispatch
        uses: peter-evans/slash-command-dispatch@v1
        with:
          token: ${{ secrets.REPO_ACCESS_TOKEN }}
          commands: deploy

El comando se puede procesar en este flujo de trabajo.

name: Deploy Command
on:
  repository_dispatch:
    types: [deploy-command]

Hay muchas más opciones y diferentes configuraciones. Consulte slash-command-dispatch para obtener instrucciones de uso completas.

Respuesta original : repository_dispatchuna llamada a la API de GitHub puede activar manualmente un flujo de trabajo de la siguiente manera.

on:
  repository_dispatch:
    types: [production-deploy]
  • [username] es un nombre de usuario de GitHub
  • [token]es un token de acceso personal conrepo alcance
  • [repository] es el nombre del repositorio en el que reside el flujo de trabajo.
curl -XPOST -u "[username]:[token]" \
  -H "Accept: application/vnd.github.everest-preview+json" \
  -H "Content-Type: application/json" \
  https://api.github.com/repos/[username]/[repository]/dispatches \
  --data '{"event_type": "production-deploy"}'
peterevanos
fuente
1
Para cualquier persona interesada, es posible utilizar un flujo de trabajo único para múltiples despachos. Lo que se envía event_typeestá disponible para el flujo de trabajo github.event.action, por lo que los trabajos / pasos específicos se pueden habilitar / deshabilitar cuando sea necesario. PD: PAT no es realmente necesario, comenzar curl con -u "[username]:[password]"o incluso -u "[username]"funciona también (en el segundo caso curl solicita al usuario la contraseña); más fácil de usar en algunos casos (por ejemplo, al escribir scripts que toman como nombre de usuario como entrada, o scripts destinados a ser utilizados por usuarios menos expertos en tecnología).
Samira
2

Aunque la publicación de Sarah fue la respuesta más cercana y más simple a la pregunta original, es algo hacky, por lo que finalmente terminamos creando una devrama para usar los siguientes desencadenantes:

  • Flujo de trabajo de desarrollo: se activa cuando se realiza un empuje en la devrama:

    on:
      push:
        branches:    
          - dev
    
  • Flujo de trabajo de producción: se activa cuando se realiza una solicitud / fusión de extracción devpara master:

    on:
      pull_request:
        branches:    
          - master
    
Antoine C.
fuente
1

Editado para más detalles / explicación.

Una cosa que puedes hacer es llamar repository_dispatch. Puede ver la documentación de GitHub para usar repository_dispatch aquí .

Por ejemplo, si tiene un flujo de trabajo de acciones de GitHub que se ve así:

on:
  repository_dispatch:
    types: [run_tests]
name: Run tests
jobs:
  test:
    name: Run your tests
    runs-on: ubuntu-latest
    steps:
      - run: |
          echo "I just ran all your tests!"

Puede crear un evento de despacho de repositorio siguiendo los pasos que se explican en la documentación de la API de GitHub v3 .

Primero, cree un token de acceso personal (PAT) en GitHub para la autenticación.

Entonces, puedes correr curlasí:

curl \
  -H "Authorization: token $YOUR_PAT" \
  --request POST \
  --data '{"event_type": "run_tests"}' \
  https://api.github.com/repos/$USER/$REPOSITORY/dispatches

Al mismo tiempo, también quería compartir un pequeño proyecto en el que he estado trabajando con un amigo que resuelve este problema exacto.

https://www.actionspanel.app/

ActionsPanel usa esta misma repository_dispatchAPI pero lo hace con un token de aplicación GitHub para que no tenga que preocuparse por administrar su propia PAT. Esto también hace que sea mucho más fácil activar tus acciones en equipos con varias personas.

En función de las solicitudes y comentarios de los usuarios, hemos incorporado funciones para especificar a qué rama enviar el envío repository_dispatch, e incluso hemos creado una forma de inyectar parámetros cuando desea ejecutar la acción.

Configura sus botones con un archivo declarativo yaml que deja en el repositorio, y ActionsPanel leerá ese archivo y creará dinámicamente su UI para que active sus acciones.

aaronbatilo
fuente
0

Otra forma de resolver esto con la oferta actual de Github Action es crear una productionrama desde el maestro cuando se necesita una implementación y activar la acción de implementación en la productionrama. La productionrama es esencialmente un espejo de la master.

on:
  push:
    branches:    
      - master

Las construcciones / push de desarrollo pueden ocurrir siempre que haya un compromiso con el maestro.

on:
  push:
    branches:    
      - production

En algún momento del cronograma de lanzamiento, puede elevar el PR a la productionsucursal. Esto se encargará de la compilación / implementación de productos.

usuario1064504
fuente