Close

Implementar ImageLabeller con Bitbucket

Foto de Warren Marusiak
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

https://github.com/AtlassianOpenDevOpsGuides

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.

Captura de pantalla que muestra una incidencia de Jira para añadir el repositorio de infraestructura de AWS S3 a Bitbucket

Ve a Bitbucket > Crear > Repositorio.

Crear un repositorio en Bitbucket

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.

Ventana emergente para crear un nuevo repositorio en Bitbucket

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.

Habilitar Pipelines en Bitbucket

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.

Variables de repositorio en Bitbucket

Configurar entornos de implementación

Haz clic en Implementaciones.

Pantalla de configuración de implementaciones en Bitbucket

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.

Añadir entornos de implementación en Bitbucket

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.

Ejecutar una canalización en Bitbucket

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.

Detalles de ejecución de canalizaciones en Bitbucket

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.

Crear una solicitud de incorporación de cambios en Bitbucket

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.

Crear un modal de solicitud de incorporación de cambios en Bitbucket.

Revisa los cambios en el código y, a continuación, aprueba y fusiona la solicitud de incorporación de cambios.

Aprobar y fusionar la solicitud de incorporación de cambios en Bitbucket

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.

Marca la casilla de verificación "Mover incidencia" al fusionar la solicitud de incorporación de cambios en Bitbucket

Haz clic en Canalizaciones para monitorizar la canalización principal.

Monitorizar la canalización principal de Bitbucket

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.

Pantalla de canalización de la rama principal en Bitbucket

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.

Pantalla de implementaciones en Bitbucket

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.

Seleccionar un entorno y, a continuación, la versión a la que quieres revertir en Bitbucket

Comprueba que el cambio es correcto y haz clic en Volver a implementar.

Comprueba que tus cambios sean correctos antes de seleccionar "volver a implementar" en Bitbucket

Solo se vuelve a implementar el entorno elegido.

El modal de canalización en Bitbucket muestra únicamente el entorno elegido que se está volviendo a implementar

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.

Crear una incidencia en Jira Software para añadir un repositorio de SubmitImage a Bitbucket

Ve a Bitbucket y haz clic en Crear y, a continuación, en Repositorio.

Crear un repositorio en Bitbucket

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.

Modal emergente al crear un nuevo repositorio en Bitbucket

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.

Habilitar Pipelines en la configuración de Pipelines de Bitbucket

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.

Habilitar Pipelines en la configuración de Pipelines de Bitbucket

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.

Entornos de implementación en Bitbucket

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.

Generar claves SSH en Bitbucket

Necesitarás esta clave SSH para crear el repositorio de SystemTests.

Detalles de las claves SSH en Bitbucket

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.

Captura de pantalla de las canalizaciones de Bitbucket Cloud

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.

Canalización de implementación del entorno de producción en Bitbucket Cloud

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.

Captura de pantalla que muestra incidencias de Jira en un tablero de Jira

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.

Crear un repositorio de InvokeLabeller en Bitbucket

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.

Habilitar Pipelines en la configuración de Bitbucket

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 variables de repositorio en Bitbucket

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.

Entornos de implementación en Bitbucket

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.

Detalles de las claves SSH en Bitbucket Cloud

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.

Consultar las canalizaciones en ejecución en Bitbucket Cloud

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.

Ver la implementación del entorno de producción en Bitbucket Pipelines

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.

Ver una incidencia de Jira recién creada en un tablero de Jira

Ve a Bitbucket y haz clic en Crear y, a continuación, en Repositorio.

Crear un repositorio en Bitbucket

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.

Introducir información al crear un nuevo repositorio en Bitbucket

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.

Página de configuración de las claves de acceso en Bitbucket

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.

Añadir una clave SSH en Bitbucket

Si has llegado hasta aquí, ¡enhorabuena! Acabas de implementar ImageLabeller. El siguiente paso es configurar la monitorización de ImageLabeller con Opsgenie.

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


Compartir este artículo

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.

Ilustración de Devops

La comunidad de DevOps

Ilustración de Devops

Ruta de aprendizaje de DevOps

Ilustración de un mapa

Pruébalo gratis

Suscríbete para recibir el boletín de DevOps

Thank you for signing up