avance
Todavía estamos trabajando en esta característica, ¡pero nos encantaría que la probaras!
Esta característica se proporciona actualmente como parte de un programa de vista previa de conformidad con nuestras políticas de prelanzamiento.
Esquema
Las definiciones de flujo de trabajo se escriben en YAML. Las claves emplean una convención de nomenclatura camelCase.
nombre (Obligatorio)
- Tipo: Cadena
- Formato: Debe ajustar a la expresión regular
^[A-Za-z_][A-Za-z0-9_-]*$. - Longitud máxima: 100
- Descripción: Los valores
nameno distinguen entre mayúsculas y minúsculas. Por ejemplo,ExampleWorkflow,exampleworkflowyEXAMPLEWORKFLOWse consideran que representan la misma definición de flujo de trabajo.
Descripción (opcional)
- Tipo: Cadena
- Formato: Debe ajustar a la expresión regular
^[A-Za-z0-9 _-]*$. - Longitud máxima: 200
- Descripción: Un
descriptiondel flujo de trabajo que explica su propósito.
workflowInputs (opcional)
- Tipo: Mapa de mapas
- Tamaño máximo: 100
- Descripción: Un mapa de las entradas del flujo de trabajo que acepta el flujo de trabajo.
- Ejemplo:
workflowInputs: myInput1: type: String myInput2: type: Number defaultValue: 42workflowInputs.<inputName>(Obligatorio)- Tipo: Cadena (que se ajusta al patrón seguro para expresiones)
- Longitud mínima: 1
- Longitud máxima: 50
- Descripción: El nombre de la entrada del flujo de trabajo.
workflowInputs.<inputName>.type(Obligatorio)- Tipo: Enumeración (Booleano, Lista, Mapa, Cadena, Entero, flotante)
- Descripción: El tipo de datos de la entrada del flujo de trabajo.
workflowInputs.<inputName>.defaultValue(Opcional)- Tipo: Cualquiera; debe ajustar a
type. - Descripción: El valor predeterminado para la entrada del flujo de trabajo.
- Tipo: Cualquiera; debe ajustar a
pasos (Obligatorios)
- Tipo: matriz de mapas
- Descripción: Los pasos a realizar cuando se ejecuta la definición del flujo de trabajo. Debe haber al menos un paso.
Importante
Los pasos se ejecutarán en el orden en que están definidos en la matriz
steps.Si se desea un orden diferente, se puede realizar un “salto” configurando la propiedad
steps[*].nextcon el nombre del paso al que se desea saltar.steps[*].name(Obligatorio)- Tipo: Cadena (que se ajusta al patrón seguro para expresiones; no puede ser
end) - Longitud máxima: 100
- Descripción: El nombre del paso al que hará referencia
steps[*].next. No pueden ser las palabras clave especialesend,continueobreak, ya que estas se emplean para indicar un paso de terminación, una continuación de un bucle o para salir de un bucle.
- Tipo: Cadena (que se ajusta al patrón seguro para expresiones; no puede ser
steps[*].type(Obligatorio)- Tipo: Cadena
- Descripción: El tipo de paso, que indica qué hace el paso cuando se ejecuta. Consulte la sección Tipos de pasos para conocer las opciones disponibles.
steps[*].next(Opcional)Tipo: Cadena (que se ajusta al patrón seguro para expresiones)
Descripción:
- El nombre del siguiente paso a ejecutar cuando este paso se complete correctamente. La palabra clave especial
endse puede emplear para indicar que este paso debe ser el último en ejecutar. - Si se omite
next, se empleará la siguiente entrada en la matrizstepsde la definición como el siguiente paso implícito. Si no hay ninguna entrada siguiente, el flujo de trabajo se completará.
- El nombre del siguiente paso a ejecutar cuando este paso se complete correctamente. La palabra clave especial
Tipos de pasos
acción
Un paso que ejecuta una acción específica. Consulte el Catálogo de Acciones para conocer las opciones disponibles.
steps[*].action(Obligatorio)Tipo: Cadena
Descripción: El nombre completo de la función de acción que se va a ejecutar. Deberá seguir la siguiente convención:
<company domain>.<category of work>.<action name in camelCase>Ejemplo:
- Acción que emplea los servicios de New Relic (por ejemplo, a través de NerdGraph):
newrelic.dashboards.getDashboard - Acción mediante Slack:
slack.chat.postMessage
- Acción que emplea los servicios de New Relic (por ejemplo, a través de NerdGraph):
steps[*].version(Obligatorio)- Tipo: Cadena
- Descripción: La versión de la función de acción que se va a ejecutar.
steps[*].inputs(Opcional)Tipo: Mapa de valores (incluye expresiones)
Descripción:
- Los datos de entrada que se pasarán a la función de acción. Las entradas específicas aceptadas se definen para cada acción.
- Las entradas pueden emplear expresiones. Consulte la sección Cadenas de expresiones para obtener más detalles.
Importante
No se deben pasar datos sensibles (ni claves de API ni secretos, ni PII, PHI ni ningún dato de identificación personal) como argumentos.
steps[*].inputs.selectors(Opcional)Tipo: lista de mapas en la forma
nameconexpression.Descripción:
- La entrada
selectorspermite redefinir la salida para que solo devuelva los elementos especificados. - Se puede emplear la expresión. Consulte la sección Cadenas de expresiones para obtener más detalles.
- La entrada
Ejemplo
- En el ejemplo dado, estamos obteniendo
pageUrlystatusDescriptioncomo respuesta de la acción http.get.
name: statusdescription: A workflow for checking the status of New Relic componentssteps:- name: query1type: actionaction: http.getversion: 1inputs:url: "https://status.newrelic.com/api/v2/status.json"selectors:- name: statusCodeexpression: '.statusCode'- name: pageUrlexpression: '.responseBody | fromjson | .page.url'- name: statusDescriptionexpression: '.responseBody | fromjson | .status.description'- name: logOutput1type: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "status is '${{ .steps.query1.outputs.statusDescription }}' details at ${{ .steps.query1.outputs.pageUrl }}"- En el ejemplo dado, estamos obteniendo
bucle
Un bucle iterará sobre una colección dada definida por in y creará variables de bucle index y element para cada una de sus iteraciones. Estas variables de bucle son accesibles dentro del bucle solo con la expresión ${{ .steps.<loopStepName>.loop.element }} o ${{ .steps.<loopStepName>.loop.index }
Para más detalles, consulte a continuación:
steps[*].for(Obligatorio)- Tipo: constante
- Descripción: Señal de inicio de un bucle
steps[*].in(Obligatorio)Tipo: cadena (expresión)
Descripción: Una expresión que debe evaluar como una colección de elementos.
steps[*].steps(Opcional)Descripción: Pasos a ejecutar en cada iteración del bucle. Consulte la definición para ver los pasos anteriores.
Ejemplo:
name: myWorkflowsteps:- name: loopSteptype: loopfor:in: "${{ [range(1; 5)] }}""steps:- name: step1type: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "Loop: ${{ .steps.loopStep.loop.element }}"
cambiar
Un paso que comprueba varias condiciones y toma la primera rama que se evalúa como verdadera.
Un interruptor puede contener cualquier número de elementos de condición en una lista. Comprobará las condiciones en orden y procesará la primera que se evalúe como verdadera. Si ninguna se evalúa como verdadera, ejecutará su siguiente paso como se define en steps[*].next
steps[*].switch(Obligatorio)- Tipo: matriz
- Descripción: Una matriz de casos switch, que especifica la lista ordenada de condiciones a evaluar.
steps[*].switch[*].condition(Obligatorio)- Tipo: cadena (expresión)
- Descripción: Estado de la carcasa del interruptor. Si la evaluación es verdadera, se ejecutará el siguiente paso del caso.
steps[*].switch[*].next(Obligatorio)- Tipo: cadena (que se ajusta al patrón seguro para expresiones)
- Descripción: El nombre del paso a ejecutar si la condición del caso se evalúa como verdadera. La palabra clave especial "end" puede emplear para indicar que este paso debe ser el último en ejecutar.
- name: hasCompletedtype: switchswitch:- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Failed" }}next: displayError- condition: ${{ .steps.waitForCompletion.outputs.automationExecutionStatus == "Success" }}next: displaySuccessnext: displayUnexpected
esperar
Un paso que hace que el flujo de trabajo espere un cierto número de segundos antes de continuar. También puede escuchar una o más señales. Si no se recibe ninguna señal durante la espera, continuará con normalidad. Las señales se definen en una lista. Cada señal debe tener definido un siguiente paso correspondiente. La primera señal que se reciba será la que se procese. El valor recibido para la señal se almacenará en la salida del paso de espera y podrá emplear para el procesamiento lógico en pasos posteriores.
Ejemplo:
name: waitSignalExampleworkflowInputs:steps:- name: waitSteptype: waitseconds: 300signals: [{name: 'mySignalName', next: 'firstStep'}]- name: endSteptype: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: "didn't get signal"next: end- name: firstSteptype: actionaction: newrelic.ingest.sendLogsversion: 1inputs:logs:- message: ${{ .steps.waitStep.outputs.signalInputs.myString }}steps[*].seconds(Obligatorio)- Tipo: número
- Descripción: Número de segundos que se deben esperar antes de continuar con la ejecución del flujo de trabajo.
steps[*].signals- Tipo: matriz
- Descripción: Las señales que, al ser recibidas, desviarán el flujo del programa.
steps[*].signals[*].name- Tipo: cadena
- Descripción: El nombre de la señal que se debe escuchar.
steps[*].signals[*].next- Tipo: cadena
- Descripción: Paso a ejecutar si se recibe la señal especificada.
Tipos compartidos
Cadenas de expresión
Varias propiedades aceptan valores de cadena con expresiones incrustadas que se evalúan durante la ejecución del flujo de trabajo, lo que permite emplear valores dinámicos dentro de las definiciones del flujo de trabajo. Las cadenas de expresión pueden contener una o varias expresiones, cada una de las cuales está encerrada entre llaves dobles. El contenido dentro de las llaves se evalúa usando jq.
jq proporciona la capacidad de acceder y operar con valores de muchas maneras. Por ejemplo, la longitud de una cadena de entrada de flujo de trabajo podría lograr con lo siguiente: ${{ .workflowInputs.myString | length }}
Esta herramienta se puede emplear para construir y probar expresiones JQ.
Propiedades de expresión
Se puede acceder a varias propiedades mediante expresiones. Estas propiedades residen en un objeto de “ámbito”, por lo que las expresiones deben comenzar con un punto (.) para acceder a esas propiedades del objeto de ámbito.
Las propiedades disponibles son:
workflowInputs- Objeto que contiene las entradas pasadas al flujo de trabajo al inicio.- Ejemplo:
${{ .workflowInputs.myInput }}
- Ejemplo:
steps- Objeto que contiene una propiedad para cada paso del flujo de trabajosteps.<stepName>- Objeto que contiene propiedades para un paso específicosteps.<stepName>.outputs- Objeto que contiene propiedades de resultado, específicas del paso/acción.- Ejemplo:
${{ .steps.myStep.outputs.myResult }}
- Ejemplo:
Resultados de la evaluación de la expresión
Una sola expresión jq puede evaluar como cualquier tipo JSON, pero es importante tener en cuenta que el resultado final de una cadena de expresión completa dependerá del contenido de la cadena (si la hay) que rodea a la(s) expresión(es).
Si la totalidad de una cadena de expresión consiste en una sola expresión, entonces se evaluará al resultado de la expresión jq, manteniendo el tipo JSON del resultado. Por ejemplo, si a un flujo de trabajo se le pasa una matriz como entrada, la cadena ${{ .workflowInputs.myArray }} se evaluaría como una matriz. Esto puede resultar útil para transmitir datos complejos dentro de un flujo de trabajo.
Si la cadena de expresión contiene contenido distinto de una única expresión, se evaluará como un resultado de cadena. Por ejemplo, esto ocurre cuando una expresión tiene contenido antes o después, o si la cadena contiene varias expresiones. Cada expresión dentro de la cadena se evalúa y se convierte a una representación de cadena.
Ejemplo:
Para los siguientes ejemplos, suponga que myArray tiene un valor de [1, 2, 3].
Cadena de expresión | Datos de resultados | Tipo de resultado |
|---|---|---|
| [1, 2, 3] | matriz de números |
| 3 | número |
| verdadero | booleano |
| "La entrada no está vacía: verdadero" | cadena |
| "tiene una longitud de 3" | cadena |
Patrón seguro para expresiones
Las propiedades que se pueden emplear en expresiones deben ajustar a la siguiente expresión regular: ^[A-Za-z_][A-Za-z0-9_]*$
Referencias secretas
Los valores secretos se pueden usar en acciones a través de cadenas de referencia que especifican el nombre de un secreto que se buscará en el Servicio de Secretos. Para hacer referencia a un secreto en una definición de flujo de trabajo, emplee la siguiente sintaxis:
${{ :secrets:<SECRET_NAME> }}para un secreto que no está en unnamespace${{ :secrets:<NAMESPACE>:<SECRET_NAME> }}para un secreto en unnamespace
Una cadena de expresión puede contener una mezcla de referencias secretas y expresiones JQ y/o múltiples referencias secretas.
Ejemplos:
steps: - name: bearer_auth type: action action: http.post inputs: headers: Authorization: Bearer ${{ :secrets:<SECRET_NAME> }}Ejemplos
- Hola Mundo
name: helloWorlddescription: 'A hello world workflow'
workflowInputs: name: type: String defaultValue: World required: false validations: - type: maxLength errorMessage: "name must be at most 100 characters" length: 100 slackTokenSecret: type: String defaultValue: "${{ :secrets:SLACK_TOKEN }}" slackChannel: type: String defaultValue: my-channel validations: - type: regex errorMessage: "A slack channel name must be lowercase and can only contain letters, numbers, and hyphens" pattern: "^[a-z0-9\\-]+$" required: true
steps: - name: init1 type: assign inputs: greeting: Hello ${{ .workflowInputs.name }}
- name: logName type: action action: newrelic.ingest.sendLogs version: 1 inputs: logs: - message: ${{ .steps.init1.outputs.greeting }}
- name: waiting1 type: wait seconds: 1
- name: queryForLog type: action action: newrelic.nrdb.query version: 1 inputs: query: >- FROM Log SELECT * WHERE message LIKE '${{ .steps.init1.outputs.greeting }}'
- name: checkResult type: switch switch: - condition: ${{ .steps.queryForLog.outputs.results | length > 0 }} next: FoundMessage
- name: waitingMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: ${{ .workflowInputs.slackChannel }} text: Waiting for log message... token: ${{ .workflowInputs.slackTokenSecret }} next: waiting1
- name: FoundMessage type: action action: slack.chat.postMessage version: 1 inputs: channel: ${{ .workflowInputs.slackChannel }} text: Found message! ${{ .steps.queryForLog.outputs.results[0].message }} token: ${{ .workflowInputs.slackTokenSecret }}