Bitbucket Pipelines

Deploy Dropwizard-apper til AWS med Bitbucket Pipelines

Jeg har lenge ønsket meg en enkel byggserver for mine private hobbyprosjekter, og nå har jeg endelig funnet Bitbucket Pipelines.

Det finnes flere forskjellige løsninger som jeg kunne benyttet meg av, blant annet:

  • Travis CI (Betaling for private repos)
  • CloudBees (Jenkins Cloud)
  • Hostet egen Jenkins
  • Hostet egen Bamboo
  • Hostet egen TeamCity

Samtlige av disse krever A) penger, eller B) vedlikehold på min egen server. Da jeg er både lat og gjerrig har jeg til nå nøyd meg med å gjøre bygg lokalt, unntatt de tilfeller hvor jeg kan git pushe rett til en skyløsning som Heroku eller Dokku.

Bitbucket Pipelines

På JavaZone pitchet Nicola Paolucci fra Atlassian deres beta av Bitbucket Pipelines, og jeg ble umiddelbart interessert. Kort forklart gir Bitbucket Pipelines deg muligheten til å gjøre et bygg for hver push til ditt Bitbucket.org-repository.

Alt du trenger er en fil i ditt repository kalt bitbucket-pipelines.yml som inneholder en beskrivelse av hva som skal skje i bygget. Her kan du velge et hvilket som helst Docker-image på DockerHub som basis. Videre kan du så definere hvilke kommandoer du vil kjøre. For hver push vil de så deploye og kjøre dette på sin server.

Pipelines reklamerer også for integrasjon med en del tredjeparts-tjenester, for eksempel Amazon AWS og Browserstack.

Min lille app

Jeg hadde tilfeldigvis en liten app jeg hadde tenkt å utvide og deploye til skyen, og bestemte meg derfor for å prøve Pipelines på den. Appen er en liten tjeneste som veldig enkelt lister opp alle de meetups jeg synes er aktuelle for Visma Consulting. Appen tar ganske enkelt å gjør en GET-request mot APIet til meetup.com for å vise meetupene jeg er medlem av, og presenterer disse i en HTML-tabell.

Til nå har jeg startet applikasjonen lokalt, siden jeg ikke hadde funnet tid til å deploye den noe sted. Derfor bestemte jeg meg for å teste ut Pipelines’ ElasticBeanstalk-integrasjon.

Klargjøring av koden

Meetup-appen er laget i Dropwizard, og eksponerer en enkel React-app. For å klargjøre denne for Pipelines måtte jeg gjøre 3 ting.

  1. Legge til filen bitbucket-pipelines.yml
  2. Legge til kode for Pipelines-Beanstalk-integrasjon
  3. Legge til kode for å bygge og kjøre på Beanstalk

bitbucket-pipelines.yml

Først måtte jeg sette opp Pipelines-skriptet. Jeg tok utgangspunkt i denne filen fra et eksempel-prosjekt hos Atlassian, og modifiserte den til å passe Dropwizard. Legg merke til at jeg har byttet Docker-image, siden jeg ønsker å bruke Pipelines sitt standardimage:

pipelines:
  default:
    - step:
        script:
          - mvn --version
          - mvn clean install
          - apt-get update
          - apt-get install -y zip python-setuptools python-dev build-essential
          - easy_install pip
          - pip install boto3==1.3.0
          - zip -r /tmp/artifact.zip ./*
          - python beanstalk_deploy.py

Pipelines-Beanstalk-integrasjon

For selve integrasjonen mellom Pipelines og Beanstalk har Atlassian laget et lite Python-skript. Jeg la derfor til beanstalk_deploy.py.

Bygging og kjøring på Beanstalk

Elastic Beanstalk-integrasjonen krever to filer i kodebasen, Buildfile og Procfile.

Buildfilen forteller hvordan man bygger prosjektet, og er i mitt tilfelle veldig enkelt:

build: mvn clean install -DskipTests

Procfilen forteller hva og hvordan applikasjonen kjøres, og er også veldig enkel:

web: java -jar target/meetupapp.jar server elasticbeanstalk.yml

Jeg trengte også en egen Dropwizard-config, som tok inn PORT-miljøvariabelen fra Elastic Beanstalk, elasticbeanstalk.yml:

server:
  type: simple
  rootPath: /api/*
  applicationContextPath: /
  connector:
    type: http
    port: ${PORT}
logging:
  level: INFO
meetupurl: ${MEETUPS_URL}

Oppsett av Elastic Beanstalk

Da er man nesten i mål, det eneste som gjenstår er å sette opp et miljø i AWS. Logg inn på AWS Management Console, lag en brukerkonto hvis du ikke har. Jeg laget så et Elastic Beanstalk-prosjekt, la til en service-bruker for Bitbucket som hadde tilgangen AWSElasticBeanstalkFullAccess. Finn så og noter ned følgende miljøvariabler:

  • AWS_SECRET_ACCESS_KEY: Adgangsnøkkelen til service-brukeren.
  • AWS_ACCESS_KEY_ID: IDen til adgangsnøkkelen til service-brukeren.
  • AWS_DEFAULT_REGION: eu-west-1 for min del
  • APPLICATION_NAME: Navnet på Beanstalk-applikasjonen
  • APPLICATION_ENVIRONMENT: Navnet på Beanstalk-miljøet.
  • S3_BUCKET: Det blir automatisk laget en bucket for Beanstalk-prosjektet.

Det neste man må gjøre, er å åpne settingsene i Bitbucket-repositoriet, og lime inn disse miljøvariablene der.

Voila

Ved neste push fra repoet blir applikasjonen deployet på Beanstalk-adressen.

Se hele koden til meetup-appen her. Våre anbefalte meetups kan du se her.

 

Jobb hos oss?

Har du lyst til å jobbe i et selskap med fokus på ny teknologi og faglig utvikling? Bli konsulent i Visma.

Se våre ledige stillinger her

Anders Emil er seniorkonsulent i Visma Consulting, og programmerer for det meste i Java og JavaScript på prosjekter. Som fagsjef i Visma Consulting bruker han det meste av den tiden han ikke er i prosjekter på å sørge for at bedriften er oppdatert på det nyeste av teknologi.
Kontakt Anders Emil: