Saltar a contenido

Datos de Contexto

Las reglas se ejecutan principalmente dentro de un contexto, como webhooks, eventos de topic o pipelines.

Para usar los datos que desencadenaron el contexto, existe un namespace de ClaJS llamado ctx que está siempre disponible para los rulebooks.

Función de Contexto Contexto Tipo de Dato Contenido
ctx.category() cualquier evento de topic Object Información de categoría
ctx.fields() topic_modify Array Lista de campos modificados, con valor antiguo y nuevo
ctx.job() pipelines Object Información del job
ctx.env() pipelines String Entorno del job actual
ctx.branch() pipelines String Nombre de la rama extraída para el job
ctx.request() webhook Request Parámetros de la petición web
ctx.status() cualquier evento de topic Object Información de estado
ctx.topic() cualquier evento de topic Object Información del topic
ctx.user() (cualquiera) String Id del usuario

undefined cuando no está en contexto

Cuando no está en contexto, todas las funciones de contexto devolverán undefined y emitirán una advertencia a stderr [warn] X not in context.

Asegúrese de verificar el valor de retorno o usar ctx.has() antes de proceder bajo el supuesto de que el valor de retorno es un hash {}

Uso

Las llamadas de contexto son útiles para obtener el detalle del evento que la regla está procesando:

topic_modify:
   - echo: "Topic modify event for {{ ctx.topic("name") }}"
   - echo: |
        These fields have changed: {{ ctx.fields().map( function(field){ return field.field } ) }}"

Objetos de Contexto

Estos son los objetos de contexto disponibles en Clarive.

Recuerde, si no está en el contexto correcto, devolverán undefined en lugar de un Object hash. Use ctx.has() para verificar el contexto, de lo contrario pueden ocurrir efectos secundarios extraños.

ctx.var(varname)

Devuelve los valores de variables para el alcance del contexto actual y el nombre de variable de entrada.

Dependiendo del alcance, el valor de la variable (si está disponible) cambiará.

deploy:
   - instance_id =: "{{ ctx.var("aws_instance_id") }}"
   - image: docker4x/shell-aws
   - aws ec2 start-instances --instance-ids ${instance_id}

   # o en un solo paso:

   - aws ec2 start-instances --instance-ids {{ ctx.var("instance_id") }}

ctx.topic()

Este es el hash devuelto por la función ClaJS ctx.topic(). El hash tiene las siguientes claves:

Clave Contexto
ctx.topic("mid") id del topic
ctx.topic("title") cadena del nombre del estado
ctx.topic("status") cadena del nombre del estado
ctx.topic("category") cadena del nombre de categoría
[campos dependientes de categoría] campos adicionales, dependiendo de la categoría
do: |
   print( "Topic ID=" + ctx.topic("mid") );
   print( "Topic Title=" + ctx.topic("title") );
   print( "Status name=" + ctx.topic("status") );      # "To Do", "In Progress", etc.
   print( "Category name=" + ctx.topic("category") );  # "Bugfix", "Feature", etc.

Diríjase al documento sobre reglas de eventos para más información.

ctx.fields()

La función de contexto ctx.fields() devuelve una lista (array) de campos modificados en el evento topic_modify.

Aquí hay una lista de campos disponibles:

Clave Tipo Descripción
field string Nombre del campo (ej. "title", "description", etc)
old_value (variable) Valor del campo antes del cambio. El tipo depende del campo.
new_value string Valor del campo después del cambio. El tipo depende del campo.

ctx.job()

Aquí hay una descripción del hash devuelto por la función ctx.job():

Clave Tipo Descripción
ctx.job("project") String Proyecto actual que se está procesando, si lo hay
ctx.job("repository") String Nombre del repositorio actual que se está procesando, si lo hay
ctx.job("change_version") String Número de versión del topic Release, etc.
ctx.job("environment") String Entorno de despliegue actual (DEV, QA, PROD...)
ctx.job("env") String Igual que environment anterior
ctx.job("items") Array Lista de elementos del job
ctx.job("name") String Nombre del job (como se muestra en el Monitor)
ctx.job("type") String static, promote o demote
ctx.job("user") String Usuario que creó el job
ctx.job("mode") String forward o rollback
ctx.job("step") String paso actual del job: CHECK, INIT, PRE, RUN, POST
ctx.job("status_from") String Proyecto actual que se está procesando, si lo hay
ctx.job("status_to") String Id de versión del topic Release, etc.
ctx.job("is_rollback") String Entorno de despliegue actual (DEV, QA,
ctx.job("failing") Boolean En la regla de pipeline post:, establecido en 1 si los pasos anteriores fallaron

ctx.request()

El contexto de petición web solo está disponible en eventos de llamadas de URL webhook.

Clave Tipo Contenido
ctx.request('params') String Los parámetros de query-string de URL o formulario en un hash
ctx.request('args') String Array con cada uno de los componentes /path de la URL
ctx.request('body') String El cuerpo completo de la petición como una cadena
ctx.request('headers') Object Cabeceras de la petición HTTP
ctx.request('upload') String Archivos subidos
ctx.user() String El id del usuario que hizo la petición (autenticado)

Verificar si el contexto está disponible

Si el contexto no está disponible, intentar usar las funciones de contexto ctx generará un error como:

context `CONTEXT_NAME` is not available

Para verificar antes de usar una función, use la función ctx.has('context_name'), que devuelve true o false dependiendo del contexto.

Esto es especialmente útil para ops definidos con def:. De esta manera se puede verificar si el op está en el contexto correcto o no.

def:
   reset_topic_title:
      - if: "{{ ctx.has('topic') }}"
        then:
          - update_topic:
                mid: ${mid}
                data:
                   title: "The new title is this now"
        else:
          - fail: "No topic available in context"

Esta es la lista de argumentos que se pueden probar con ctx.has():

  • topic
  • status
  • category
  • job
  • fields
  • request
  • user