CI CD putki - DigiaMinions/Project GitHub Wiki

Pipeline

CI/CD putki on toteutettu seuraavilla palikoilla:

##1. AWS CodePipeline

  • Putken palikoiden orkestrointi tapahtuu AWS Codepipelinellä. (OHJE)
  • CodePipeline toimi kuin junan vessa, ei kummempia huomioita.

##2. Github

  • Versionhallintaan käytetään Githubia.
  • Automaattista deploymenttiä varten Githubin repoon on määritelty kaksi serviceä: AWS CodeDeploy ja Github Auto-Deployment. (OHJE)
  • Githubia varten luotiin IAM user, jolla on oikeudet CodeDeployhin:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "codedeploy:GetDeploymentConfig",
        "codedeploy:RegisterApplicationRevision",
        "codedeploy:GetApplicationRevision",
        "codedeploy:CreateDeployment"
      ],
      "Effect": "Allow",
      "Resource": "*"
    }
  ]
}

##3. AWS CodeBuild

  • Koontipalvelimena käytetään AWS CodeBuildia. Koontipalvelimen perinteinen tehtävä on koodin kääntäminen yhteisellä alustalla (eliminoi ongelman "Kyllä tämä minun koneellani kääntyi").
  • Projektimme koodikielinä käytetään JavaScriptiä ja Pythonia. Nämä kielet ovat tulkattavia (JS tulkataan suoraan selaimessa, Python omalla tulkillaan), joten niistä ei tarvitse kääntää erillistä suoritettavaa tiedostoa.
  • Täten koontipalvelimemme ainoaksi tehtäväksi jäi testien ajaminen ennen kuin koodit deployataan web-serverille.
  • CodeBuild toimii buildspec.yml tiedostossa olevien ohjeiden mukaan, jonka tulee löytyä repon juurihakemistosta:
---
phases:
  install:
    commands:
      - "npm install"
  build:
    commands: 
      - "echo Build started on `date`"
      - "npm test"
  post_build:
    commands: 
      - "echo Build completed on `date`"
artifacts:
  files:
    - '**/*'
version: 0.1
  • JavaScript koodien testit ajetaan komennolla npm test. Testeihin käytetään Jest:iä ja ne löytyvät reposta tests hakemiston alta. Python koodeille ei ole tehty testejä (vielä).

##4. AWS CodeDeploy

  • Koodien deployment web-serverille (EC2) tapahtuu AWS CodeDeployllä. Tähän putken viimeiseen vaiheeseen siirrytään, jos testit menevät läpi.
  • EC2 koneelta tulee löytyä CodeDeploy agent, joka voidaan asentaa scriptillä:
#!/bin/bash
yum -y update
yum install -y ruby
yum install -y aws-cli
cd /home/ec2-user
aws s3 cp s3://aws-codedeploy-eu-west-1/latest/install . --region eu-west-1
chmod +x ./install
./install auto
  • Deployment tapahtuu appspec.yml tiedostossa olevien ohjeiden mukaan, jonka tulee löytyä repon juurihakemistosta:
version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/release
hooks:
  BeforeInstall:
    - location: Scripts/installnode.sh
      runas: root
    - location: Scripts/clean_old_deployment.sh
      runas: root
  AfterInstall:
    - location: Scripts/startnode.sh
      runas: root 
  • Deploymentin yhteydessä ajetaan muutama scripti (ennen asennusta ja sen jälkeen):

installnode.sh

#!/bin/sh
curl -sL https://rpm.nodesource.com/setup_4.x | bash - # run script to get node package
yum -y install nodejs # install node via yum
  • Käytimme EC2 koneemme käyttiksenä Amazon Linux AMIa, jonka paketinhallintaohjelma on Yum. Yumista ei löydy suoraan NodeJS pakettia, jonka takia se haetaan scriptillä ensin.

clean_old_deployment.sh

#!/bin/sh
rm -rf /home/ec2-user/release/
  • Poistaa vanhan deploymentin filut uusien tieltä. CodeDeploy antoi "File already exists..." erroria, josta päästiin eroon tekemällä näin.

startnode.sh

#!/bin/sh
iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 9000 # redirect port 80 (http) to 9000 (node)
cd /home/ec2-user
cp -R .env release/ # copy .env to release folder
cd /home/ec2-user/release
npm install --production # install node dependencies locally
npm install forever -g # install forever globally
killall node # kill existing node processes
npm run build # run scripts (webpack bundle etc)
forever start server.js # start node via forever
  • Asentaa Noden dependencyt ja tekee muita tarvittavia alustuksia, jonka jälkeen käynnistää serverin forever:illä.
  • Tämä scripti ajetaan myös koneen käynnistyksen yhteydessä (scriptin ajo lisätään filuun /etc/rc.local).

Muita CodeDepoloy huomioita

  • Käyttämästämme EC2 koneesta (t2.micro) loppui kovalevytila kesken, koska CodeDeploy säilyttää oletuksena 5 viimeisintä deploymenttiä kaikkine filuineen, myös koko node_modules kansion.
  • Nämä vanhat deploymentit löytyvät /opt/codedeploy-agent/deployment-root/ hakemistosta. Säilytettävien deploymenttien määrää voidaan muuttaa editoimalla filua /etc/codedeploy-agent/conf/codedeployagent.yml (:max_revisions).