Creación y adición de una acción personalizada en CodePipeline
AWS CodePipeline incluye una serie de acciones que le ayudarán a configurar recursos de compilación, pruebas e implementación para el proceso de lanzamiento automatizado. Si su proceso de lanzamiento incluye actividades que no figuran en las acciones predeterminadas, como un proceso de creación desarrollado internamente o un conjunto de pruebas, puede crear una acción personalizada para esas actividades e incluirla en su canalización. Puede utilizar la AWS CLI para crear acciones personalizadas en canalizaciones asociadas a su cuenta de AWS.
Puede crear acciones personalizadas para las siguientes categorías de la acción AWS CodePipeline:
-
Una acción de creación personalizada que crea o transforma los elementos
-
Una acción de implementación personalizada que implementa elementos en uno o varios servidores, sitios web o repositorios
-
Una acción de prueba personalizada que configura y ejecuta pruebas automáticas
-
Una acción de invocación personalizada que ejecuta funciones
Al crear una CodePipeline, debe crear también un proceso de trabajo que sondeará para ver si hay solicitudes de trabajo para esta , ejecutará el trabajo y devolverá el resultado del estado a CodePipeline. Este proceso de trabajo puede estar ubicado en cualquier equipo o recurso que tenga acceso al punto de conexión público de CodePipeline. Para administrar el acceso y la seguridad fácilmente, sopese alojar su proceso de trabajo en una instancia de Amazon EC2.
Este diagrama ofrece una perspectiva de una canalización con una acción personalizada de creación:
Si una canalización incluye una acción personalizada en una etapa, la canalización creará una solicitud de trabajo. Un proceso de trabajo personalizado detectará esa solicitud y realizará el trabajo (en este ejemplo, un proceso personalizado que utiliza software de creación de terceros). Una vez realizada la acción, el proceso de trabajo devuelve un resultado que indica si el proceso se ha completado correctamente. Si se ha completado correctamente, la canalización proporcionará la revisión y sus artefactos a la siguiente acción. Si no se ha completado correctamente, la canalización no proporcionará a la revisión a la siguiente acción en la canalización.
nota
En estas instrucciones, se presupone que ya ha completado los pasos que se detallan en Introducción a CodePipeline.
Temas
Crear una acción personalizada
Para crear una acción personalizada con la AWS CLI
-
Abra un editor de texto y cree un archivo JSON para la acción personalizada que incluye la categoría de acción, el proveedor de la acción y cualquier configuración que requiera la acción del cliente. Por ejemplo, para crear una acción de compilación personalizada que requiera solo una propiedad, el archivo JSON podría tener este aspecto:
{ "category": "Build", "provider": "My-Build-Provider-Name", "version": "1", "settings": { "entityUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/", "executionUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/lastSuccessfulBuild/{ExternalExecutionId}/" }, "configurationProperties": [{ "name": "ProjectName", "required": true, "key": true, "secret": false, "queryable": false, "description": "The name of the build project must be provided when this action is added to the pipeline.", "type": "String" }], "inputArtifactDetails": { "maximumCount":integer, "minimumCount":integer}, "outputArtifactDetails": { "maximumCount":integer, "minimumCount":integer}, "tags": [{ "key": "Project", "value": "ProjectA" }] }Este ejemplo añade el etiquetado a la acción personalizada incluyendo la clave de etiqueta
Projecty el valorProjectAa la acción personalizada. Para obtener más información acerca del etiquetado de recursos de CodePipeline, consulte Etiquetado de recursos.El archivo JSON incluye dos propiedades,
entityUrlTemplateyexecutionUrlTemplate. Puede consultar un nombre en las propiedades de configuración de la acción personalizada dentro de las plantillas URL si sigue el formato de{Config:, siempre y cuando la propiedad de configuración sea obligatoria y no sea secreta. Poe ejemplo, en el ejemplo anterior, el valorname}entityUrlTemplatehace referencia a la propiedad de configuraciónProjectName.-
entityUrlTemplate: el enlace estático que proporciona información acerca del proveedor de servicios de la acción. En el ejemplo, el sistema de compilación incluye un enlace estático a cada proyecto de compilación. El formato del enlace variará según su proveedor de compilación (o bien, si crea un tipo de acción diferente, como una prueba, otro proveedor de servicios). Debe proporcionar este formato de enlace para que cuando se añada la acción del cliente, el usuario pueda elegir este enlace para abrir un explorador en una página de su sitio web que proporcione la información específica del proyecto de compilación (o entorno de prueba). -
executionUrlTemplate: el enlace dinámico que se actualizará con información acerca de la ejecución actual o más reciente de la acción. Cuando el empleado de trabajo personalizado actualiza el estado de este (por ejemplo, se ha realizado correctamente, error o en progreso), también proporcionará unexternalExecutionIdque se usará para completar el enlace. Este enlace se puede usar para proporcionar detalles acerca de la ejecución de una acción.
Por ejemplo, al ver la acción en la canalización, verá los siguientes dos enlaces:
Este enlace estático aparece después de añadir su acción personalizada y apunta a la dirección en entityUrlTemplate, la que especifica al crear su acción personalizada.
Este enlace dinámico se actualiza después de cada ejecución de la acción y apunta a la dirección en executionUrlTemplate, la que especifica al crear su acción personalizada.Para obtener más información acerca de estos tipos de enlaces, así como
RevisionURLTemplateyThirdPartyURL, consulte ActionTypeSettings y CreateCustomActionType en la CodePipeline API Reference. Para obtener más información acerca de los requisitos de estructura de acción y cómo crear una acción, consulte Referencia de estructura de canalización de CodePipeline. -
-
Guarde el archivo JSON y asígnele un nombre que pueda recordar fácilmente (por ejemplo,
MyCustomAction.json). -
Abra una sesión de terminal (Linux, OS X, Unix) o el símbolo del sistema (Windows) en un equipo en el que haya instalado la AWS CLI.
-
Use AWS CLI para ejecutar el comando aws codepipeline create-custom-action-type especificando el nombre del archivo JSON que acaba de crear.
Por ejemplo, para crear una acción personalizada de compilación:
importante
Asegúrese de incluir
file://antes del nombre de archivo. Es obligatorio en este comando.aws codepipeline create-custom-action-type --cli-input-json file://MyCustomAction.json -
Este comando devuelve toda la estructura de la acción personalizada que ha creado, así como la propiedad de configuración de la acción
JobList, que ya se ha añadido. Al añadir una acción personalizada a una canalización, puede usarJobListpara especificar los proyectos del proveedor que puede sondear en búsqueda de trabajos. Si no configura esto, todos los trabajos disponibles se devolverán cuando el empleado de trabajo personalizado sondee trabajos.Por ejemplo, el comando anterior podría devolver una estructura similar a la siguiente:
{ "actionType": { "inputArtifactDetails": { "maximumCount": 1, "minimumCount": 1 }, "actionConfigurationProperties": [ { "secret": false, "required": true, "name": "ProjectName", "key": true, "description": "The name of the build project must be provided when this action is added to the pipeline." } ], "outputArtifactDetails": { "maximumCount": 0, "minimumCount": 0 }, "id": { "category": "Build", "owner": "Custom", "version": "1", "provider": "My-Build-Provider-Name" }, "settings": { "entityUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/", "executionUrlTemplate": "https://my-build-instance/job/mybuildjob/lastSuccessfulBuild/{ExternalExecutionId}/" } } }nota
Como parte de la salida del comando create-custom-action-type, la sección
idincluye"owner": "Custom". CodePipeline asigna automáticamenteCustomcomo propietario de los tipos de acciones personalizadas. Este valor no se puede asignar ni cambiar cuando usa el comando create-custom-action-type o el comando update-pipeline.
Crear un proceso de trabajo para la acción personalizada
Las acciones personalizadas requieren un proceso de trabajo que sondeará CodePipeline para ver si hay solicitudes de trabajo para la acción personalizada, ejecutará el trabajo y devolverá el resultado del estado a CodePipeline. El proceso de trabajo puede estar ubicado en cualquier equipo o recurso que tenga acceso al punto de conexión público de CodePipeline.
El proceso de trabajo se puede diseñar de muchas formas. En las secciones siguientes se ofrecen orientaciones prácticas para desarrollar un proceso de trabajo personalizado para CodePipeline.
Temas
Elegir y configurar una estrategia de administración de permisos para el proceso de trabajo
Para desarrollar un proceso de trabajo personalizado para una acción personalizada en CodePipeline, necesitará una estrategia que permita integrar la administración de usuarios y permisos.
La estrategia más sencilla es añadir la infraestructura que necesita para el proceso de trabajo personalizado creando instancias de Amazon EC2 con un rol de instancia de Amazon EC2. Esto le permite ampliar fácilmente los recursos que necesite para la integración. Puede utilizar la integración incluida en AWS para simplificar la interacción entre el proceso de trabajo personalizado y CodePipeline.
Para configurar instancias de Amazon EC2
-
Obtenga más información acerca de Amazon EC2 y determine si es la opción correcta para su integración. Para más información, consulte Amazon EC2 - Alojamiento de servidores virtuales
. -
Comience a crear sus instancias de Amazon EC2. Para obtener información, consulte Introducción a instancias de Linux con Amazon EC2.
Otra estrategia que puede considerar es utilizar federación de identidades con IAM para integrar los recursos y el sistema de proveedor de identidad que ya tiene. Esta estrategia resulta particularmente útil si ya tiene un proveedor de identidad corporativo o una configuración que admita usuarios que utilicen proveedores de identidad web. La federación de identidades le permite garantizar un acceso seguro a los recursos de AWS, incluido CodePipeline, sin necesidad de crear o administrar usuarios de IAM. Puede utilizar características y políticas sobre los requisitos de seguridad de contraseñas y la rotación de credenciales. Puede utilizar aplicaciones de ejemplo como plantillas para su propio diseño.
Para configurar la identidad federada
-
Obtenga más información acerca de la federación de identidades de IAM. Para obtener información, consulte Administrar federación
. -
Revise los ejemplos en Escenarios para conceder acceso temporal para identificar el escenario de acceso temporal que mejor se adapte a las necesidades de su acción personalizada.
-
Revise los ejemplos de códigos de identidad federada pertinentes a su infraestructura, como:
-
Comience a configurar una identidad federada. Para obtener información, consulte Federación y proveedores de identidades en la Guía de usuarios de IAM.
Cree una de las siguientes opciones para utilizarla bajo su Cuenta de AWS al ejecutar su acción personalizada y su proceso de trabajo.
Los usuarios necesitan acceso programático si desean interactuar con AWS fuera de la Consola de administración de AWS. La forma de conceder el acceso programático depende del tipo de usuario que acceda a AWS.
Para conceder acceso programático a los usuarios, seleccione una de las siguientes opciones.
| ¿Qué usuario necesita acceso programático? | Para | Mediante |
|---|---|---|
|
Identidad del personal (Usuarios administrados en el IAM Identity Center) |
Utiliza credenciales temporales para firmar las solicitudes programáticas a la AWS CLI, los AWS SDK y las API de AWS. |
Siga las instrucciones de la interfaz que desea utilizar:
|
| IAM | Utiliza credenciales temporales para firmar las solicitudes programáticas a la AWS CLI, los AWS SDK y las API de AWS. | Siguiendo las instrucciones de Uso de credenciales temporales con recursos de AWS de la Guía del usuario de IAM. |
| IAM | (No recomendado) Utilizar credenciales a largo plazo para firmar las solicitudes programáticas a la AWS CLI, los AWS SDK o las API de AWS. |
Siga las instrucciones de la interfaz que desea utilizar:
|
A continuación se muestra una política de ejemplo que puede crear para utilizarla con un proceso de trabajo personalizado. Esta política es solo un ejemplo y se ofrece "tal cual".
nota
Plantéese utilizar la política administrada AWSCodePipelineCustomActionAccess.
Desarrollar un proceso de trabajo para una acción personalizada
Una vez elegida la estrategia de administración de permisos, debería plantearse cómo va a interactuar el proceso de trabajo con CodePipeline. El siguiente diagrama muestra un flujo de trabajo de una acción personalizada y el proceso de trabajo de un proceso de creación.
-
Su proceso de trabajo sondea a CodePipeline para ver si hay trabajos utilizando
PollForJobs. -
Cuando se activa una canalización debido a un cambio en su etapa de código fuente (por ejemplo, cuando un desarrollador confirma un cambio), se inicia el proceso de lanzamiento automático. Este proceso sigue hasta la etapa en la que se ha configurado la acción personalizada. Cuando llega a la acción en esta etapa, CodePipeline pone un trabajo en cola. El trabajo aparecerá si el proceso de trabajo invoca realiza una llamada
PollForJobsde nuevo para obtener el estado. Tome los detalles del trabajo dePollForJobsy páselos de nuevo al proceso de trabajo. -
El proceso de trabajo llama a
AcknowledgeJobpara enviar a CodePipeline un acuse de recibo de trabajo. CodePipeline devuelve una confirmación en la que se indica que el proceso de trabajo debería proseguir el trabajo (InProgress) o, si hay varios procesos de trabajo sondeando y uno de ellos ya ha reclamado el trabajo, devuelve una respuesta de errorInvalidNonceException. Después de la confirmaciónInProgress, CodePipeline espera a que se devuelvan resultados. -
El proceso de trabajo inicia la acción personalizada en la revisión y después se ejecuta la acción. Junto con otras acciones, la acción personalizada devuelve un resultado al proceso de trabajo. En el ejemplo de una acción personalizada de creación, la acción obtiene artefactos del bucket de Amazon S3, los compila y transmite artefactos compilados correctamente al bucket de Amazon S3.
-
Mientras se ejecuta la acción, el proceso de trabajo puede llamar a
PutJobSuccessResultcon un token de continuación (la serialización del estado del trabajo generada por el proceso de trabajo; por ejemplo, un identificador de compilación en formato JSON o una clave de objeto de Amazon S3) y también a la información deExternalExecutionId, que se usará para rellenar el enlace deexecutionUrlTemplate. Esto añadirá en la vista de la canalización en la consola un enlace de trabajo a los detalles de una acción mientras se está realizando. Aunque no es obligatorio, resulta conveniente hacerlo porque de este modo los usuarios ven el estado de la acción personalizada mientras se ejecuta.En cuanto se ha llamado a
PutJobSuccessResult, se considera que el trabajo se ha completado. Se crea un nuevo trabajo en CodePipeline que incluye el token de continuación. Este trabajo aparecerá si el proceso de trabajo realiza de nuevo una llamadaPollForJobs. El nuevo trabajo se puede usar para comprobar el estado de la acción: devolverá un token de continuación o, si la acción está completada, no lo devolverá.nota
Si el proceso de trabajo realiza todo el trabajo de la acción personalizada, debería plantearse dividirlo en por lo menos dos pasos. En el primer paso se establece la página de detalles de la acción. En cuanto haya creado la página de detalles, puede serializar el estado del proceso de trabajo y devolverlo como un token de continuación, cumpliendo los límites de tamaño (consulte Cuotas en AWS CodePipeline). Por ejemplo, podría escribir el estado de la acción en la cadena que utiliza como token de continuación. En el segundo paso (y los subsiguientes) del proceso de trabajo serían en los que se realizaría la tarea de la acción. En el paso final se enviaría a CodePipeline información de si el proceso se ha realizado correctamente, sin token de continuación.
Para obtener más información sobre el token de continuación, consulte las especificaciones de
PutJobSuccessResulten la CodePipeline API Reference. -
En cuanto se completa la acción personalizada, el proceso de trabajo devuelve el resultado de la acción personalizada a CodePipeline llamando a una de estas dos API:
-
PutJobSuccessResultsin token de continuación, que indica que la acción personalizada se realizó correctamente -
PutJobFailureResult, que indica que la acción personalizada no se realizó correctamente
En función del resultado, la canalización proseguirá con la siguiente acción (si se ha realizado correctamente) o se detendrá (si no se ha realizado correctamente).
-
Arquitectura y ejemplos de procesos de trabajo personalizados
Una vez planificado el flujo general de trabajo, puede crear el proceso de trabajo. Los detalles de la acción personalizada determinan en última instancia lo que va a necesitar para el proceso de trabajo. La mayoría de los procesos para acciones personalizadas incluyen las funcionalidades siguientes:
-
Sondear si hay trabajos en CodePipeline utilizando
PollForJobs. -
Reconocer trabajos y devolver resultados a CodePipeline usando
AcknowledgeJob,PutJobSuccessResultyPutJobFailureResult. -
Recuperar artefactos o insertarlos en el bucket de Amazon S3 de la canalización. Para descargar artefactos del bucket de Amazon S3 debe crear un cliente de Amazon S3 que utilice la versión 4 de Signature (Sig V4). Sig V4 es necesario para AWS KMS.
Para cargar artefactos al bucket de Amazon S3 deberá configurar la solicitud
PutObjectde Amazon S3 para que use el cifrado. Actualmente, solo se admite AWS Key Management Service (AWS KMS) para el cifrado. AWS KMS usa AWS KMS keys. Para saber si se debe utilizar una Clave administrada de AWS o una clave administrada por el cliente para cargar artefactos, el proceso de trabajo personalizado debe consultar los datos del trabajo y comprobar la propiedad de la clave de cifrado. Si está establecida la propiedad, debe utilizar ese identificador clave administrado por el cliente al realizar la configuración de AWS KMS. Si la propiedad de clave es nula, se utiliza la Clave administrada de AWS. CodePipeline usa la Clave administrada de AWS a menos que se configure de otra manera.Para ver un ejemplo que muestra cómo crear los parámetros de AWS KMS en Java o.NET, consulte Especificación de AWS Key Management Service en Amazon S3 mediante los AWS SDK. Para obtener más información acerca del bucket de Amazon S3 para CodePipeline, consulte Conceptos de CodePipeline.
Puede ver un ejemplo más complejo de un proceso de trabajo personalizado en GitHub. El ejemplo es de código abierto y se proporciona "tal cual".
-
Proceso de trabajo de muestra de CodePipeline
: descargar el ejemplo del repositorio de GitHub.
Agregar una acción personalizada a una canalización
Si ya tiene un proceso de trabajo, puede añadir una acción personalizada a una canalización creando otro proceso y eligiéndolo en el asistente Create pipeline. Para ello, edite una canalización y añada la acción personalizada o use la AWS CLI, los SDK o las API.
nota
Puede crear una canalización con el asistente Crear canalización que incluya una acción personalizada si es una acción de compilación o implementación. Si la acción personalizada figura en la categoría de pruebas, debe añadirla modificando una canalización existente.
Agregar una acción personalizada a una canalización existente (CLI)
Puede usar la AWS CLI para añadir una acción personalizada a una canalización.
-
Abra una sesión de terminal (Linux, macOS, or Unix) o el símbolo del sistema (Windows) y ejecute el comando get-pipeline para copiar la estructura de canalización que desee editar en un archivo JSON. Por ejemplo, para una canalización denominada
MyFirstPipeline, debería escribir el siguiente comando:aws codepipeline get-pipeline --nameMyFirstPipeline>pipeline.jsonEste comando no devuelve nada, pero el archivo creado debería aparecer en el directorio en el que se ejecutó el comando.
-
Abra el archivo JSON en cualquier editor de texto y modifique la estructura del archivo para añadir su acción personalizada a la etapa existente.
nota
Si desea que su acción se ejecute en paralelo con otra acción en esa etapa, asegúrese de asignarla al mismo valor de
runOrderque esa acción.Por ejemplo, para modificar la estructura de una canalización que permita añadir una etapa denominada Build y añadir una acción personalizada de compilación a esa etapa, es posible modificar el JSON para añadir la etapa Build antes de una etapa de implementación de la siguiente manera:
, { "name": "MyBuildStage", "actions": [ { "inputArtifacts": [ { "name": "MyApp" } ], "name": "MyBuildCustomAction", "actionTypeId": { "category": "Build", "owner": "Custom", "version": "1", "provider": "My-Build-Provider-Name" }, "outputArtifacts": [ { "name": "MyBuiltApp" } ], "configuration": { "ProjectName": "MyBuildProject" }, "runOrder": 1 } ] }, { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyBuiltApp" } ], "name": "Deploy-CodeDeploy-Application", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "CodePipelineDemoApplication", "DeploymentGroupName": "CodePipelineDemoFleet" }, "runOrder": 1 } ] }] } -
Para aplicar los cambios, ejecute el comando update-pipeline, especificando el archivo JSON de la canalización, de forma similar a como se muestra a continuación:
importante
Asegúrese de incluir
file://antes del nombre de archivo. Es obligatorio en este comando.aws codepipeline update-pipeline --cli-input-json file://pipeline.jsonEste comando devuelve la estructura completa de la canalización editada.
-
Abra la consola de CodePipeline y elija el nombre de la canalización que acaba de editar.
La canalización muestra los cambios. La próxima vez que haga un cambio en la ubicación de código fuente, la canalización ejecutará dicha revisión a través de la estructura revisada de la canalización.