Ejercicio: Uso de Script de GitHub en Acciones de GitHub

Completado

En esta unidad aprenderá a usar el script de GitHub para mejorar el flujo de trabajo.

Agregar problemas a un panel de proyecto

Además de usar octokit/rest.js para crear comentarios y abrir solicitudes de incorporación de cambios, también puede usar octokit/rest.js para administrar proyectos de GitHub. En el ejemplo de código siguiente, se creará un flujo de trabajo que se ejecuta cada vez que alguien agrega un nuevo problema al repositorio. Esto agrega el problema a un panel de proyecto, lo que facilita la evaluación de prioridades del trabajo.

name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: "🎉 You've created this issue comment using GitHub Script!!!"
            })
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

La primera sección de este flujo de trabajo crea un comentario cada vez que se crea un problema nuevo; aspecto que se ha cubierto en la unidad anterior. En la sección siguiente se crea una tarjeta basada en este problema y se agrega al panel del proyecto.

Separar el flujo de trabajo en pasos

Una ventaja de usar acciones es que puede separar los trabajos en unidades de trabajo más pequeñas denominadas pasos. En el flujo de trabajo de ejemplo anterior, puede separar el flujo de trabajo en dos pasos.

Una ventaja de dividir el flujo de trabajo actual en varios pasos es que permite usar expresiones para aplicar lógica. El uso de pasos le permite crear reglas sobre cuándo se permite la ejecución de los pasos y puede ayudar a optimizar la ejecución del flujo de trabajo.

Para separar el flujo de trabajo de ejemplo en pasos debe:

  • Asigne un nombre a cada paso para que pueda realizar un seguimiento desde la pestaña Acciones.
  • Use expresiones para determinar si se debe ejecutar un paso (opcional).

En este ejemplo, las dos tareas del archivo de flujo de trabajo original se han separado en pasos individuales.

name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
    - name: Comment on new issue
      uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.issues.createComment({
            issue_number: context.issue.number,
            owner: context.repo.owner,
            repo: context.repo.repo,
            body: "🎉 You've created this issue comment using GitHub Script!!!"
            })
    - name: Add issue to project board
      if: contains(github.event.issue.labels.*.name, 'bug')
      uses: actions/github-script@0.8.0
      with:
        github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
        script: |
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

Cada paso incluye un elemento descriptivo name que también le ayuda a realizar un seguimiento desde la pestaña Acciones.

El paso Add issue to project board también incluye una instrucción if que especifica que el problema solo se debe agregar al panel del proyecto si está etiquetado como bug.

Uso del entorno de Node.js

El script de GitHub también le concede acceso a un entorno Node.js completo. Aunque el script de GitHub no se recomienda para escribir la lógica para acciones complejas, puede usarlo para agregar más funcionalidad a la API de octo/rest.js.

Un ejemplo es usar Node.js para mostrar una guía de contribución cada vez que se abre un problema. Puede usar el sistema de archivos Node.js para leer un archivo y usarlo como cuerpo del comentario del problema. Para acceder a los archivos dentro del repositorio, incluya la acción actions/checkout como primer paso del flujo de trabajo.

En el ejemplo siguiente se realizan los siguientes cambios en el archivo de flujo de trabajo:

  • Agrega la acción action/checkout para leer el archivo de respuesta con plantilla ubicado en .github/ISSUE_COMMENT/comment.md.
  • Agrega JavaScript para usar el módulo del sistema de archivos Node.js para colocar el contenido de la respuesta con plantilla como el cuerpo del comentario del problema.
name: Learning GitHub Script
on:
  issues:
    types: [opened]
jobs:
  comment:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repo
        uses: actions/checkout@v2
      - name: Comment on new issue
        uses: actions/github-script@0.8.0
        with:
          github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
          script: |
             const fs = require('fs')
             const issueBody = fs.readFileSync(".github/ISSUE_RESPONSES/comment.md", "utf8")
             github.issues.createComment({
             issue_number: context.issue.number,
             owner: context.repo.owner,
             repo: context.repo.repo,
             body: issueBody
             })
      - name: Add issue to project board
        if: contains(github.event.issue.labels.*.name, 'bug')
        uses: actions/github-script@0.8.0
        with:
          github-token: {% raw %}${{secrets.GITHUB_TOKEN}}{% endraw %}
          script: |
            github.projects.createCard({
            column_id: {{columnID}},
            content_id: context.payload.issue.id,
            content_type: "Issue"
            });

El script de GitHub le ayudó a crear una respuesta completa a un nuevo problema que se está abriendo. Esta respuesta también se basa en una plantilla del repositorio, por lo que es fácil hacer cambios en el futuro. Por último, también ha incluido un desencadenador para agregar el problema al panel del proyecto para que pueda evaluar fácilmente la prioridad para trabajos futuros.