Mini Projet Jenkins Docker Kubernetes
Mini Projet Jenkins Docker Kubernetes
Mini Projet Jenkins Docker Kubernetes
Mini Projet
Une architecture distribuée et/ou haute disponibilité
Jenkins
master/runner: - Docker - Kubernetes - Test
version: "2"
services:
jenkins:
image: <image_blueocean>
user: root
ports:
- "<port_jenkins_standard>"
volumes:
...
Pour le mapping de port choissez 8080 pour le port hote (le port http par
défaut voir cours sur le réseau). Le port de jenkins est 8080 .
Créez dans jenkins_simple les dossiers home et jenkins_data
La section volumes permet de monter des volumes docker :
Quand le logiciel est prêt la commande précédente affiche des triple lignes
d’étoiles * . Entre les deux est affiché un token du type:
05992d0046434653bd253e85643bae12 . Copiez ce token.
pipeline {
agent any
stages {
stage("Hello") {
steps {
[Pipeline] node
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Hello)
[Pipeline] echo
Hello World
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
Finished: SUCCESS
Cliquez sur le job hello est relancez le. Un nouveau pipeline démarre qui
s’exécute en une seconde.
Passons maintenant à un vrai pipeline de test. Pour cela nous devons d’abord avoir
une application à tester et un jeu de tests à appliquer. Nous allons comme dans les
TPs précédent utiliser une application python flask.
.gitignore
__pycache__
*.pyc
venv
app.py
#!/usr/bin/env python3
@app.route('/')
@app.route('/hello/')
def hello_world():
def hello_user(username):
if __name__ == '__main__':
requirements.txt
Click==7.0
Flask==1.0.2
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
Werkzeug==0.14.1
xmlrunner==1.7.7
test.py
#!/usr/bin/env python3
import unittest
import app
class TestHello(unittest.TestCase):
def setUp(self):
app.app.testing = True
self.app = app.app.test_client()
def test_hello(self):
rv = self.app.get('/')
def test_hello_hello(self):
rv = self.app.get('/hello/')
def test_hello_name(self):
name = 'Simon'
rv = self.app.get(f'/hello/{name}')
if __name__ == '__main__':
unittest.main()
source venv/bin/activate
pip install -r requirements.txt
résultat:
----------------------------------------------------------------------
OK
FROM python:3.7
WORKDIR /home/flask
ADD . .
EXPOSE 5000
USER flask
CMD ["./app.py"]
__pycache__
venv
Dockerfile
Lancez un registry docker en local sur le port 4000 avec docker run -p
4000:5000 registry LAISSEZ LE TOURNER.
tagguez l’image pour la poussez sur ce registry : docker tag flask_hello
localhost:4000/flask_hello
poussez la avec docker push localhost:4000/flask_hello
Jenkinsfile
pipeline {
agent {
kubernetes {
{
// this label will be the prefix of the generated pod's name
label 'jenkins-agent-my-app'
yaml """
apiVersion: v1
kind: Pod
metadata:
labels:
component: ci
spec:
containers:
- name: python
image: python:3.7
command:
- cat
tty: true
"""
stages {
stage('Test python') {
steps {
container('python') {
sh "python test.py"
triggers {
pollSCM('* * * * *')
Cet ajout indique à Jenkins de vérifier toute les minute si le dépôt à été mis à jour.
Mais sous avons aussi un Dockerfile qui va nous permettre de construire l’image et
la pousser automatiquement sur notre registry. Ajoutez le stage build suivant
stage('Build image') {
steps {
container('docker') {
Pour builder l’image le contexte du pipeline doit avoir docker disponible. Pour cela
nous allons ajouter un deuxième conteneur et un volume à notre pod jenkins
agent. Ajoutez un deuxième conteneur à la liste spec: containers: de la
configuration de l’agent kubernetes comme suit:
- name: docker
image: docker
command:
- cat
tty: true
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock
volumes:
- name: docker-sock
hostPath:
path: /var/run/docker.sock
deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pythontest
labels:
app: pythontest
spec:
selector:
matchLabels:
app: pythontest
strategy:
type: Recreate
replicas: 1
template:
metadata:
labels:
app: pythontest
spec:
containers:
- image: localhost:4000/pythontest:latest
name: pythontest
ports:
- containerPort: 5000
name: microport
service.yaml
apiVersion: v1
kind: Service
metadata:
name: pythontest
labels:
app: pythontest
spec:
ports:
- port: 5000
nodePort: 31000
selector:
app: pythontest
type: NodePort
stage('Deploy') {
steps {
container('kubectl') {
Pour exécuter ces commande il nous faut kubectl dans le pod. Ajoutons pour cela
un conteneur kubectl dans le pod à la suite du conteneur docker précédemment
ajouté et avant la section volumes: :
- name: kubectl
- cat
tty: true
def test_new_route(self):
rv = self.app.get(f'/feature/{name}')