07/01/2019 - 08/01/2019
Making the build process easy
Providing a uniform build system
Providing quality project information
Providing guidelines for best practices development
Allowing transparent migration to new features
1/2
2/2
1/2
2/2
FROM ubuntu:15.04
COPY . /app
RUN make /app
CMD python /app/app.py
Dockerfile
docker build -t image_test .
docker run image_test
docker ps
docker image ls
# ou
docker images
docker rm <CONTAINER_ID>
docker rmi <IMAGE_ID>
L'application Maven (sources et tests) est hébergée sur un repository Github
# via SSH
$ git clone git@github.com:<login-github>/sample-application-students.git
# ou via https
$ git clone https://github.com/<login-github>/sample-application-students.git
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64
# Run Unit Tests
export MAVEN_OPTS="-Dhttp.proxyHost=proxy.insa-rouen.fr -Dhttp.proxyPort=3128 -Dhttps.proxyHost=proxy.insa-rouen.fr -Dhttps.proxyPort=3128"
<settings>
<localRepository>/tmp/maven2</localRepository>
<proxies>
<proxy>
<active>true</active>
<protocol>http</protocol>
<host>proxy.insa-rouen.fr</host>
<port>3128</port>
</proxy>
</proxies>
</settings>
Configuration du proxy et localRepository
Avec le wrapper (évite d'avoir à installer mvn en local)
~/.m2/settings.xml
# Run Unit Tests
# Avec le wrapper
./mvnw clean test
# Sans si mvn est déjà installé
mvn clean test
docker-machine create \
--engine-env HTTP_PROXY=http://proxy.insa-rouen.fr:3128 \
--engine-env HTTPS_PROXY=http://proxy.insa-rouen.fr:3128 \
--engine-env NO_PROXY=registry.insa-rouen.fr \
-d virtualbox \
--virtualbox-boot2docker-url file:///opt/iso/boot2docker.iso \
--virtualbox-cpu-count 2 \
--virtualbox-hostonly-cidr 10.0.0.1/24 \
default
eval $(docker-machine env default)
docker version
docker pull takimatraining/devops-training-db
mvn verify \
-Dspring.datasource.url=jdbc:mysql://10.0.0.100:3306/SchoolOrganisation
java -jar ./target/*.jar \
--spring.datasource.url=jdbc:mysql://10.0.0.100:3306/SchoolOrganisation
docker run -d -p 3306:3306 takimatraining/devops-training-db
Documentation ici
Test
Quality
Registry
Deploy
Automatiser les tests unitaires et d'intégration
Analyse de la qualité du code
Hébergement de l'application conteneurisée sur un registry
Déploiement de l'application en production
GitHub
Hook on commit
Travis CI
language: java
jdk: oraclejdk8
.travis.yml
Travis CI
takimatraining/devops-training-db
Pull l'image de la BD
Lancement de la BD en tâche de fond
Docker Hub
takimatraining/devops-training-db
# Define the services to use
services:
- docker
before_install:
- sudo service mysql stop
- docker pull takimatraining/devops-training-db
- docker run -d -p 127.0.0.1:3306:3306 takimatraining/devops-training-db
.travis.yml
# Run Unit Test and Integration Tests
script:
- mvn verify
.travis.yml
# Create your branch
$ git checkout -b ci_config
# Add the pipeline script to git
$ git add .travis.yml
# Commit
$ git commit -m "ci: first version of the pipeline to automate unit and integration tests"
# Push
$ git push --set-upstream origin ci_config
Rendez-vous sur https://travis-ci.org/ dans la page de votre projet et vérifiez que le build se fait sans erreur
Maven télécharge beaucoup de dépendances et les stocke dans ~/.m2/repository
# Cache the .m2 folder to prevent redownloading dependencies on each build
cache:
directories:
- "$HOME/.m2/repository"
.travis.yml
Accéder à SonarCloud
Aller dans My Account > Security
Générer un nouveau token et le copier précieusement
Chiffrer ce token :
Ajouter ce token sécurisé à votre .travis.yml en variable d'environnement
# travis encrypt should be installed
# else :
# $ gem install travis
$ travis encrypt SONAR_TOKEN=<TOKEN>
# Environment variables are strings (double quotes)
# Example:
# - secure: "DpR1th9rZvLMX0......"
env:
global:
- secure: <ENCRYPTED_TOKEN>
.travis.yml
# The pipe (|) is useful to create multiline scripts
script:
- |
mvn clean install sonar:sonar \
-Dsonar.projectKey=<SONAR_PROJECT_KEY> \
-Dsonar.organization=<SONAR_ORGANISATION_KEY> \
-Dsonar.host.url=https://sonarcloud.io \
-Dsonar.login=$SONAR_TOKEN
.travis.yml
Pour ceux qui sont en avance, essayez de configurer une Quality Gate avec 95% de couverture de test, puis commentez un test pour vérifier que votre build est bien en échec
Réception d'une notification en cas d'échec du build
On peut configurer des notifications vers une multitude de plateformes :
Slack
...
On veut ici qu'un mail soit envoyé à la personne qui vient de commit en cas d'échec du build
# Send an email to the commiter if the pipeline failed at some point
notifications:
email:
on_failure: always
.travis.yml
FROM openjdk:8-jre
COPY target/*.jar /app.jar
EXPOSE 8080
CMD ["java", "-jar", "app.jar", "--spring.datasource.url=jdbc:mysql://db:3306/SchoolOrganisation"]
Dockerfile
docker build -t java-app-image .
docker run --network net -p 80:8080 --name app java-app-image
docker run -d -p 3306:3306 --network net --name db takimatraining/devops-training-db
docker network create net
La pousser sur un registry : Docker Hub
Se connecter à Docker Hub
Créer un repository sur Docker Hub
exemple : <login>/sample-application
Chiffrer votre login et mot de passe Docker Hub
$ travis encrypt DOCKER_USER=<docker_user>
$ travis encrypt DOCKER_PASS=<docker_pass>
# Build an image containing the .jar and push it to the Docker Hub
script:
...
# Login to Docker hub
- docker login -u $DOCKER_USER -p $DOCKER_PASS
# Tag text according to the branch
- export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH; fi`
# Image name
- export IMAGE_NAME=<login>/sample-application-students
# Build the image (see Dockerfile) and tag it with the commit ID
- docker build -t $IMAGE_NAME:$TRAVIS_COMMIT .
# Retag the image with the previously choosen tag
- docker tag $IMAGE_NAME:$TRAVIS_COMMIT $IMAGE_NAME:$TAG
# Push the tagged image to Docker Hub
- docker push $IMAGE_NAME:$TAG
.travis.yml
env:
global:
# [...] other tokens
- secure: <encrypted Docker Username>
- secure: <encrypted Docker Password>
.travis.yml
achille-lacoin.takima.io
ali-bellamlihmamou.takima.io
alice-giraud.takima.io
allan-milhomme.takima.io
ana-calin.takima.io
andres-morenosolano.takima.io
antoine-questel.takima.io
arnaud-quillent.takima.io
aurelien-toutain.takima.io
benjamin-peltier.takima.io
corentin-poriel.takima.io
corentin-potron.takima.io
damien-toomey.takima.io
darya-orel.takima.io
emma-bonhomme.takima.io
flavien-cocu.takima.io
flavien-disson.takima.io
francisco-nobrefilho.takima.io
gabriel-alencarmedeiros.takima.io
gauthier-wiemann.takima.io
guillaume-dron.takima.io
haitam-zouhair.takima.io
handi-zhang.takima.io
imane-lafnoune.takima.io
jeanfrancois-robin.takima.io
leopold-masson.takima.io
louis-ulmer.takima.io
manon-ferchaud.takima.io
matthias-sesboue.takima.io
matthieu-pavageau.takima.io
maxime-bourgeois.takima.io
mehdi-abouzaid.takima.io
michel-livney.takima.io
monica-salama.takima.io
nicolas-kempf.takima.io
paul-cadorel.takima.io
pierre-bernard.takima.io
pierrefrancois-giraud.takima.io
quentin-enjalbert.takima.io
quentin-lautridou.takima.io
sean-manzambi.takima.io
tanya-angelova.takima.io
theo-couppey.takima.io
thibault-sauron.takima.io
thibaut-emion.takima.io
thomas-constum.takima.io
thomas-digregorio.takima.io
timothee-guiraud.takima.io
vitor-martinbordini.takima.io
victoria-daura.takima.io
weihao-zhou.takima.io
yannis-pages.takima.io
ssh-keygen -t rsa -b 4096 -C 'build@travis-ci.org' -f ./travis_deploy_rsa
ssh -i /path/to/private_key training@<login>.takima.io
docker run --name=db --restart=always --volume mysql-data:/var/lib/mysql \
--network net -d takimatraining/devops-training-db
sudo docker network create net
travis login --org
travis encrypt-file path/to/private/key --add
before_install:
...
# Prepare deploy
- openssl aes-256-cbc -K $encrypted_xxxxxxx_key -iv $encrypted_xxxxxxxxxxx_iv
-in travis_deploy_rsa.enc -out /tmp/travis_deploy_rsa -d # Généré par travis encrypt-file
- chmod 600 /tmp/travis_deploy_rsa
- eval "$(ssh-agent -s)"
- ssh-add /tmp/travis_deploy_rsa
- echo -e "Host $SERVER_HOST\n\tStrictHostKeyChecking no\n" >> ~/.ssh/config
...
# Deploy updated container over ssh
deploy:
provider: script
script: ssh -i /tmp/travis_deploy_rsa $DEPLOY_USER@$SERVER_HOST "sudo docker pull $IMAGE_NAME:$TAG && sudo docker rm -f app || true && sudo docker run -d --network net -p 80:8080 --name app $IMAGE_NAME:$TAG"
on:
branch: master
.travis.yml
Votre application est en prod!
http://<YOUR-hostname>.takima.io/departments/ASI/students
[![SonarCloud Coverage](https://sonarcloud...)](https://sonarcloud...)