Close

ImageLabeller implementeren met Bitbucket

Profielfoto van Warren Marusiak
Warren Marusiak

Senior Technical Evangelist

Om te demonstreren hoe je toepassingen ontwikkelt, implementeert en beheert met behulp van Jira Software en verschillende bijbehorende tools, heeft ons team ImageLabeller aangemaakt, een eenvoudige demotoepassing gebouwd op AWS die gebruikmaakt van machine learning om labels op afbeeldingen aan te brengen.

Op deze pagina wordt beschreven hoe je ImageLabeller implementeert met Bitbucket. We raden je aan om, voordat je begint, de pagina's ImageLabeller-architectuur en de AWS SageMaker instellen te lezen voor meer context.

Vereisten

Volg deze instructies als je nog geen SSH hebt geconfigureerd voor je Bitbucket-account.

Openbare GitHub-repository's met ImageLabeller-code

https://github.com/AtlassianOpenDevOpsGuides

Demovideo van Bitbucket-pipelines

Een repository voor de AWS S3-infrastructuur aanmaken

In een standaard ontwikkelaarslus neemt een ontwikkelaar doorgaans een taak over van Jira, verplaatst deze naar werk in uitvoering en voltooit vervolgens het ontwikkelingswerk. De Jira issue-ID is de sleutel die het ontwikkelingswerk koppelt aan de Jira-issue. Deze ID is de belangrijkste integratiecomponent tussen de twee systemen.

Maak in Jira een nieuwe issue aan om een AWS S3-infrastructuurrepository aan Bitbucket toe te voegen. Noteer de issue-ID. In dit voorbeeld is dat IM-5.

Screenshot van een Jira-issue om een AWS S3-infrastructuurrepository aan Bitbucket toe te voegen

Ga naar Bitbucket > Aanmaken > Repository.

Een repository aanmaken in Bitbucket

Selecteer de juiste Workspace en het juiste Project. Stel de standaardnaam van de branch in op mainline. Klik op Repository aanmaken om verder te gaan.

Pop-upvenster om een nieuwe repository in Bitbucket aan te maken

Ga in je terminal naar je s3_infra-repository en voer het volgende uit om je template.yml-bestand van AWS CloudFormation naar Bitbucket te pushen.

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

Schakel Bitbucket Pipelines in

Ga naar de Repository-instellingen > Instellingen > Pipelines inschakelen.

Pipelines in Bitbucket inschakelen

Voeg een repositoryvariabele voor AWS-toegangssleutels toe

Ga naar Repository-variabelen, voer je AWS-toegangscode in en klik op Toevoegen. Voer vervolgens je geheime AWS-toegangssleutel in en klik op Toevoegen.

Repository-variabelen in Bitbucket

Implementatieomgevingen instellen

Klik op Implementaties.

Scherm met implementatie-instellingen in Bitbucket

Klik op omgeving toevoegen om nieuwe omgevingen toe te voegen. In dit voorbeeld is er een testomgeving in US-WEST-1, een stagingomgeving in US-EAST-2 en drie productieomgevingen in US-WEST-2, US-EAST-1 en CA-CENTRAL-1 .

Implementatieomgevingen toevoegen in Bitbucket

bitbucket-pipelines.yml voor implementatie in AWS

Ga naar je s3_infra-repository in je terminal en maak een branch aan die vernoemd is naar je Jira-issue-ID.

git checkout -b IM-5

Maak een bitbucket-pipelines.yml-bestand aan met de volgende yaml. Hierdoor wordt een implementatieworkflow voor je test-, staging- en productieomgevingen gedefinieerd.

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

Inzicht in een bitbucket-pipelines.yml-bestand

Definities en stappen

Definieer een reeks stappen in de sectie definities. Elke stap heeft een alias die in het hele bitbucket-pipelines.yml-bestand gebruikt wordt, een naam die verschijnt op het Bitbucket-implementatiescherm en een script. Een script is een verzameling van een of meer opdrachten.

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

In deze stap wordt de atlassian/aws-cloudformation-deploy pipe gebruikt om de AWS S3-buckets te implementeren die gedefinieerd zijn in het s3_infra-sjabloon.yml-bestand.

- pipe: atlassian/aws-cloudformation-deploy:0.10.0

De set met beschikbare pipes kun je hier vinden. De documentatie voor de pipe atlassian/aws-cloudformation-deploy kun je hier vinden.

Pipelines

Pipelines voeren een aantal stappen uit. De standaardpipeline is de reeks stappen die wordt uitgevoerd voor branches die niet uitdrukkelijk onder pipelines worden genoemd. In deze standaardpipeline worden stappen uitgevoerd die naar test- en stagingomgevingen implementeren.

pipelines:
  default:
    - step:
        <<: *deploy-test-usw1
        deployment: Test us-west-1
    - step:
        <<: *deploy-staging-use2
        deployment: Staging us-east-2

Implementaties maken integratie tussen Jira en Bitbucket mogelijk.

deployment: Test us-west-1

Onder branches kun je een reeks stappen definiëren die worden uitgevoerd voor een bepaalde branch met een naam. Het fragment hieronder definieert een reeks stappen voor de mainline-branch.

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

Lees dit referentieartikel voor meer informatie over dit onderwerp.

Naar een functie-branch pushen

Voer vanaf de opdrachtregel het volgende uit om je wijzigingen naar de IM-5-branch van je s3_infra-repository te pushen. Vermeld de Jira-issue-ID in commit-berichten en branchnamen om de Jira Bitbucket-integratie mogelijk te maken om bij te houden wat er in je project gebeurt.

git add --all
git commit -m "IM-5 add bitbucket-pipelines.yml"
git push -u origin IM-5

Klik op Pipelines en vervolgens op IM-5 om de lopende pipeline te zien.

Lopende pipeline in Bitbucket

Klik op de pipeline zelf voor meer informatie over de uitvoering. In de pipeline werden stappen uitgevoerd voor de implementatie in een testomgeving in us-west-1 en een stagingomgeving in us-east-2.

Gegevens over de uitvoering van de pipeline in Bitbucket

Een pull-aanvraag aanmaken

Klik op Pull requests en vervolgens op Pull request aanmaken om een pull request te maken.

Een pull request aanmaken in Bitbucket

Kies je functie-branch als de bronbranch, vink het selectievakje Branch sluiten aan en klik vervolgens op Pull request aanmaken.

Een modal voor een pull request aanmaken in Bitbucket.

Bekijk de wijzigingen in de code. Daarna kun je de pull request Goedkeuren en Samenvoegen.

Pull request goedkeuren en samenvoegen in Bitbucket

Als je op Samenvoegen klikt, wordt het scherm voor samenvoeging van de pull request geopend. Vink het selectievakje bij Overgangsissue aan en klik op Samenvoegen.

Vink het selectievakje voor 'overgangsissue' aan wanneer je een pull request samenvoegt in Bitbucket

Klik op Pipelines om de mainline pipeline te monitoren.

Monitoren van de belangrijkste pipeline in Bitbucket

De IM-5-branch is verdwenen. De mainline-branch blijft over en er loopt een pipeline. Klik op de pipeline.

Scherm van de mainline-branch-pipeline in Bitbucket

In de pipeline werden stappen uitgevoerd om te implementeren in Productieomgevingen in us-west-2, us-east-1 en ca-central-1. Het is mogelijk om een pipeline opnieuw uit te voeren door op de knop Opnieuw uitvoeren te klikken als een pipeline mislukt.

Een slechte implementatie terugdraaien

Klik op Implementaties om een implementatie terug te draaien.

Scherm voor implementaties in Bitbucket

Klik op de omgeving die je wilt terugdraaien voor een lijst met historische implementaties, kies de versie waarnaar je terug wilt draaien en klik vervolgens op Opnieuw implementeren.

Een omgeving selecteren en vervolgens de versie waarnaar je terug wilt draaien in Bitbucket

Controleer of de wijziging juist is en klik op Opnieuw implementeren.

Controleer of je wijzigingen juist zijn voordat je kiest voor 'herimplementatie' in Bitbucket

Alleen de gekozen omgeving wordt opnieuw geïmplementeerd.

Modal voor pipeline in Bitbucket, waarbij alleen de gekozen omgeving opnieuw wordt geïmplementeerd

Een repository voor SubmitImage AWS Lambda aanmaken

Ga naar Jira en maak een Jira-issue om een SubmitImage-repository toe te voegen aan Bitbucket. Let op de issue-ID. In dit voorbeeld is dat IM-6.

Een issue aanmaken in Jira Software om een SubmitImage-repository aan Bitbucket toe te voegen

Ga naar Bitbucket, klik op Aanmaken en vervolgens op Repository.

Een repository aanmaken in Bitbucket

Selecteer de juiste Workspace en het juiste Project. Stel de standaardnaam van de branch in op mainline. Klik op Repository aanmaken om verder te gaan.

Pop-up-modal bij het aanmaken van een nieuwe repository in Bitbucket

Ga in je terminal naar je SubmitImage-repository en voer het volgende uit om je AWS Lambda-code naar Bitbucket te pushen. Vermeld de Jira-issue-ID in commit-berichten en branchnamen om de Jira Bitbucket-integratie mogelijk te maken om bij te houden wat er in je project gebeurt.

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

Pipelines inschakelen

Ga naar de Repository-instellingen, klik op Instellingen en vervolgens op Pipelines inschakelen.

Pipelines inschakelen in de pipeline-instellingen in Bitbucket

Repository-variabelen toevoegen

Klik op Repository-variabelen om de ID van je AWS-toegangssleutel, geheime AWS-toegangssleutel en AWS-account-ID toe te voegen. Geef de IAM-gebruiker die is gekoppeld aan de AWS-toegangssleutel AdministratorAccess. Je kunt ervoor kiezen om een gedetailleerdere toegangscontrole te gebruiken door een individueel AWS-toegangsbeleid te kiezen.

Pipelines inschakelen in de pipeline-instellingen in Bitbucket

Implementatieomgevingen toevoegen

Klik op Implementaties en vervolgens op omgeving toevoegen om nieuwe omgevingen toe te voegen. In dit voorbeeld is er een testomgeving in us-west-1, een stagingomgeving in us-east-2 en drie productieomgevingen in us-west-2, us-east-1 en ca-central-1.

Implementatieomgevingen in Bitbucket

SSH-sleutels aanmaken

Ga naar je SubmitImage-repository in Bitbucket en klik op Repository-instellingen, daarna op SSH-sleutels en vervolgens op Sleutels genereren.

SSH-sleutels genereren in Bitbucket

Je hebt deze SSH-sleutel nodig als je de SystemTests-repository aanmaakt.

Gegevens over SSH-sleutel in Bitbucket

bitbucket-pipelines.yml voor implementatie in AWS

Ga naar je SubmitImage-repository in je terminal en maak een branch aan die vernoemd is naar je Jira-issue-ID.

git checkout -b IM-6

Maak een bitbucket-pipelines.yml-bestand aan met de volgende yaml. Hierdoor wordt een Bitbucket-pipeline voor je test-, staging- en productieomgevingen gedefinieerd. Je moet de git-kloonlijn bijwerken om SystemTests te gebruiken als SystemTests-repository.

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

Op de uitvoering van de integratietests wordt voorlopig niet gereageerd. De systeemtests slagen alleen als de volledige toepassing geïmplementeerd is. Haal reacties op de integratieteststappen in je repository weg en voer nog een push uit om de implementatiepipeline uit te voeren nadat alle onderdelen van ImageLabeller geïmplementeerd zijn. Je moet de git-kloonlijn bijwerken om SystemTests te gebruiken als SystemTests-repository.

Inzicht in een bitbucket-pipelines.yml-bestand

In deze stap worden unittests uitgevoerd op basis van de SubmitImage-codebasis.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

Deze stap gebruikt AWS SAM om je SubmitImage AWS Lambda te implementeren in us-west-2. De documentatie voor deze pipe kun je hier vinden.

-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'

Deze stap kloont de SystemTests-repository en voert integratietests uit in us-west-2. Je moet de git-kloonlijn bijwerken om SystemTests te gebruiken als SystemTests-repository.

-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

Naar een functie-branch pushen

Voer vanaf de opdrachtregel het volgende uit om je wijzigingen naar de IM-8-branch van je SubmitImage-repository te pushen.

git add --all
git commit -m "IM-6 add bitbucket-pipelines.yml to SubmitImage"
git push -u origin IM-6

Klik op Pipelines en vervolgens op IM-6 om de lopende pipeline te zien.

Screenshot van Bitbucket Cloud-pipelines

Een pull-aanvraag aanmaken

Klik op Pull requests en vervolgens op Pull request aanmaken om een pull request te maken. Voltooi de pull request en klik op Pipelines om de productie-implementatie te bekijken.

Pipeline voor productie-implementatie in Bitbucket Cloud

Een repository voor InvokeLabeller AWS Lambda aanmaken

Ga naar Jira en maak een Jira-issue om een InvokeLabeller-repository toe te voegen aan Bitbucket. Let op de issue-ID. In dit voorbeeld is dat IM-10.

Screenshot van Jira-issues op een Jira-bord

Ga naar Bitbucket, klik op Aanmaken en vervolgens op Repository. Selecteer de juiste Workspace en het juiste Project. Stel de standaardnaam van de branch in op mainline. Klik op Repository aanmaken om verder te gaan.

Maak een invokelabeller-repository aan in Bitbucket

Ga in je terminal naar je InvokeLabeller-repository en voer het volgende uit om je AWS Lambda-code naar Bitbucket te pushen. Vermeld de Jira-issue-ID in commit-berichten en branchnamen om de Jira Bitbucket-integratie mogelijk te maken om bij te houden wat er in je project gebeurt.

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

Pipelines inschakelen

Ga naar de Repository-instellingen, klik op Instellingen en vervolgens op Pipelines inschakelen.

Pipelines inschakelen in de instellingen in Bitbucket

Repository-variabelen toevoegen

Klik op Repository-variabelen om de ID van je AWS-toegangssleutel, geheime AWS-toegangssleutel en AWS-account-ID toe te voegen. Geef de IAM-gebruiker die is gekoppeld aan de AWS-toegangssleutel AdministratorAccess. Je kunt ervoor kiezen om een gedetailleerdere toegangscontrole te gebruiken door een individueel AWS-toegangsbeleid te kiezen, maar de details worden aan de lezer overgelaten.

Repository-variabelen in Bitbucket toevoegen

Implementatieomgevingen toevoegen

Klik op Implementaties en vervolgens op omgeving toevoegen om nieuwe omgevingen toe te voegen. In dit voorbeeld is er een testomgeving in us-west-1, een stagingomgeving in us-east-2 en drie productieomgevingen in us-west-2, us-east-1 en ca-central-1.

Implementatieomgevingen in Bitbucket

SSH-sleutels aanmaken

Ga naar je SubmitImage-repository in Bitbucket en klik op Repository-instellingen, daarna op SSH-sleutels en vervolgens op Sleutels genereren.

Gegevens over SSH-sleutel in de Bitbucket Cloud

bitbucket-pipelines.yml voor implementatie in AWS

Ga naar je InvokeLabeller-repository in je terminal en maak een branch aan die vernoemd is naar je Jira-issue-ID.

git checkout -b IM-10

Maak een bitbucket-pipelines.yml-bestand aan met de volgende yaml. Hierdoor wordt een Bitbucket-pipeline voor je test-, staging- en productieomgevingen gedefinieerd. Je moet de git-kloonlijn bijwerken om SystemTests te gebruiken als SystemTests-repository.

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

Op de uitvoering van de integratietests wordt voorlopig niet gereageerd. De systeemtests slagen alleen als de volledige toepassing geïmplementeerd is. Haal reacties op de integratieteststappen in je repository weg en voer nog een push uit om de implementatiepipeline uit te voeren nadat alle onderdelen van ImageLabeller geïmplementeerd zijn. Je moet de git-kloonlijn bijwerken om SystemTests te gebruiken als SystemTests-repository.

Inzicht in een bitbucket-pipelines.yml-bestand

In deze stap worden unittests uitgevoerd op basis van de InvokeLabeller-codebasis.

-step: &rununittests
        name: run unit tests
        image: golang:buster
        script:
          - cd submitImage
          - go test ./opendevopslambda/...

src/app.py bijwerken met het AWS SageMaker-eindpunt

Open het bestand src/app.py van InvokeLabeller en zoek naar query_endpoint. Wijzig de endpoint_name en de region_name van de client zodat ze overeenkomen met je AWS SageMaker-notebook.

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

Naar een functie-branch pushen

Voer vanaf de opdrachtregel het volgende uit om je wijzigingen naar de IM-10-branch van je InvokeLabeller-repository te pushen.

git add --all
git commit -m "IM-10 add bitbucket-pipelines.yml to InvokeLabeller"
git push -u origin IM-10

Klik op Pipelines en vervolgens op IM-10 om de lopende pipeline te zien.

Bekijk lopende pipelines in de Bitbucket Cloud

Een pull-aanvraag aanmaken

Klik op Pull requests en vervolgens op Pull request aanmaken om een pull request te maken. Voltooi de pull request en klik op Pipelines om de productie-implementatie te bekijken.

De productie-implementatie in Bitbucket-pipelines bekijken

Maak een repository voor systeemtests aan

Ga naar Jira en maak een nieuwe issue om een SystemTests-repository aan Bitbucket toe te voegen. Noteer de issue-ID. In dit voorbeeld is dat IM-7.

Een pas aangemaakte Jira-issue bekijken op een Jira-bord

Ga naar Bitbucket, klik op Aanmaken en vervolgens op Repository.

Een repository aanmaken in Bitbucket

Selecteer de juiste Workspace en het juiste Project. Stel de standaardnaam van de branch in op mainline. Klik op Repository aanmaken om verder te gaan.

Gegevens invoeren bij het aanmaken van een nieuwe repository in Bitbucket

Ga in je terminal naar je SystemTests-repository en voer het volgende uit om je code naar Bitbucket te pushen.

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

De systemTests-repository heeft geen bitbucket-pipelines.yml-bestand nodig. Het heeft geen eigen pipeline omdat er tests worden uitgevoerd om andere pipelines te laten draaien. Noteer de externe URL van je SystemTests. De CI/CD-pipelines van SubmitImage, GetImageLabel en InvokeLabeller klonen de SystemTests-repository tijdens de teststappen. Je moet de bitbucket-pipelines.yml van latere repository's bijwerken met de juiste URL.

SSH-sleutels toevoegen vanuit SubmitImage, GetImageLabel en InvokeLabeller

Klik op Repository-instellingen en vervolgens op Access-codes.

Pagina met instellingen voor toegangssleutels in Bitbucket

Klik op Sleutel toevoegen, plak de SSH-sleutel die is gekopieerd uit SubmitImage, GetImageLabel of InvokeLabeller en klik vervolgens op SSH-sleutel toevoegen.

Een SSH-sleutel toevoegen in Bitbucket

Als je tot hier bent gekomen, gefeliciteerd! Je hebt zojuist ImageLabeller geïmplementeerd. De volgende stap is het instellen van het monitoren van ImageLabeller met behulp van 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.


Deel dit artikel
Volgend onderwerp

Aanbevolen artikelen

Bookmark deze resources voor meer informatie over soorten DevOps-teams of voor voortdurende updates over DevOps bij Atlassian.

Toelichting DevOps

DevOps-community

Toelichting DevOps

DevOps-leertraject

Afbeelding van kaart

Gratis aan de slag

Meld je aan voor onze DevOps-nieuwsbrief

Thank you for signing up