Implementar ImageLabeller con Bitbucket
Warren Marusiak
Divulgador técnico sénior
Para demostrar cómo desarrollar, implementar y gestionar aplicaciones con Jira Software y varias herramientas conectadas, nuestro equipo creó ImageLabeller, una sencilla aplicación de demostración creada con AWS que utiliza el aprendizaje automático para aplicar etiquetas a las imágenes.
Esta página explica cómo implementar ImageLabeller con Bitbucket. Antes de empezar, te recomendamos que leas las páginas de arquitectura de ImageLabeller y de configuración de AWS SageMaker para ver el contexto.
Requisitos previos
Si aún no tienes SSH configurado para tu cuenta de Bitbucket, sigue estas instrucciones.
Repositorios de GitHub orientados al público con código ImageLabeller
Vídeo de demostración de Bitbucket Pipelines
Crear un repositorio para la infraestructura de AWS S3
Un ciclo de desarrollo estándar normalmente hace que un desarrollador retome una tarea de Jira, la mueva al trabajo en curso y, a continuación, complete el trabajo de desarrollo. El identificador de la incidencia de Jira es la clave que vincula el trabajo de desarrollo con la incidencia de Jira. Es el componente principal de integración entre los dos sistemas.
Desde Jira, crea una nueva incidencia para añadir un repositorio de infraestructura de AWS S3 a GitHub. Toma nota del identificador de la incidencia. En este ejemplo es IM-5.
Ve a Bitbucket > Crear > Repositorio.
Selecciona el espacio de trabajo y el proyecto adecuados. Configura el nombre de la rama predeterminada en la rama principal. Haz clic en Crear repositorio para continuar.
En tu terminal, ve al repositorio de s3_infra y ejecuta lo siguiente para enviar tu archivo AWS CloudFormation template.yml a Bitbucket.
git add --all
git commit -m "IM-5 add s3_infra repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/s3_infra.git
git branch -m mainline
git push -u origin mainline
Activar Bitbucket Pipelines
Ve a Configuración del repositorio > Configuración > Habilitar Pipelines.
Añadir una clave de acceso de AWS a las variables del repositorio
Ve a Variables del repositorio, introduce el identificador de tu clave de acceso de AWS y haz clic en Añadir. A continuación, introduce tu clave de acceso secreta de AWS y haz clic en Añadir.
Configurar entornos de implementación
Haz clic en Implementaciones.
Haz clic en Añadir entorno para añadir nuevos entornos. Hay un entorno de pruebas en US-WEST-1, un entorno de ensayo en US-EAST-2 y tres entornos de producción en US-WEST-2, US-EAST-1 y CA-CENTRAL-1 en este ejemplo.
bitbucket-pipelines.yml para implementar en AWS
Ve al repositorio de s3_infra de tu terminal y crea una rama con el nombre de tu identificador de incidencia de Jira.
git checkout -b IM-5
Crea un archivo bitbucket-pipelines.yml con el siguiente yaml. Esto define un flujo de trabajo de implementación para tus entornos de pruebas, ensayo y producción.
definitions:
steps:
- step: &deploy-test-usw1
name: Deploy Test us-west-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-staging-use2
name: Deploy Staging us-east-2
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-2'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-production-usw2
name: Deploy Production us-west-2
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-production-use1
name: Deploy Production us-east-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
- step: &deploy-production-cac1
name: Deploy Production ca-central-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'ca-central-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
pipelines:
default:
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
branches:
mainline:
- step:
<<: *deploy-production-usw2
deployment: Production us-west-2
- step:
<<: *deploy-production-use1
deployment: Production us-east-1
- step:
<<: *deploy-production-cac1
deployment: Production ca-central-1
Entender un archivo bitbucket-pipelines.yml
Definiciones y pasos
Define un conjunto de pasos en la sección de definiciones. Cada paso tiene un alias al que se hace referencia en todo el archivo bitbucket-pipelines.yml, un nombre que aparece en la pantalla de implementación de Bitbucket y un guion. Un guion es una colección de uno o más comandos.
definitions:
steps:
- step: &deploy-test-usw1
name: Deploy Test us-west-1
script:
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsS3Infra'
CAPABILITIES: ['CAPABILITY_IAM', 'CAPABILITY_AUTO_EXPAND']
WAIT: 'true'
TEMPLATE: 'template.yml'
Pipes
Este paso utiliza el canal atlassian/aws-cloudformation-deploy
para implementar los compartimentos de AWS S3 definidos en el archivo s3_infra template.yml.
- pipe: atlassian/aws-cloudformation-deploy:0.10.0
El conjunto de canales disponibles se encuentra aquí. La documentación de la canalización atlassian/aws-cloudformation-deploy
se encuentra aquí.
Pipelines
Las canalizaciones ejecutan una serie de pasos. La canalización predeterminada es el conjunto de pasos que se ejecuta para las ramas que no tienen un nombre explícito en las canalizaciones. Esta canalización predeterminada ejecuta los pasos que se implementan en los entornos de pruebas y ensayo.
pipelines:
default:
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
Las implementaciones permiten la integración entre Jira y Bitbucket.
deployment: Test us-west-1
Puedes definir un conjunto de pasos que se ejecuten para una rama específica, llamada "rama debajo de las ramas". El siguiente fragmento de código define un conjunto de pasos para la rama principal.
branches:
mainline:
- step:
<<: *deploy-production-usw2
deployment: Production us-west-2
- step:
<<: *deploy-production-use1
deployment: Production us-east-1
- step:
<<: *deploy-production-cac1
deployment: Production ca-central-1
Lee este artículo de referencia para obtener más información sobre este tema.
Enviar a una rama de funciones
Ejecuta lo siguiente desde la línea de comandos para enviar los cambios a la rama IM-5 del repositorio de s3_infra. Incluye el identificador de incidencia de Jira en los mensajes de confirmación y los nombres de las ramas para que la integración de Jira con Bitbucket pueda hacer un seguimiento de lo que ocurre en tu proyecto.
git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5
Haz clic en Canalizaciones y, a continuación, en IM-5 para ver la canalización en ejecución.
Haz clic en la propia canalización para ver los detalles de la ejecución. La canalización ejecutó las etapas para implementar en un entorno de pruebas en us-west-1 y en un entorno de ensayo en us-east-2.
Crea una solicitud de incorporación de cambios
Para crear una solicitud de incorporación de cambios, haz clic en Solicitudes de incorporación de cambios y, a continuación, en Crear solicitud de incorporación de cambios.
Elige tu rama de funciones como rama de origen, marca la casilla de verificación Cerrar rama y, a continuación, haz clic en Crear solicitud de incorporación de cambios.
Revisa los cambios en el código y, a continuación, aprueba y fusiona la solicitud de incorporación de cambios.
Al hacer clic en Fusionar, se abre la pantalla de solicitudes de incorporación de cambios de fusión. Marca la casilla de verificación Mover incidencia y haz clic en Fusionar.
Haz clic en Canalizaciones para monitorizar la canalización principal.
La rama IM-5 ya no existe. La rama principal está a la izquierda y hay una canalización en ejecución. Haz clic en la canalización.
La canalización tenía etapas para su implementación en entornos de producción de us-west-2, us-east-1 y ca-central-1. Es posible volver a ejecutar una canalización haciendo clic en el botón Volver a ejecutar si una canalización falla.
Revertir una mala implementación
Para revertir una implementación, haz clic en Implementaciones.
Haz clic en el entorno al que quieres revertir para obtener una lista del historial de implementaciones, elige la versión a la que quieres revertir y, a continuación, haz clic en Volver a implementar.
Comprueba que el cambio es correcto y haz clic en Volver a implementar.
Solo se vuelve a implementar el entorno elegido.
Crear un repositorio para la AWS Lambda de SubmitImage
Ve a Jira y crea una incidencia de Jira para añadir un repositorio de SubmitImage a Bitbucket. Toma nota del identificador de la incidencia de Jira. En este ejemplo es IM-6.
Ve a Bitbucket y haz clic en Crear y, a continuación, en Repositorio.
Selecciona el espacio de trabajo y el proyecto adecuados. Configura el nombre de la rama predeterminada en la rama principal. Haz clic en Crear repositorio para continuar.
En tu terminal, ve al repositorio de SubmitImage y ejecuta lo siguiente para enviar tu código AWS Lambda a Bitbucket. Incluye el identificador de incidencia de Jira en los mensajes de confirmación y los nombres de las ramas para que la integración de Jira con Bitbucket pueda hacer un seguimiento de lo que ocurre en tu proyecto.
git add --all
git commit -m "IM-6 add SubmitImage to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/submitimage.git
git branch -m mainline
git push -u origin mainline
Habilitar Pipelines
Ve a Configuración del repositorio, haz clic en Configuración y, a continuación, en Habilitar Pipelines.
Añadir variables de repositorio
Haz clic en Variables del repositorio para añadir el identificador de la clave de acceso de AWS, la clave de acceso secreta de AWS y el identificador de cuenta de AWS. Da acceso de administrador al usuario de IAM asociado a la clave de acceso de AWS. Puedes optar por utilizar un control de acceso más detallado eligiendo políticas de acceso de AWS individuales.
Añadir entornos de implementación
Haz clic en Implementaciones y, a continuación, en Añadir entorno para añadir nuevos entornos. Hay un entorno de pruebas en us-west-1, un entorno de ensayo en us-east-2 y tres entornos de producción en us-west-2, us-east-1 y ca-central-1 en este ejemplo.
Crear claves SSH
Ve a tu repositorio de SubmitImage en Bitbucket y haz clic en Configuración del repositorio, luego en claves SSH y, a continuación, en Generar claves.
Necesitarás esta clave SSH para crear el repositorio de SystemTests.
bitbucket-pipelines.yml para implementar en AWS
Ve al repositorio de SubmitImage de tu terminal y crea una rama con el nombre de tu identificador de incidencia de Jira.
git checkout -b IM-6
Crea un archivo bitbucket-pipelines.yml con el siguiente yaml. Esto define una canalización de Bitbucket para tus entornos de pruebas, ensayo y producción. Debes actualizar la línea de clonación de git para que SystemTests sea tu repositorio de SystemTests.
definitions:
steps:
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
-step: &deploy-test-usw1
name: Deploy Test us-west-1
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-usw1
name: Integration test usw1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-1
-step: &deploy-staging-use2
name: Deploy Staging us-east-2
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-2'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-use2
name: Integration test use2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-2
-step: &deploy-production-usw2
name: Deploy Production us-west-2
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-usw2
name: Integration test usw2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-2
-step: &deploy-production-use1
name: Deploy Production us-east-1
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-1'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-use1
name: Integration test use1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-1
-step: &deploy-production-cac1
name: Deploy Production ca-central-1
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- ls -lah /opt/atlassian/pipelines/agent/build/build/
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'ca-central-1'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
-step: &integration-test-cac1
name: Integration test cac1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=ca-central-1
pipelines:
default:
- step: *rununittests
- step:
<<: *deploy-test-usw1
deployment: Test us-west-1
# - step: *integration-test-usw1
- step:
<<: *deploy-staging-use2
deployment: Staging us-east-2
# - step: *integration-test-use2
branches:
mainline:
- step:
<<: *deploy-production-usw2
deployment: Production us-west-2
# - step: *integration-test-usw2
- step:
<<: *deploy-production-use1
deployment: Production us-east-1
# - step: *integration-test-use1
- step:
<<: *deploy-production-cac1
deployment: Production ca-central-1
# - step: *integration-test-cac1
La ejecución de las pruebas de integración no admite comentarios por ahora. Las pruebas del sistema solo pasarán cuando se implemente toda la aplicación. Descomenta los pasos de la prueba de integración en tu repositorio y realiza otro envío para ejecutar la canalización de implementación una vez que se hayan implementado todos los componentes de ImageLabeller. Debes actualizar la línea de clonación de git para que SystemTests sea tu repositorio de SystemTests.
Entender un archivo bitbucket-pipelines.yml
Este paso ejecuta pruebas unitarias desde la base de código SubmitImage.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
Este paso utiliza AWS SAM para implementar tu AWS Lambda de SubmitImage en us-west-2. Puedes encontrar la documentación de esta canal aquí.
-step: &deploy-usw2-prod
name: deploy us-west-2 prod
image: amazon/aws-sam-cli-build-image-provided
script:
- curl https://dl.google.com/go/go1.16.3.linux-amd64.tar.gz -o go1.16.3.tar.gz
- rm -rf /usr/local/go
- tar -C /usr/local -xzf go1.16.3.tar.gz
- export PATH=$PATH:/usr/local/go/bin
- go version
- make
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsSubmitImage'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'build/template.yaml'
Este paso clona el repositorio de SystemTests y ejecuta pruebas de integración en us-west-2. Debes actualizar la línea de clonación de git para que SystemTests sea tu repositorio de SystemTests.
-step: &integration-test-usw2
name: Integration test usw2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-2
Enviar a una rama de funciones
Desde la línea de comandos, ejecuta lo siguiente para enviar tu código a la rama IM-8 del repositorio de SubmitImage.
git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6
Haz clic en Canalizaciones y, a continuación, en IM-6 para ver la canalización en ejecución.
Crea una solicitud de incorporación de cambios
Para crear una solicitud de incorporación de cambios, haz clic en Solicitudes de incorporación de cambios y, a continuación, en Crear solicitud de incorporación de cambios. Termina la solicitud de incorporación de cambios y haz clic en Canalizaciones para ver la implementación del entorno de producción.
Crear un repositorio para la AWS Lambda de InvokeLabeller
Ve a Jira y crea una incidencia de Jira para añadir un repositorio de InvokeLabeller a Bitbucket. Toma nota del identificador de la incidencia de Jira. En este ejemplo es IM-10.
Ve a Bitbucket y haz clic en Crear y, a continuación, en Repositorio. Selecciona el espacio de trabajo y el proyecto adecuados. Configura el nombre de la rama predeterminada en la rama principal. Haz clic en Crear repositorio para continuar.
En tu terminal, ve al repositorio de InvokeLabeller y ejecuta lo siguiente para enviar tu código AWS Lambda a Bitbucket. Incluye el identificador de incidencia de Jira en los mensajes de confirmación y los nombres de las ramas para que la integración de Jira con Bitbucket pueda hacer un seguimiento de lo que ocurre en tu proyecto.
git add --all
git commit -m "IM-10 add InvokeLabeller to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/invokelabeller.git
git branch -m mainline
git push -u origin mainline
Habilitar Pipelines
Ve a Configuración del repositorio, haz clic en Configuración y, a continuación, en Habilitar Pipelines.
Añadir variables de repositorio
Haz clic en Variables del repositorio para añadir el identificador de la clave de acceso de AWS, la clave de acceso secreta de AWS y el identificador de cuenta de AWS. Da acceso de administrador al usuario de IAM asociado a la clave de acceso de AWS. Puedes optar por utilizar un control de acceso más detallado eligiendo políticas de acceso individuales de AWS, pero los detalles dependen del lector.
Añadir entornos de implementación
Haz clic en Implementaciones y, a continuación, en Añadir entorno para añadir nuevos entornos. Hay un entorno de pruebas en us-west-1, un entorno de ensayo en us-east-2 y tres entornos de producción en us-west-2, us-east-1 y ca-central-1 en este ejemplo.
Crear claves SSH
Ve a tu repositorio de SubmitImage en Bitbucket y haz clic en Configuración del repositorio, luego en claves SSH y, a continuación, en Generar claves.
bitbucket-pipelines.yml para implementar en AWS
Ve al repositorio de InvokeLabeller de tu terminal y crea una rama con el nombre de tu identificador de incidencia de Jira.
git checkout -b IM-10
Crea un archivo bitbucket-pipelines.yml con el siguiente yaml. Esto define una canalización de Bitbucket para tus entornos de pruebas, ensayo y producción. Debes actualizar la línea de clonación de git para que SystemTests sea tu repositorio de SystemTests.
definitions:
steps:
-step: &rununittests
name: run unit tests
image: python:rc-buster
script:
- pip3 install pytest
- pip3 install moto
- pip3 install -r tst/requirements.txt --user
- python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
-step: &deploy-usw1-test
name: deploy us-west-1 test
image: amazon/aws-sam-cli-build-image-python3.8
script:
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-1'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-usw1
name: integration test usw1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-1
-step: &deploy-use2-staging
name: deploy us-east-2 staging
image: amazon/aws-sam-cli-build-image-python3.8
script:
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-2'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-use2
name: integration test use2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-2
-step: &deploy-usw2-prod
name: deploy us-west-2 prod
image: amazon/aws-sam-cli-build-image-python3.8
script:
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-west-2'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-2-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-west-2-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-usw2
name: integration test usw2
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-west-2
-step: &deploy-use1-prod
name: deploy us-east-1 prod
image: amazon/aws-sam-cli-build-image-python3.8
script:
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'us-east-1'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-east-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-us-east-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-use1
name: integration test use1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=us-east-1
-step: &deploy-cac1-prod
name: deply ca-central-1 prod
image: amazon/aws-sam-cli-build-image-python3.8
script:
- BITBUCKET_PIPE_SHARED_STORAGE_DIR="/opt/atlassian/pipelines/agent/build/.bitbucket/pipelines/generated/pipeline/pipes"
- chmod -R o+rw $BITBUCKET_PIPE_SHARED_STORAGE_DIR
- pipe: atlassian/aws-sam-deploy:1.2.0
variables:
AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
AWS_DEFAULT_REGION: 'ca-central-1'
STACK_NAME: 'OpenDevOpsImageLabeller'
CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}/image-labeller-packaged.yml'
WAIT: 'true'
DEBUG: 'true'
S3_BUCKET: 'open-devops-code-ca-central-1-${AWS_ACCOUNT_ID}'
SAM_TEMPLATE: 'template.yml'
-step: &integration-test-cac1
name: integration test cac1
image: golang:buster
script:
- git clone git@bitbucket.org:pmmquickstartguides01/systemtests.git
- cd systemtests
- go test -v ./... -aws_region=ca-central-1
pipelines:
default:
- step: *rununittests
- step:
<<: *deploy-usw1-test
deployment: us-west-1 Test
# - step: *integration-test-usw1
- step:
<<: *deploy-use2-staging
deployment: us-east-2 Staging
# - step: *integration-test-use2
branches:
mainline:
- step:
<<: *deploy-usw2-prod
deployment: us-west-2 Prod
# - step: *integration-test-usw2
- step:
<<: *deploy-use1-prod
deployment: us-east-1 Prod
# - step: *integration-test-use1
- step:
<<: *deploy-cac1-prod
deployment: ca-central-1 Prod
# - step: *integration-test-cac1
La ejecución de las pruebas de integración no admite comentarios por ahora. Las pruebas del sistema solo pasarán cuando se implemente toda la aplicación. Descomenta los pasos de la prueba de integración en tu repositorio y realiza otro envío para ejecutar la canalización de implementación una vez que se hayan implementado todos los componentes de ImageLabeller. Debes actualizar la línea de clonación de git para que SystemTests sea tu repositorio de SystemTests.
Entender un archivo bitbucket-pipelines.yml
Este paso ejecuta pruebas unitarias a partir de la base de código de InvokeLabeller.
-step: &rununittests
name: run unit tests
image: golang:buster
script:
- cd submitImage
- go test ./opendevopslambda/...
Actualizar src/app.py con el endpoint de AWS SageMaker
Abre el archivo src/app.py de InvokeLabeller y busca query_endpoint. Cambia el endpoint_name y el region_name del cliente para que coincidan con tu bloc de notas de AWS SageMaker.
def query_endpoint(img):
endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
model_predictions = json.loads(response['Body'].read())['predictions'][0]
return model_predictions
Enviar a una rama de funciones
Desde la línea de comandos, ejecuta lo siguiente para enviar tu código a la rama IM-10 del repositorio de InvokeLabeller.
git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10
Haz clic en Canalizaciones y, a continuación, en IM-10 para ver la canalización en ejecución.
Crea una solicitud de incorporación de cambios
Para crear una solicitud de incorporación de cambios, haz clic en Solicitudes de incorporación de cambios y, a continuación, en Crear solicitud de incorporación de cambios. Termina la solicitud de incorporación de cambios y haz clic en Canalizaciones para ver la implementación del entorno de producción.
Crear un repositorio para System Tests
Ve a Jira y crea una nueva incidencia para añadir un repositorio de SystemTests a Bitbucket. Toma nota del identificador de la incidencia. En este ejemplo es IM-7.
Ve a Bitbucket y haz clic en Crear y, a continuación, en Repositorio.
Selecciona el espacio de trabajo y el proyecto adecuados. Configura el nombre de la rama predeterminada en la rama principal. Haz clic en Crear repositorio para continuar.
En tu terminal, ve al repositorio de SystemTests y ejecuta lo siguiente para enviar tu código a Bitbucket.
git add --all
git commit -m "IM-7 add SystemTests repository to Bitbucket"
git remote add origin git@bitbucket.org:pmmquickstartguides01/systemtests.git
git branch -M mainline
git push -u origin mainline
El repositorio de SystemTests no necesita un archivo bitbucket-pipelines.yml. No tiene una canalización propia, ya que proporciona pruebas para que se ejecuten otras canalizaciones. Toma nota de la URL remota de tu SystemTests. Las canalizaciones de CI/CD de SubmitImage, GetImageLabel e InvokeLabeller clonarán el repositorio de SystemTests durante las etapas de prueba. Tendrás que actualizar el bitbucket-pipelines.yml de los repositorios posteriores con la URL correcta.
Añade claves SSH de SubmitImage, GetImageLabel e InvokeLabeller
Haz clic en Configuración del repositorio y, a continuación, en Claves de acceso.
Haz clic en Añadir clave, pega la clave SSH copiada de SubmitImage, GetImageLabel o InvokeLabeller y, a continuación, haz clic en Añadir clave SSH.
Si has llegado hasta aquí, ¡enhorabuena! Acabas de implementar ImageLabeller. El siguiente paso es configurar la monitorización de ImageLabeller con Opsgenie.
Compartir este artículo
Tema siguiente
Lecturas recomendadas
Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.