Close

ImageLabeller implementeren met GitLab

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 GitLab. We raden je aan om, voordat je begint, de pagina's ImageLabeller-architectuur en AWS SageMaker instellen te lezen voor meer context.

Vereisten

Als je nog geen GitLab-groep hebt, volg dan de stappen in deze GitLab-handleiding om een volledig nieuwe groep aan te maken.

Openbare GitHub-repository's met ImageLabeller-code

https://github.com/AtlassianOpenDevOpsGuides

Demovideo over de integratie van Jira GitLab

Jira en GitLab integreren

Klik vanuit Jira op Bord, daarna op Apps en vervolgens op GitLab.

Screenshot van het vervolgkeuzemenu in Jira Software om naar GitLab te navigeren

Klik op Nu ophalen.

De appmodal van de GitLab-app in Jira Software

Klik op Apps en vervolgens op Je apps beheren.

Gitlab-appmodal in Jira Software, met vervolgkeuzemenu

GitLab voor Jira uitbeiden.

Breid GitLab uit op het scherm Apps beheren in Jira Software

Klik op Naamruimte toevoegen.

Scherm om een naamspace toe te voegen aan je GitLab Jira-softwareconfiguratie

Selecteer je bestaande naamruimte en klik op Koppelen. In deze handleiding wordt ervan uitgegaan dat je al een bestaand GitLab-account en een GitLab-groep hebt.

Een GitLab-naamspace koppelen in Jira Software

SSH-sleutel toevoegen aan GitLab

Klik op je profielfoto rechtsbovenin en klik op Voorkeuren.

Naar voorkeuren navigeren met behulp van het vervolgkeuzemenu in GitLab

Klik op SSH-sleutels en volg de instructies om een nieuwe SSH-sleutel te genereren of een bestaande SSH-sleutel te gebruiken.

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 doet 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.

Ga naar Jira en maak een nieuwe issue om een AWS S3-infrastructuurrepository aan GitLab toe te voegen. Noteer de issue-ID. In dit voorbeeld is dat IM-5.

Een nieuw issue aanmaken voor je bord in Jira Software

Ga naar GitLab en klik op Nieuw project.

Navigeren om een 'Nieuw project aan te maken' in GitLab

Klik op Leeg project aanmaken.

Een nieuw project aanmaken in GitLab

Voeg een Projectnaam toe en kies de juiste groep in Project-URL. Klik op Project aanmaken om verder te gaan.

Een nieuw project aanmaken - gedetailleerd scherm in GitLab

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

git add --all
git commit -m "IM-5 add s3_infra repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
git branch -m mainline
git push -u origin mainline

AWS-toegangssleutel toevoegen

Klik op Instellingen en vervolgens op CI/CD. Scrol naar beneden en vouw Variabelen uit. Klik op Variabele toevoegen.

CI/CD-instellingenpagina in GitLab

Maak twee variabelen aan. Eén voor je AWS-toegangssleutel-ID en één voor je geheime AWS-toegangssleutel.

Modal 'Variabele toevoegen' om je AWS-sleutels toe te voegen in GitLab

Bescherm de variabelen zodat ze alleen worden gebruikt voor pipelines die op beschermde branches lopen, en voor tags. Geef de IAM-gebruiker die is gekoppeld aan de AWS-toegangssleutel AdministratorAccess. Je kunt er ook voor kiezen om een gedetailleerdere toegangscontrole te gebruiken door een individueel AWS-toegangsbeleid te kiezen.

AWS-sleutels vermeld onder de sectie 'Variabelen' op de CI/CD-instellingenpagina in GitLab

Configureer beveiligde branches voor toegang tot beschermde variabelen

Klik op Instellingen en vervolgens op Repository. Scrol naar beneden en vouw Beschermde branches uit.

Voer het voorvoegsel van je Jira-issue-ID en een * in.

De Jira-issue-ID's zijn net als IM-5 en IM-6 in dit voorbeeld: het voorvoegsel is IM-.

Voer IM-* in en klik op Beveiligen.

Beveiligde branches configureren in GitLab

Je ziet mainline en IM-* als beschermde branches.

Implementatieomgevingen instellen

Klik op Implementaties en vervolgens op Omgevingen. Klik op Nieuwe omgeving om nieuwe omgevingen toe te voegen. In dit voorbeeld zijn er testomgevingen in US-WEST-1 en in US-EAST-2 en Productieomgevingen in US-WEST-2, US-EAST-1 en CA-CENTRAL-1 .

Implementatieomgevingen instellen in GitLab

.gitlab-ci.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 .gitlab-ci.yml-bestand met de volgende yaml. Hierdoor wordt een implementatieworkflow voor je test-, staging- en productieomgevingen gedefinieerd.

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

deploy-test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-test-us-east-2:
  stage: test-us-east-2
  environment: test-us-east-2
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-west-2:
  stage: production-us-west-2
  environment: production-us-west-2
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-east-1:
  stage: production-us-east-1
  environment: production-us-east-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-ca-central-1:
  stage: production-ca-central-1
  environment: production-ca-central-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

Een .gitlab-ci.yml-bestand begrijpen

Fases

Voeg een stagesblok toe om de uitvoeringsvolgorde van je GitLab-pipeline te bepalen. De stages worden uitgevoerd in de volgorde waarin ze zijn gedefinieerd in het stagesblok Taken die verband houden met een stage worden parallel uitgevoerd.

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

Jobs

Taken houden verband met een stage en kunnen geassocieerd worden met een omgeving. Regels bepalen of een bepaalde taak al dan niet wordt uitgevoerd. De regel in dit voorbeeld controleert of de pipelinebranch niet de standaardbranch is en of de pipeline niet automatisch wordt beheerd als onderdeel van een samenvoegingsverzoek.

Je kunt voor elke opdracht een andere afbeelding specificeren. Je kunt afbeeldingen instellen met de tools die je nodig hebt voor je taakscripts. De scriptsectie definieert de reeks stappen die worden uitgevoerd wanneer de taak wordt uitgevoerd.

deploy-test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

pipeline voor samenvoegingsverzoeken

Een pipeline wordt automatisch beheerd door GitLab wanneer een samenvoegingsverzoek goedgekeurd wordt. Je kunt een taak creëren voor deze pipeline door een regel toe te voegen. In dit voorbeeld lukt de taak altijd.

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

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 GitLab-integratie mogelijk te maken om bij te houden wat er in je project gebeurt.

git add --all
git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
git push -u origin IM-5

Klik op CI/CD en vervolgens op Pipelines om te zien hoe de pipeline draait.

Scherm met CI/CD-pipelines in GitLab

Klik op de pipeline-ID van de lopende pipeline.

Pipeline-ID voor de lopende pipeline in GitLab

Klik op een taak voor meer informatie.

Gedetailleerd opdrachtscherm voor de lopende pipeline in GitLab

Maak een samenvoegingsverzoek aan

Klik op Verzoeken samenvoegen en vervolgens op Samenvoegingsverzoek aanmaken om een samenvoegingsverzoek aan te maken.

Scherm voor het samenvoegingsverzoeken in GitLab

Kies je functie-branch als bronbranch en klik vervolgens op Branches vergelijken en verdergaan.

Vergelijking van bron- en doelbranch in GitLab

Kies een uitvoerder en een beoordelaar.

Een beoordelaar kiezen voor je samenvoegingsverzoek in GitLab

Klik op Samenvoegingsverzoek aanmaken.

Selecteer de knop 'Samenvoegingsverzoek aanmaken' in GitLab

Bekijk de wijzigingen in de code en klik vervolgens op Goedkeuren.

Gedetailleerd scherm van het samenvoegingsverzoek, waar je wijzigingen in GitLab kunt bekijken

Klik op CI/CI en vervolgens op Pipelines om de pipeline voor samenvoegingsverzoeken te zien draaien.

Navigeren naar het scherm 'pipelines' in Gitlab om de samenvoegingsverzoeken uit te voeren

Klik op de pipeline-ID. Let op dat de merge-request-pipeline-job de enige taak is die is uitgevoerd.

Gedetailleerde pagina van de 'pipeline', waaruit blijkt dat in GitLab alleen een merge-request-pipeline-job werd uitgevoerd

Ga terug naar het samenvoegingsverzoek door te klikken op samenvoegingsverzoeken, vervolgens op het actieve samenvoegingsverzoek en op Samenvoegen te klikken. Dit is het begin van een nieuwe pipeline.

Het actieve samenvoegingsverzoek in GitLab samenvoegen

Klik op CI/CD en vervolgens op Pipelines. Klik op de pipeline-ID.

Gedetailleerde pagina van de pipeline in GitLab waarop de 'Samenvoegingsbranch 'IM-5' wordt weergegeven in de 'mainline''

Een repository voor SystemTests aanmaken

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

Maak een issue in Jira Software aan om een 'GitLab-repo toe te voegen voor SubmitImage AWS Lambda'

Voeg een Projectnaam toe en kies de juiste groep in Project-URL. Klik op Project aanmaken om verder te gaan.

Projectgegevens invullen bij het aanmaken van een nieuw project in GitLab

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

git add --all
git commit -m "IM-7 add SystemTests repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/systemtests.git
git branch -m mainline
git push -u origin mainline

De SystemTests-repository heeft geen .gitlab-ci.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 bitbucketgitlab-ci.yml van latere repository's bijwerken met de juiste URL.

Voeg een Implementatie-token toe

Je moet een implementatietoken toevoegen om deze repository te klonen tijdens de uitvoering van andere pipelines. Klik op Instellingen en vervolgens op Repository. Scrol naar beneden en vouw Implementatietokens uit.

Voer een voorbeeldnaam 'cloneMe' in onder 'Implementatietokens' in GitLab

Voer een naam in, vink read_repository aan en klik op Implementatietoken aanmaken.

Het selectievakje voor 'read_repository' selecteren op de instellingenpagina voor 'implementatietokens' in GitLab

De gebruikersnaam van de implementatietoken wordt automatisch gegenereerd. Het wachtwoord voor de implementatietoken wordt één keer verstrekt bij het aanmaken. Voeg het toe aan een tool voor geheim beheer, zodat deze later geraadpleegd kan worden. Verderop in deze handleiding wordt naar de gebruikersnaam van het implementatietoken verwezen als gitlab_deploy_token, en naar het wachtwoord voor de implementatietoken als gitlab_deploy_password.

Scherm voor implementatietokens in GitLab, met de gebruikersnaam en het wachtwoord van de implementatietoken

Een repository voor SubmitImage AWS Lambda aanmaken

Ga naar Jira en maak een Jira-issue om een SubmitImage AWS Lambda-repository toe te voegen aan GitLab. Noteer de issue-ID. In dit voorbeeld is dat IM-8.

Bord ImageLabeller in Jira Software, met de nadruk op issue 'IM-8, GitLab-repo toevoegen voor SubmitImage AWS Lambda'

Ga naar GitLab en klik op Nieuw project en vervolgens op Leeg project aanmaken. Voeg een Projectnaam toe en kies de juiste groep in Project-URL. Klik op Project aanmaken om verder te gaan.

screenshot van het aanmaken van het nieuwe project 'submitimage' in gitlab

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

git add --all
git commit -m "IM-8 add SubmitImage to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
git branch -m mainline
git push -u origin mainline

Je moet AWS-toegangssleutels toevoegen, beveiligde branches configureren en implementatieomgevingen instellen.

Voeg vervolgens de implementatiesleutels uit je SystemTests-repository toe, zodat de SubmitImage GitLab-pipeline gedownload en de SystemTests uitgevoerd kan worden.

Voeg tot slot je AWS-account-ID toe als CI/CD-variabele.

screenshot van het scherm met variabelen in gitlab

.gitlab-ci.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-8

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

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

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.

Een .gitlab-ci.yml-bestand begrijpen

In deze stap worden unittests uitgevoerd die deel uitmaken van de SubmitImage-repository.

unit-test-us-west-1:
  stage: unit-test-us-west-1
  environment: test-us-west-1
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

In deze stap wordt de SubmitImage AWS Lambda geïmplementeerd met behulp van AWS SAM. Let op de sectie before_script. Deze stap wordt vóór de scriptsectie uitgevoerd en kan gebruikt worden om afhankelijkheden te installeren en verschillende tools in te stellen.

deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

In deze stap worden de integratietests gedownload en uitgevoerd in de SystemTests-repository. Je moet de git-kloonlijn bijwerken om SystemTests te gebruiken als SystemTests-repository.

test-us-west-1:
  stage: test-us-west-1
  environment: test-us-west-1
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
    - cd systemtests
    - go test -v ./... -aws_region=us-west-1

In de git-kloonregel wordt er verwezen naar het eerder gemaakte implementatietoken.

- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git

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. Vermeld de Jira-issue-ID in commit-berichten en branchnamen om de Jira GitLab-integratie mogelijk te maken om bij te houden wat er in je project gebeurt.

git add --all
git commit -m "IM-8 add .gitlab-ci.yml to SubmitImage"
git push -u origin IM-8

Klik op CI/CD en vervolgens op Pipelines om te zien hoe de pipeline draait.

screenshot van de pipeline die in gitlab wordt uitgevoerd

Maak een samenvoegingsverzoek aan

Maak een samenvoegingsverzoek aan om in je productieomgevingen te implementeren nadat GitLab in je testomgevingen is geïmplementeerd. Kies de IM-8-branch.

screenshot van samenvoegingsverzoeken in gitlab

Klik op CI/CD en vervolgens op Pipelines om de lopende pipeline voor een samenvoegingsverzoek te zien.

screenshot van het lopende samenvoegingsverzoek in gitlab

Voeg de wijzigingen samen naar de mainline nadat de pipeline voor samenvoegingsverzoeken is voltooid. Klik op CI/CD en vervolgens op Pipelines om de lopende productiepipeline te zien.

screenshot van de lopende productiepipeline in gitlab

Een repository voor InvokeLabeller AWS Lambda aanmaken

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

screenshot van jira-issue die een repo 'invokelabeller' aanmaakt in gitlab

Ga naar GitLab en klik op Nieuw project en vervolgens op Leeg project aanmaken. Voeg een Projectnaam toe en kies de juiste groep in Project-URL. Klik op Project aanmaken om verder te gaan.

screenshot van het aanmaken van het nieuwe project 'invokelabeller' in gitlab

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

git add --all
git commit -m "IM-10 add InvokeLabeller to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/invokelabeller.git
git branch -m mainline
git push -u origin mainline

Je moet AWS-toegangssleutels toevoegen, beveiligde branches configureren en implementatieomgevingen instellen.

Voeg vervolgens de implementatiesleutels uit je SystemTests-repository toe, zodat de InvokeLabeller GitLab-pipeline gedownload en de SystemTests uitgevoerd kan worden.

Voeg tot slot je AWS-account-ID toe als CI/CD-variabele.

screenshot van de pagina met variabelen in gitlab

.gitlab-ci.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 .gitlab-ci.yml-bestand aan met de volgende yaml. Hierdoor wordt een implementatieworkflow voor je test-, staging- en productieomgevingen gedefinieerd. Je moet de git-kloonlijn bijwerken om SystemTests te gebruiken als SystemTests-repository.

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install pytest
    - pip3 install moto
    - pip3 install -r tst/requirements.txt --user
  script:
    - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

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.

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. Vermeld de Jira-issue-ID in commit-berichten en branchnamen om de Jira GitLab-integratie mogelijk te maken om bij te houden wat er in je project gebeurt.

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

Klik op CI/CD en vervolgens op Pipelines om te zien hoe de pipeline draait.

screenshot van de pipeline die in gitlab draait

Maak een samenvoegingsverzoek aan

Maak een samenvoegingsverzoek aan om in je productieomgevingen te implementeren nadat GitLab in je testomgevingen is geïmplementeerd. Kies de IM-10-branch.

screenshot van het aanmaken van een samenvoegingsverzoek in gitlab

Voeg de wijzigingen samen naar de mainline nadat de pipeline voor samenvoegingsverzoeken is voltooid. Klik op CI/CD en vervolgens op Pipelines om de lopende productiepipeline te zien.

screenshot van de lopende productiepipeline in gitlab

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