[CI/CD] Práctica de proceso de CI simple basada en Jenkins+Docker+Git (Parte 1)

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

inserte la descripción de la imagen aquí

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.

inserte la descripción de la imagen aquí

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.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Después de crear y modificar el nombre de la siguiente manera:

inserte la descripción de la imagen aquí

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+DVuelva 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 gitusuario:

[root@docker-git ~]# useradd git
[root@docker-git ~]# passwd git

inserte la descripción de la imagen aquí

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]$ 

inserte la descripción de la imagen aquí

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+DVuelva a iniciar sesión después de cerrar la sesión para que surta efecto.

(2) Implementación del entorno Jenkins

jdkEntorno 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 Tomcatel paquete binario y warmueva 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/initialAdminPasswordel archivo, verifique la contraseña y complétela.

inserte la descripción de la imagen aquí
Instale complementos según sus propias necesidades.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Configurar administradores.

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí
Empezar Jenkins_

inserte la descripción de la imagen aquí
(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+DVuelva 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 httpsbasado en acceso harbor.

1) Descargue y descomprima el paquete de instalación fuera de línea

harborDirecció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 harborla configuración y Dockerconfigure el certificado del servidor para keyy 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á .crtel archivo como un certificado de CA y .certel archivo como un certificado de cliente, primero .crtconvirtiendo el archivo en un .certarchivo.

[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

inserte la descripción de la imagen aquí

Instalación DOCKER CE(este paso es lento, ¡espere pacientemente!):

yum install docker-ce docker-ce-cli containerd.io -y

inserte la descripción de la imagen aquí

empezar Docker:

systemctl start docker

hello-worldVerifique que se instaló correctamente ejecutando el espejo Docker CE:

docker run hello-world

inserte la descripción de la imagen aquí
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.shel script para instalar harborel repositorio.

NOTA: install.shAntes de ejecutar el script, compruebe dos cuestiones:

  • docker-composeYa sea para instalarlo, de lo contrario install.sh, fallará cuando se ejecute e informará "✖ Primero debe instalar docker-compose (1.7.1+) usted mismo y ejecutar este script nuevamente".
  • dockerinstall.shSi 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 Composela 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.shel script para instalar harborel 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 .

inserte la descripción de la imagen aquí
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\hosts116.196.88.91 reg.marin.com

inserte la descripción de la imagen aquí
Visite: https://reg.marin.come inicie sesión.

inserte la descripción de la imagen aquí
Funcionamiento básico de la interfaz después de iniciar sesión:

  • Crear un nuevo proyecto test.

inserte la descripción de la imagen aquí

  • Crear un nuevo usuario marin.

inserte la descripción de la imagen aquí

  • Establezca al usuario marincomo testadministrador del proyecto.

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/be_racle/article/details/132255791
Recomendado
Clasificación