CI CD putki - DigiaMinions/Project GitHub Wiki
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).