Práctica de proceso de CI simple basada en Jenkins+Docker+Git (Parte 1)
En la era actual de Internet, con el aumento continuo de la complejidad del desarrollo de software, el desarrollo de software y la gestión de versiones se están volviendo cada vez más importantes. En la actualidad, se ha formado un conjunto de procesos estándar, cuyos componentes más importantes son la integración continua , la entrega continua y la implementación . Aquí, usamos un caso simple para practicar el proceso de CI en JD Cloud.
1. Introducción a los conceptos y herramientas relacionados
1.1 CI/CD
Integración continua (CI), que es un proceso automatizado para desarrolladores. CI exitosa significa que los nuevos cambios en el código de la aplicación se crean, prueban y fusionan regularmente en el repositorio compartido. Esta solución puede resolver el problema de tener demasiadas ramas de aplicaciones en un desarrollo, lo que genera conflictos.
Entrega continua (CD), generalmente cuando los cambios en la aplicación por parte de los desarrolladores se prueban automáticamente y se cargan en un repositorio (como GitHub o un registro de contenedor), que luego el equipo de operaciones implementa en un entorno de producción en vivo . Esto tiene como objetivo abordar la visibilidad y la comunicación deficientes entre los equipos de desarrollo y operaciones. Por lo tanto, el propósito de la entrega continua es garantizar que el esfuerzo requerido para implementar código nuevo sea el menor posible.
La implementación continua (CD), otro tipo de "CD", hace referencia a la publicación automática de los cambios del desarrollador desde el repositorio hasta la producción para que los consuman los clientes. Su objetivo principal es abordar el problema de la sobrecarga de los equipos de operaciones debido a los procesos manuales que ralentizan la entrega de aplicaciones.
1.2 Jenkins
Jenkins es un proyecto de software de código abierto. Es una herramienta de integración continua desarrollada en base a Java
1.3 ventana acoplable
Docker es un motor contenedor de aplicaciones de código abierto que permite a los desarrolladores empaquetar sus aplicaciones y dependencias en un contenedor portátil y luego publicarlo en cualquier máquina Linux popular, y también puede implementar la virtualización. Los contenedores usan completamente un mecanismo de caja de arena y no habrá interfaces entre ellos.
1.4 Git
Git es un sistema de control de versiones distribuidas de código abierto que proporciona un repositorio de código que puede manejar de manera efectiva y rápida la administración de versiones de proyectos, desde pequeños hasta muy grandes. Git es Linus Torvalds Linus\ TorvaldsLin u s T o val ds es un software de control de versiones de código abierto desarrollado para ayudar a administrar el desarrollo del kernel de Linux .
2. Preparación preliminar
2.1 Diagrama de diseño del proceso de CI
2.2 Flujo de trabajo
- Los desarrolladores envían el código al repositorio de Git.
- Jenkins activa manualmente/temporizando las compilaciones de proyectos.
- Jenkins extrae el código, lo compila, empaqueta la imagen y la envía al almacén espejo.
- Jenkins crea un contenedor en el host de Docker y lo publica.
2.3 Planificación del entorno de acogida
nombre de host | introducir | red pública | intranet |
---|---|---|---|
docker-jenkins |
Construcción de proyectos; extracción de código, compilación de código, duplicación de paquetes, transferencia de duplicación a almacén duplicada | 116.196.85.174 | 10.0.0.20 |
docker-git |
repositorio de código | 116.196.86.207 | 10.0.0.22 |
docker-harbor |
Almacén de espejo privado | 116.196.88.91 | 10.0.0.21 |
buildimage |
crear imagen acoplable | 116.196.89.139 | 10.0.0.4 |
3. Creación del anfitrión
Cree 4 hosts en la nube en la consola de JD Cloud, dirección: https://console.jdcloud.com/
La configuración es la siguiente, la cantidad se selecciona directamente al comprar 4 44. Una vez completada la compra, modifique el nombre, respectivamente:docker-jenkins
,docker-git
,docker-harbor
,buildimage
.
Después de crear y modificar el nombre de la siguiente manera:
4. Configuración del entorno
4.1 alojamiento en la nube docker-git
(1) Modifique el nombre de host a:docker-git
[root@112 ~]# hostnamectl set-hostname docker-git
[root@112 ~]# hostname docker-git
[root@112 ~]# logout
[root@docker-git ~]#
Ctrl+D
Vuelva a iniciar sesión después de cerrar la sesión para que surta efecto.
(2) Implementar el almacén de versiones de código Git
Instalar:
[root@docker-git ~]# yum install git -y
configurar git
usuario:
[root@docker-git ~]# useradd git
[root@docker-git ~]# passwd git
Crear biblioteca:
[root@docker-git ~]# su git
[git@docker-git root]$ cd
[git@docker-git ~]$ mkdir tomcat-java-demo.git
[git@docker-git ~]$ cd tomcat-java-demo.git/
[git@docker-git tomcat-java-demo.git]$ git --bare init
Initialized empty Git repository in /home/git/tomcat-java-demo.git/
[git@docker-git tomcat-java-demo.git]$ ls
branches config description HEAD hooks info objects refs
[git@docker-git tomcat-java-demo.git]$
4.2 Alojamiento en la nube docker-jenkins
(1) Modifique el nombre de host a:docker-jenkins
[root@113 ~]# hostnamectl set-hostname docker-jenkins
[root@113 ~]# hostname docker-jenkins
[root@113 ~]# logout
[root@docker-jenkins ~]#
Ctrl+D
Vuelva a iniciar sesión después de cerrar la sesión para que surta efecto.
(2) Implementación del entorno Jenkins
jdk
Entorno de implementación y maven
:
[root@docker-jenkins tomcat-java-demo]# cd
[root@docker-jenkins ~]# mkdir tools
[root@docker-jenkins ~]# cd tools
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/jdk-8u191-linux-x64.tar.gz;tar zxf jdk-8u191-linux-x64.tar.gz;mv jdk1.8.0_191/ /usr/local/;ln -s /usr/local/jdk1.8.0_191/ /usr/local/jdk;
[root@docker-jenkins tools]# vim /etc/profile
######## JDK #######
JAVA_HOME=/usr/local/jdk1.8.0_191
JAVA_BIN=/usr/local/jdk1.8.0_191/bin
PATH=$PATH:$JAVA_BIN
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
[root@docker-jenkins tools]# source /etc/profile
[root@docker-jenkins tools]# java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/apache-maven-3.5.0-bin.tar.gz;tar zxf apache-maven-3.5.0-bin.tar.gz;mv apache-maven-3.5.0 /usr/local/maven
[root@docker-jenkins tools]#
Instale Jenkins
, descargue Tomcat
el paquete binario y war
mueva el paquete a webapps
.
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/jenkins.war
[root@docker-jenkins tools]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/apache-tomcat-8.5.38.tar.gz
[root@docker-jenkins tools]# tar zxf apache-tomcat-8.5.38.tar.gz
[root@docker-jenkins tools]# ls
apache-maven-3.5.0-bin.tar.gz apache-tomcat-8.5.38 apache-tomcat-8.5.38.tar.gz jdk-8u191-linux-x64.tar.gz jenkins.war
[root@docker-jenkins tools]# mv apache-tomcat-8.5.38 /usr/local/tomcat-jenkins
[root@docker-jenkins tools]# ls /usr/local/tomcat-jenkins/webapps/
docs examples host-manager manager ROOT
[root@docker-jenkins tools]# rm -rf /usr/local/tomcat-jenkins/webapps/*
[root@docker-jenkins tools]# mv jenkins.war /usr/local/tomcat-jenkins/webapps/ROOT.war
[root@docker-jenkins tools]# ll /usr/local/tomcat-jenkins/webapps/
total 75520
-rw-r--r--. 1 root root 77330344 Mar 15 00:55 ROOT.war
[root@docker-jenkins tools]# cd /usr/local/tomcat-jenkins/bin/
[root@docker-jenkins bin]# ./startup.sh
Using CATALINA_BASE: /usr/local/tomcat-jenkins
Using CATALINA_HOME: /usr/local/tomcat-jenkins
Using CATALINA_TMPDIR: /usr/local/tomcat-jenkins/temp
Using JRE_HOME: /usr/local/jdk1.8
Using CLASSPATH: /usr/local/tomcat-jenkins/bin/bootstrap.jar:/usr/local/tomcat-jenkins/bin/tomcat-juli.jar
Tomcat started.
[root@docker-jenkins bin]#
Después del inicio, acceda al navegador ( docker-jenkins
): http://Jenkins主机公网IP:8080/
, ingrese la contraseña cuando se le solicite e inicie sesión.
En /root/.jenkins/secrets/initialAdminPassword
el archivo, verifique la contraseña y complétela.
Instale complementos según sus propias necesidades.
Configurar administradores.
Empezar Jenkins
_
(3) Instale DOCKER CE (edición comunitaria de Docker)
Instale los paquetes necesarios:
yum install -y yum-utils device-mapper-persistent-data lvm2 -y
Configure un repositorio estable:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y
Instalación DOCKER CE
(este paso es lento, ¡espere pacientemente!):
yum install docker-ce docker-ce-cli containerd.io -y
empezar Docker
:
systemctl start docker
4.3 Docker-Harbor del host en la nube
(1) Modifique el nombre de host a:docker-harbor
[root@c-dfjgjesgqe ~]# hostnamectl set-hostname docker-harbor
[root@c-dfjgjesgqe ~]# hostname docker-harbor
Ctrl+D
Vuelva a iniciar sesión después de cerrar la sesión para que surta efecto.
Harbor
(2) Implementación de almacén espejo a nivel empresarial
Habor es un almacén espejo de contenedores de código abierto de VMWare. De hecho, Habor ha realizado las correspondientes extensiones de nivel empresarial en Docker Registry, ganando así una aplicación más amplia. Estas nuevas características de nivel empresarial incluyen: interfaz de usuario de administración , control de acceso basado en roles , integración AD/LDAP y registros de auditoría , etc., suficientes para satisfacer las necesidades básicas de la empresa.
Introducción a cada componente de Harbor:
componentes | Función |
---|---|
harbor-adminserver |
Centro de gestión de configuración |
harbor-db |
base de datos mysql |
harbor-jobservice |
responsable de reflejar |
harbor-log |
registrar registro de operaciones |
harbor-ui |
Páginas de gestión web y API |
nginx |
Proxy de front-end, responsable de las páginas de front-end y el reenvío de carga/descarga espejo |
redis |
conversación |
registry |
espejo de almacenamiento |
Puerto instalado con 3 33 formas
- Instalación en línea: descargue imágenes relacionadas con Harbour desde Docker Hub, por lo que el paquete de instalación es muy pequeño.
- Instalación sin conexión: el paquete de instalación contiene las imágenes relevantes para la implementación, por lo que el paquete de instalación es relativamente grande.
- Instalador de OVA: cuando el usuario tiene un entorno de vCenter, use este instalador para iniciar Harb después de implementar OVA.
Aquí usamos el segundo método de instalación fuera de línea para construir un almacén espejo https
basado en acceso harbor
.
1) Descargue y descomprima el paquete de instalación fuera de línea
harbor
Dirección de descarga del paquete sin conexión: https://github.com/goharbor/harbor/releases
Para facilitar la descarga, también guardé una copia en JD Cloud Object Storage, que puede ser directamente wget
:https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/harbor-offline-installer-v1.7.4.tgz
[root@docker-harbor ~]# yum install vim wget openssl -y
[root@docker-harbor ~]# wget https://pocenv-hcc.oss.cn-north-1.jcloudcs.com/harbor-offline-installer-v1.7.4.tgz
[root@docker-harbor ~]# tar zxf harbor-offline-installer-v1.7.4.tgz
[root@docker-harbor ~]# cd harbor
[root@docker-harbor harbor]# ll
total 570744
drwxr-xr-x 3 root root 23 Apr 1 15:05 common
-rw-r--r-- 1 root root 939 Mar 4 15:33 docker-compose.chartmuseum.yml
-rw-r--r-- 1 root root 975 Mar 4 15:33 docker-compose.clair.yml
-rw-r--r-- 1 root root 1434 Mar 4 15:33 docker-compose.notary.yml
-rw-r--r-- 1 root root 5608 Mar 4 15:33 docker-compose.yml
-rw-r--r-- 1 root root 8033 Mar 4 15:33 harbor.cfg
-rw-r--r-- 1 root root 583086399 Mar 4 15:33 harbor.v1.7.4.tar.gz
-rwxr-xr-x 1 root root 5739 Mar 4 15:33 install.sh
-rw-r--r-- 1 root root 11347 Mar 4 15:33 LICENSE
-rw-r--r-- 1 root root 1263409 Mar 4 15:33 open_source_license
-rwxr-xr-x 1 root root 36337 Mar 4 15:33 prepare
2) Certificado http autofirmado
Obtener un certificado de certificación autorizado.
[root@docker-harbor harbor]# mkdir ssl
[root@docker-harbor harbor]# cd ssl
[root@docker-harbor ssl]# openssl genrsa -out ca.key 4096
Generating RSA private key, 4096 bit long modulus
...................................++
.....................................................................................................................................++
e is 65537 (0x10001)
[root@docker-harbor ssl]# openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com" -key ca.key -out ca.crt
[root@docker-harbor ssl]# ll
total 8
-rw-r--r-- 1 root root 2037 Apr 4 18:41 ca.crt
-rw-r--r-- 1 root root 3243 Apr 4 18:41 ca.key
Obtenga el certificado del servidor.
1.Create your own Private Key:
[root@docker-harbor ssl]# openssl genrsa -out reg.marin.com.key 4096
Generating RSA private key, 4096 bit long modulus
.............................................++
............................................................................................................................................................................................................................++
e is 65537 (0x10001)
[root@docker-harbor ssl]# openssl req -sha512 -new -subj "/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com" -key reg.marin.com.key -out reg.marin.com.csr
[root@docker-harbor ssl]# ll
total 16
-rw-r--r-- 1 root root 2037 Apr 4 18:41 ca.crt
-rw-r--r-- 1 root root 3243 Apr 4 18:41 ca.key
-rw-r--r-- 1 root root 1708 Apr 4 18:42 reg.marin.com.csr
-rw-r--r-- 1 root root 3243 Apr 4 18:42 reg.marin.com.key
[root@docker-harbor ssl]# cat > v3.ext <<-EOF
> authorityKeyIdentifier=keyid,issuer
> basicConstraints=CA:FALSE
> keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
> extendedKeyUsage = serverAuth
> subjectAltName = @alt_names
>
> [alt_names]
> DNS.1=reg.marin.com
> DNS.2=reg.marin
> DNS.3=marin
> EOF
[root@docker-harbor ssl]# openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in reg.marin.com.csr -out reg.marin.com.crt
Signature ok
subject=/C=ZH/ST=ShangHai/L=ShangHai/O=example/OU=Personal/CN=reg.marin.com
Getting CA Private Key
[root@docker-harbor ssl]# ll
total 28
-rw-r--r-- 1 root root 2037 Apr 4 18:41 ca.crt
-rw-r--r-- 1 root root 3243 Apr 4 18:41 ca.key
-rw-r--r-- 1 root root 17 Apr 4 18:44 ca.srl
-rw-r--r-- 1 root root 2098 Apr 4 18:44 reg.marin.com.crt
-rw-r--r-- 1 root root 1708 Apr 4 18:42 reg.marin.com.csr
-rw-r--r-- 1 root root 3243 Apr 4 18:42 reg.marin.com.key
-rw-r--r-- 1 root root 260 Apr 4 18:43 v3.ext
Modifique harbor
la configuración y Docker
configure el certificado del servidor para key
y CA
.
[root@docker-harbor ssl]# cd ..
[root@docker-harbor harbor]# vim harbor.cfg
......
hostname = reg.marin.com
ui_url_protocol = https
ssl_cert = ./ssl/reg.marin.com.crt
ssl_cert_key = ./ssl/reg.marin.com.key
harbor_admin_password = 123456
......
La contraseña también se puede dejar sin cambios, el usuario de inicio de sesión predeterminado: admin
, contraseña: Harbor12345
.
El demonio de Docker interpretará .crt
el archivo como un certificado de CA y .cert
el archivo como un certificado de cliente, primero .crt
convirtiendo el archivo en un .cert
archivo.
[root@docker-harbor harbor]# cd ssl/
[root@docker-harbor ssl]# mkdir -p /etc/docker/certs.d/reg.marin.com
[root@docker-harbor ssl]# openssl x509 -inform PEM -in reg.marin.com.crt -out reg.marin.com.cert
[root@docker-harbor ssl]# cp reg.marin.com.cert reg.marin.com.key ca.crt /etc/docker/certs.d/reg.marin.com/
¡Este éxito autofirmado!
3) Instalar Docker CE
Instale los paquetes necesarios:
yum install -y yum-utils device-mapper-persistent-data lvm2 -y
Configure un repositorio estable:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo -y
Instalación DOCKER CE
(este paso es lento, ¡espere pacientemente!):
yum install docker-ce docker-ce-cli containerd.io -y
empezar Docker
:
systemctl start docker
hello-world
Verifique que se instaló correctamente ejecutando el espejo Docker CE
:
docker run hello-world
4) Inicialización y verificación de la instalación
Instalación inicial:
[root@docker-harbor ssl]#
[root@docker-harbor ssl]# cd ..
[root@docker-harbor harbor]# ./prepare
Generated and saved secret to file: /data/secretkey
Generated configuration file: ./common/config/nginx/nginx.conf
Generated configuration file: ./common/config/adminserver/env
Generated configuration file: ./common/config/core/env
Generated configuration file: ./common/config/registry/config.yml
Generated configuration file: ./common/config/db/env
Generated configuration file: ./common/config/jobservice/env
Generated configuration file: ./common/config/jobservice/config.yml
Generated configuration file: ./common/config/log/logrotate.conf
Generated configuration file: ./common/config/registryctl/env
Generated configuration file: ./common/config/core/app.conf
Generated certificate, key file: ./common/config/core/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
Ejecute install.sh
el script para instalar harbor
el repositorio.
NOTA: install.sh
Antes de ejecutar el script, compruebe dos cuestiones:
docker-compose
Ya sea para instalarlo, de lo contrarioinstall.sh
, fallará cuando se ejecute e informará "✖ Primero debe instalar docker-compose (1.7.1+) usted mismo y ejecutar este script nuevamente".docker
install.sh
Si el servicio se ejecuta con normalidad; de lo contrario, fallará cuando se ejecute e informará el error "No se puede conectar al demonio Docker en unix:///var/run/docker.sock. ¿Se está ejecutando el demonio Docker?"
instalar Compose
_
Ejecute este comando para descargar Docker Compose
la versión estable actual de:
curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Aplicar permisos ejecutables al binario:
chmod +x /usr/local/bin/docker-compose
Ejecute install.sh
el script para instalar harbor
el repositorio:
[root@docker-harbor harbor]# ./install.sh
[Step 0]: checking installation environment ...
Note: docker version: 18.09.4
Note: docker-compose version: 1.24.0
[Step 1]: loading Harbor images ...
bffe2a0fec66: Loading layer [==================================================>] 33.22MB/33.22MB
38e174bed467: Loading layer [==================================================>] 8.964MB/8.964MB
427e4936ae66: Loading layer [==================================================>] 35.77MB/35.77MB
3bfd5214250a: Loading layer [==================================================>] 2.048kB/2.048kB
f30df776629d: Loading layer [==================================================>] 3.072kB/3.072kB
f87afad43f43: Loading layer [==================================================>] 22.8MB/22.8MB
......
953717aa0afc: Loading layer [==================================================>] 22.8MB/22.8MB
Loaded image: goharbor/registry-photon:v2.6.2-v1.7.4
[Step 2]: preparing environment ...
Clearing the configuration file: ./common/config/adminserver/env
Clearing the configuration file: ./common/config/core/env
Clearing the configuration file: ./common/config/core/app.conf
Clearing the configuration file: ./common/config/core/private_key.pem
Clearing the configuration file: ./common/config/db/env
......
Generated certificate, key file: ./common/config/core/private_key.pem, cert file: ./common/config/registry/root.crt
The configuration files are ready, please use docker-compose to start the service.
[Step 3]: checking existing instance of Harbor ...
[Step 4]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating redis ... done
Creating registryctl ... done
Creating harbor-db ... done
Creating harbor-adminserver ... done
Creating registry ... done
Creating harbor-core ... done
Creating harbor-jobservice ... done
Creating harbor-portal ... done
Creating nginx ... done
✔ ----Harbor has been installed and started successfully.----
Now you should be able to visit the admin portal at https://reg.marin.com.
For more details, please visit https://github.com/goharbor/harbor .
Verificación de acceso al navegador.
Se requiere resolución de nombre de dominio para acceder al navegador, así que agregue: al archivo local hosts
( ) .C:\Windows\System32\drivers\etc\hosts
116.196.88.91 reg.marin.com
Visite: https://reg.marin.com
e inicie sesión.
Funcionamiento básico de la interfaz después de iniciar sesión:
- Crear un nuevo proyecto
test
.
- Crear un nuevo usuario
marin
.
- Establezca al usuario
marin
comotest
administrador del proyecto.