- Configuración entorno
- Arranque de los servicios
- Configuración
- Network
-
Instalar docker
-
Crear el workspace
- Tomamos de ejemplo el que está en demo:
|main --------gogs | --------jenkins | | | --------JENKINS_HOME (dar permisos sudo chown -R 1000:1000 jenkins/JENKINS_HOME/) --------nexus | | | --------NEXUS_DATA (dar permiso **sudo chown -R 200:200** nexus/NEXUS_DATA/) | --------nginx | | | --------sites-enable | | | --------gogs.conf | --------jenkins.conf | --------nexus.conf | nginx.conf docker-compose.yml
-
Añadir los host a nuestro host local
- 127.0.0.1 jenkins.ci-cd-meetup.com nexus.ci-cd-meetup.com git.ci-cd-meetup.com
-
Se recomienda instalar la herramienta scope para monitorizar contenedores https://github.com/weaveworks/scope
-
Arrancamos los contenedores.
$ docker-compose up -d
-
Comprobamos el estado de los contenedores con la herramienta que hemos instalado o con:
$ docker ps
Tendríamos que ver los siguientes contenedores
- demo_mysql_1
- demo_gogsl_1
- demo_nexus_1
- demo_gogsData_1
- demo_nginx_1
- demo_jenkins_1
Contenedor que se usará como punto de entrada para exponer los servicios al exterior. Desde aquí podemos exponer tanto por HTTP cómo por HTTPS.
Dispone de los volumenes
- nginx:/usr/share/nginx/html
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/sites-enable:/etc/nginx/sites-enable
Este volumen se usará para alojar las webs estáticas que queramos exponer.
Archivo que usaremos para configurar el servicio que hay dentro del contenedor de nginx
Volumen en el que incluiremos los diferentes virtual host
Nexus será nuestro repositorio de artefactos de todo tipo:
- npm
- maven
- docker hub (en desarrollo)
Una vez tengamos el servicio arrancado podemos crear los repositorios usando el api de nexus.
- create-repositories.sh
- repos.json
- Ejecución
#!/bin/bash
jsonFile=$1
printf "Creating Integration API Script from $jsonFile\n\n"
cat $jsonFile
curl -v -u user:pass --header "Content-Type: application/json" 'http://localhost:8081/service/rest/v1/script/' -d @$jsonFile
{
"name": "repositories",
"type": "groovy",
"content": "repository.createMavenHosted('maven-library-release'); repository.createMavenHosted('maven-library-snapshot'); repository.createNpmHosted('npm-snapshot'); repository.createNpmHosted('npm-release'); repository.createNpmProxy('npmjs-org','https://registry.npmjs.org'); repository.createNpmGroup('npm-all-pro',['npmjs-org', 'npm-release']); repository.createNpmGroup('npm-all-dev',['npmjs-org','npm-snapshot', 'npm-release'])"
}
$ sh create-repositories.sh repos.json
Con el script y el json anterior crearemos repositorios de desarrollo y de producción de npm, y un repositorio proxy que apunta al registry por defecto. Dos grupos uno para desarrollo que contiene el propio de desarrollo (snapshot) y el proxy; otro con el de produccion (release) y el proxy.
Nos dirigimos a http://nexus.ci-cd-meetup.com/#admin/security/realms y activamos npm bearer token realm
```conf
server {
listen 80;
server_name nexus.atresmedia.com;
# allow large uploads of files
client_max_body_size 1G;
# optimize downloading files larger than 1G
#proxy_max_temp_file_size 2G;
location / {
proxy_pass http://10.5.0.4:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
/*
Con ssl
location / {
proxy_pass http://10.5.0.4:8081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto "https";
}
*/
}
```
Servicio que vamos a usar para tener un repostorio de fuentes privado. Este repositorio es muy sencillo de configurar y no tiene nada que enviadarle a otras solucciones como pueden ser gitlab.
En la solucción que se está implementando en este caso está compuesto de:
- gogsData: Servicio que contiene los volumenes
- gogs: Es nuestro servicio de git en si
- mysql: Sistema de base de datos que va a acompañar al servicio.
A la hora de instalarlo le indicaremos la ruta y puerto de mysql que en este caso es 10.5.0.8:3306
.
Para configurarlo podemos usar el cheatset, el que se recomienda para este caso es el siguiente:
...
[service]
REGISTER_EMAIL_CONFIRM = false
ENABLE_NOTIFY_MAIL = false
ENABLE_CAPTCHA = true
REQUIRE_SIGNIN_VIEW = false
DISABLE_REGISTRATION = true
...
Jenkins será una de las piezas claves de nuestro sistema de ALM, ya que será el encargado de escuchar los cambios en nuestro repositorio y ejecutar una serie de tareas.
Durante el proceso de instalación nos pedirá un secret-key y procederemos con la instalación.
- Plugins
- Ejemplos de pipeline
Para empezar la instalación tendremos que conectarnos al contenedor por y hacer un cat de /var/jenkins_home/secrets/initialAdminPassword
```
$ docker exec -it demo_jenkins_1 bash
jenkins@d343463cf992:/$ cat /var/jenkins_home/secrets/initialAdminPassword
386c6a6d10de4699ac1c973ccfaae6a9
```
Escoger plugins:
- Junit
- NodeJs