Skip to content
ver .md sin procesar

Mueve una tarea cuando se hace merge de un pull request

Conecta el código con el plan: encuentra la clave de la tarea de Dailybot en un pull request, mueve la tarea a la columna de terminado de su tablero y deja un comentario, desde cualquier CI.

Beta

Plan está en beta. Todo lo que está bajo /plan en la aplicación web, los comandos del CLI y de la agent skill para proyectos, objetivos, tableros y tareas, y la API pública /v1/plan/ puede cambiar antes de la disponibilidad general. ¿Quieres probarlo con tu equipo? Escribe a [email protected].

Cuando se hace merge de un pull request titulado ENG-142: Ship the delta feed, la tarea ENG-142 debería pasar a terminada sin que nadie toque el tablero. Las claves de tarea lo facilitan: una clave basta para identificar una tarea, y cada tablero tiene una columna en la categoría done.

Esta receta es un script de shell que puedes ejecutar como último paso de cualquier job de CI después de un merge.

Elige una credencial

  • Una API key personal (X-API-KEY) es ideal para CI que debe actuar como una persona: llega a todo lo que esa persona ve, sin scope que pedir. Una key de agente o de la organización actúa como un actor del sistema: solo llega a tareas en tableros visibles para la organización y necesita que se le otorgue el scope tasks:write (durante la Beta, escribe a [email protected]).
  • Un token de usuario del CLI también funciona si el movimiento debe quedar registrado a nombre de una persona específica.

Consulta Autenticación para Plan.

El script

#!/usr/bin/env bash
set -euo pipefail
API="https://api.dailybot.com/v1/plan"
AUTH=(-H "X-API-KEY: $DAILYBOT_API_KEY")

# 1. Find the task key in the pull request title (or the branch name).
KEY=$(echo "$PR_TITLE" | grep -oE '[A-Z][A-Z0-9]+-[0-9]+' | head -1 || true)
if [ -z "$KEY" ]; then echo "No task key in the title; nothing to move."; exit 0; fi

# 2. Read the task by its key to learn its board and version.
TASK_JSON=$(curl -sS --fail-with-body "$API/tasks/$KEY/" "${AUTH[@]}")
BOARD=$(echo "$TASK_JSON" | jq -r .board)
VERSION=$(echo "$TASK_JSON" | jq -r .version)

# 3. Pick the board's first column in the "done" category.
DONE=$(curl -sS --fail-with-body "$API/boards/$BOARD/states/" "${AUTH[@]}" \
  | jq -r '[.[] | select(.category == "done")][0].uuid')

# 4. Move the task there, refusing if someone changed it meanwhile.
curl -sS --fail-with-body -X POST "$API/tasks/$KEY/move/" "${AUTH[@]}" \
  -H "Content-Type: application/json" \
  -H "If-Match: \"$VERSION\"" \
  -d "{\"state\": \"$DONE\"}" | jq '{key, state: .state.name, version}'

# 5. Say why it moved.
curl -sS --fail-with-body -X POST "$API/tasks/$KEY/comments/" "${AUTH[@]}" \
  -H "Content-Type: application/json" \
  -d "{\"body\": \"Merged: $PR_URL\"}" > /dev/null

Define PR_TITLE y PR_URL con las variables de pull request de tu CI.

Detalles que importan

  • Las claves sobreviven a los cambios de nombre. Si la clave del tablero cambió de ENG a PLAT después de abrir la rama, ENG-142 se sigue resolviendo.
  • Categorías, no nombres. Las columnas pueden llamarse como sea; la categoría done es lo que hace que este script funcione en cualquier tablero.
  • Ediciones simultáneas. Si alguien editó la tarea entre la lectura y el movimiento, el movimiento responde 409 version_conflict. Vuelve a ejecutar el paso, o quita If-Match si el merge siempre debe prevalecer.
  • Mover la tarea es la única forma de cambiar su estado; la tarea queda al final de la columna de terminadas.
  • Una clave de otra organización, o de un tablero que la credencial no puede ver, responde 404.

Desde el CLI, los comandos equivalentes son:

dailybot plan task move "$KEY" --state done
dailybot plan task comment "$KEY" "Merged: $PR_URL"

Referencia