DevOps infra for App
Fullførte oppgaver:
- Basis pipeline
- Docker
- Overvåkning, varsling og Metrics
Bonus: Caching av Maven ressurser
Applikasjonen er en Spring Boot applikasjon skrevet i Kotlin og bygges med maven. Løsningen består av to APIer:
- Greeting. Velkomstside.
- Books. API for bøker, støtter CRUD-operasjoner.
Når det gjelder valg av logging har jeg valgt Logback, fordi den brukes default av Spring Boot Starter. Siden default log-level i Spring Boot er info
så har jeg satt ned log-level til debug
for APIene, på grunn av at det meste logges til debug
. Dette pga. lettere sensur.
Applikasjonen hostes i Heroku i tre forskjellige miljøer: CI, Staging og Prod. Miljøene har samme infrastruktur (environment parity)
For hvert miljø så er en Hosted Graphite addon provisjonert. Hosted Graphite henter metrics fra samtlige endepunkter fra applikasjonen, hvor meter, timer og counter er blitt benyttet. Data samlet inn blir visualisert med Grafana.
På grunn av begrensinger i betalingsplanen så benytter koden seg kun av et begrenset antall metrics. Det som har blitt prioritert har vært å logge når endepunktene benyttes og evt. feil eller uønsket oppførsel.
For hvert miljø så er det satt opp en test i StatusCake som sjekker oppetid på applikasjonen. Hvis varsling via epost er ønsket, så kan man gå inn i den enkelte testen og sette opp en contact group manuelt.
Pipeline er implementert i Concourse og har følgende steg:
- Infra. Setter opp infrastruktur ved hjelp av Terraform.
- Build. Bygger applikasjonen (
mvn install
) pakker den i et Docker image og laster den opp i Heroku Container Registry. - Deploy. Henter applikasjonen fra Container Registry og publiserer den til CI-miljøet.
- Brukerkonto i Heroku (med kredittkort)
- Brukerkonto i StatusCake
- Brukerkonto i GitHub
- Docker + Docker-Compose
- Fork repo devops-exam-infra + devops-exam-app
- Opprett to SSH-nøkkelpar. Ett for infra, ett for app.
- Per repo: legg inn samsvarende public key som deploy key.
- Opprett/hent API-token + brukernavn for Github. Scope skal være: repo + admin:repo_hook.
- Opprett/hent API-key + epost for StatusCake
- Opprett/hent API-key + epost for Heroku
- Åpne infra repo.
- Endre navn på credentials_example.yml til credentials.yml.
- Legg inn verdier i credentials.yml slik at det samsvarer med verdiene hentet i de tidligere stegene.
- Gjør det samme i terraform/variables.tf (navn er valgfritt).
- Commit og push endringer gjort i terraform/variables.tf
- Start en Concourse container
- Kjør følgende kommandoer:
fly -t devops-exam login --concourse-url http://127.0.0.1:8080 -u admin -p admin
fly -t devops-exam set-pipeline -p exam-pipeline -c concourse/pipeline.yml -l credentials.yml
fly -t devops-exam unpause-pipeline -p exam-pipeline
- Gå til http://localhost:8080 og logg inn som: U: admin P: admin.
- Velg infra og kjør bygg (+).
- Når infra er ferdig så kan build-jobben kjøres. Enten manuelt, eller ved å commite til app-repoet.
- Vent til jobbene har kjørt ferdig.
- Åpne appen i Heroku.
- På grunn av begrensinger i Heroku Container Registry så går det ikke å promotere applikasjonen til flere miljøer. Skulle man gjort dette så måtte man heller utvide pipelinen.
- Oppgaven har vært løst i Windows OS. Windows spiller ikke alltids helt på lag med Git når det gjelder tillatelser. Hvis du ser
Backend error: Exit status: 500 ... permission denied ...
i pipelinen så mågit update-index --chmod=+x script.sh
kjøres på shell-scriptene. - Under testing så forsøker koden å logge metrics til Hosted Graphite, og kaster exceptions som et resultat av det. Dette har ikke en innvirkning på resultatet av testene, men er dårlig praksis.
- Ved opprettelse av pipeline så vil build-steget starte automatisk, denne vil feile grunnet manglende infrastruktur. Infra må kjøres først.
- Sporadisk så feiler Heroku å binde appen til en port. Da er det bare å kjøre på nytt.
- Sporadisk så feiler Concourse i å hente image fra Docker Hub. Da er det bare å kjøre på nytt.