Detaillierte Erläuterung der Anwendungsbereitstellungspraxis für Docker + Jenkins + Gitlab + Django

Detaillierte Erläuterung der Anwendungsbereitstellungspraxis für Docker + Jenkins + Gitlab + Django

1. Hintergrund

Im Kontext schneller Updates und Iterationen von Internetanwendungen können herkömmliche manuelle Arbeiten oder einfache Skripte nicht mehr an diese Änderungen angepasst werden. Devops bietet uns eine gute Lösung. Die Anwendung von CI/CD kann unsere tägliche Arbeit erheblich erleichtern. Automatisierte und schnelle kontinuierliche Integration/kontinuierliche Bereitstellung ermöglicht uns eine schnellere Anwendungsentwicklung, bessere Stabilität und höhere Zuverlässigkeit.

2. Topologische Umgebung

2.1 Architekturtopologie

Wie im obigen Beispiel gezeigt, wird die folgende Prozesstopologie kurz beschrieben:

  • Wenn der Entwickler den lokalen Code auf den Gitlab-Server überträgt, löst der Webhook automatisch aus, dass Jenkins die Anwendung erstellt.
  • Stellen Sie die Anwendung auf dem Docker-Host bereit. Klonen Sie den Quellcode vom Gitlabserver und starten Sie die Anwendung.
  • LB kann für hohe Verfügbarkeit am Frontend platziert werden
  • Datenbankverbindung Cloud-Datenbank
  • Die Protokolle können im Protokoll gespeichert und später an Elk übermittelt werden, um die Protokollvisualisierung zu realisieren
  • E-Mail-Benachrichtigung über die Fertigstellung des Builds an das entsprechende Personal (Test oder Eröffnung)

2.2 Version der Systemsoftware

Name Version
Linux CentOS 7.3 64-Bit
Docker 1.13
Django 2.0

3. Installation und Bereitstellung

3.1 Installation und Bereitstellung von Jenkins

Informationen zur Installation und Bereitstellung von Jenkins finden Sie unter: Jenkins Notes

Nachdem die Installation abgeschlossen ist, fügen Sie den Docker-Zielserver hinzu

Konfigurieren des Postausgangsservers

3.2 Docker-Installation und -Bereitstellung

Weitere Informationen zur Installation und Bereitstellung von Docker sowie zum Schreiben von Docker-Dateien finden Sie unter: Detaillierte Erläuterung zum Docker-Container

3.3 Installation und Bereitstellung von Gitlab

GitLab kann durch Ausführen einiger Befehle auf einem öffentlichen Linux-Server installiert werden. Wenn kein öffentliches Netzwerk vorhanden ist, müssen Sie external_url 'http://自己的內網IP' in der Datei /etc/gitlab/gitlab.rb manuell ändern.

yum install -y libsemanage-static libsemanage-devel policycoreutils openss
H-Server OpenSSH-Clients Postfix
systemctl Postfix aktivieren und systemctl Postfix starten

wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-8.0.
0-ce.0.el7.x86_64.rpm
rpm -i gitlab-ce-8.0.0-ce.0.el7.x86_64.rpm
# Holen Sie sich die öffentliche IP
PUBLICIP=$(curl http://ipv4.icanhazip.com)
# Ändern Sie sed -i "s/gitlab-server/${PUBLICIP}/g" /etc/gitlab/gitlab.rb

gitlab-ctl neu konfigurieren
gitlab-ctl Neustart

echo "Benutzername:root"
echo "Passwort:5iveL!fe"

3.4 Konfigurationsfreigabeprozess

Jenkins erstellt ein Freestyle-Softwareprojekt

Verwenden Sie parametrisierte Builds, um die nachfolgende Bereitstellung von in Docker importierten Mapping-Quell-Ports und Releases zu erleichtern.

Der Quellcode stammt aus dem Django-Projekt von gitlab

Verwenden Sie Webhook, um Gitlab und Jenkins zu verbinden

Jenkins-Installations-Plugin:

Generieren Sie einen zufälligen Tokenwert

Konfigurieren Sie die von Jenkins generierte GitLab-Webhook-URL für Gitlab

Wenn der Entwickler den Code lokal pusht, löst Jenkins automatisch den Projekt-Build aus. In der Docker-Datei ist ein Git-Pull-Code geschrieben. Auch hier ist es nicht nötig, den Code von Jenkins auf den Docker-Host zu verteilen. Jenkins wird als Trigger für Docker-Builds verwendet.

Konfigurieren Sie die E-Mail, nachdem der Build abgeschlossen ist

E-Mail-Vorlage, Auswahl des E-Mail-Typs:

Auswahl des Inhaltstyps: HTML

Geben Sie den Betreff der E-Mail ein:構建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !

Erstellen Sie die Benachrichtigungsvorlage:

<!DOCTYPE html>
<html>
<Kopf>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-${BUILD_NUMBER} Build-Protokoll</title>
</Kopf>

<body linker Rand="8" Randbreite="0" oberer Rand="8" Randhöhe="4"
 offset="0">
 <Tabellenbreite="95%" Zellenpadding="0" Zellenabstand="0"
 Stil="Schriftgröße: 11pt; Schriftfamilie: Tahoma, Arial, Helvetica, serifenlos">
 <tr>
  <td>(Diese E-Mail wird automatisch vom Programm versendet, bitte nicht antworten!)</td>
 </tr>
 <tr>
  <td><h2>
   <font color="#0000FF">Build-Ergebnis – ${BUILD_STATUS}</font>
  </h2></td>
 </tr>
 <tr>
  <td><br />
  <b><font color="#0B610B">Build-Informationen</font></b>
  <hr Größe="2" Breite="100%" Ausrichtung="Mitte" /></td>
 </tr>
 <tr>
  <td>
  <ul>
   <li>Projektname: ${PROJECT_NAME}</li>
   <li>Build-Nummer: ${BUILD_NUMBER} Build</li>
   <li>SVN-Version: ${SVN_REVISION}</li>
   <li>Auslösegrund: ${CAUSE}</li>
   <li>Build-Protokoll: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
   <li>Build-URL: <a href="${BUILD_URL}">${BUILD_URL}</a></li>
   <li>Arbeitsverzeichnis: <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
   <li>Projekt-URL: <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
  </ul>
  </td>
 </tr>
 <tr>
  <td><b><font color="#0B610B">Änderungen seit dem letzten
   Erfolgreicher Build:
  <hr Größe="2" Breite="100%" Ausrichtung="Mitte" /></td>
 </tr>
 <tr>
  <td>
  <ul>
   <li>Historische Änderungen: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>
  </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Änderungen für Build Nr. %n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat=" %p"}
  </td>
 </tr>
 <tr>
  <td><b>Fehlgeschlagene Testergebnisse</b>
  <hr Größe="2" Breite="100%" Ausrichtung="Mitte" /></td>
 </tr>
 <tr>
  <td><vor
   $FEHLGESCHLAGENE_TESTS
  <br /></td>
 </tr>
 <tr>
  <td><b><font color="#0B610B">Build-Protokoll (letzte 100 Zeilen):</font></b>
  <hr Größe="2" Breite="100%" Ausrichtung="Mitte" /></td>
 </tr>
 <!-- <tr>
  <td>Testprotokolle (wenn der Test ausgeführt wurde):
  href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
  <br />
  <br />
  </td>
 </tr> -->
 <tr>
  <td><textarea cols="80" rows="30" readonly="Nur lesen"
   style="Schriftfamilie: Courier New">${BUILD_LOG, maxLines=100}</textarea>
  </td>
 </tr>
 </Tabelle>
</body>
</html>

Den Triggertyp können Sie nach Bedarf ausfüllen. Hier können Sie immer ausfüllen, um unabhängig von Erfolg oder Misserfolg eine E-Mail zu versenden.

Anzeigen von Dateien im Remote-Docker-Server

Die Django-Bereitstellung hat Conda verwendet, um das Python 3.6-Umgebungspaket des Projekts zu packen und ein Docker-Image zu erstellen.

Zuvor wurde ein reines Python 3.6-System verwendet. Bei jedem Build wurde pip verwendet, um die Module in requirements.txt zu installieren. Da sich die Umgebung im Laufe der Zeit jedoch selten änderte, war die Installation von pip jedes Mal zeitaufwändig. Daher wurde conda verwendet, um die gepackte Python-Umgebung anzupassen und die Bereitstellungszeit der Umgebung zu verkürzen. Die lokale Festplatte kann auch über den Parameter -v der Docker-Image-Erstellung in der Umgebung gemountet werden. Jedes Mal kann ein lokales conda erstellt werden, um die schnelle Bereitstellung der Umgebung abzuschließen.

Dockerfile anzeigen

VON 87a69025db6a
WARTUNGSPERSÖNLICHKEIT kaliarch

# Definieren Sie das Arbeitsverzeichnis ENV WORK_DIR /work/ im Docker
# Erstellen Sie ein Arbeitsverzeichnis im Docker RUN mkdir $WORK_DIR
# Definieren Sie den Mapping-Port EXPOSE 80

ARBEITSVERZEICHNIS $WORK_DIR 
Führen Sie den Git-Klon http://123.xxxx.xxxxx.245/Devops/go2cloud.git aus.

# Startdienstskript hinzufügen ADD *.sh ${WORK_DIR}

CMD `which bash` /work/start_all.sh && tail -f /work/logs/server-$(date +%F).log

Zeigen Sie das Django-Startskript an

#!/bin/bash

BASEPATH=$(cd `dirname $0`;pwd)

PY_CMD=/python3/bin/python

# Service-Eintragdatei #MAIN_APP=${BASEPATH}/go2cloud/manage.py 
# Migrationsskript-Eintragdatei SCRIPTS_APP=${BASEPATH}/go2cloud/scripts/migrate_task_schdule.py
# Löschen Sie die Skripteintragsdatei DELETE_APP=${BASEPATH}/go2cloud/scripts/delete_transfer_server.py

# Protokollverzeichnis LOG_DIR=${BASEPATH}/logs/
[ ! -d ${LOG_DIR} ] && mkdir ${LOG_DIR}

# Starten Sie den Dienst #nohup ${PY_CMD} -u ${MAIN_APP} runserver 0.0.0.0:80 >> ${LOG_DIR}server-$(date +%F).log 2>&1 &
# Starten Sie das Skript Migrationsplanungsskript echo "---------$0 $(date) excute----------" >> ${LOG_DIR}task-script-$(date +%F).log
nohup ${PY_CMD} -u ${SCRIPTS_APP} >> ${LOG_DIR}Skript-$(Datum +%F).log 2>&1 &

# Starten Sie das Migrations- und Löschskript echo "---------$0 $(date) excute----------" >> ${LOG_DIR}delete-script-$(date +%F).log
nohup ${PY_CMD} -u ${DELETE_APP} >> ${LOG_DIR}delete-script-$(date +%F).log 2>&1 &

Zeigen Sie das Jenkins-Bereitstellungsskript an

#!/bin/bash

Freigabe=$1
Hafen=$2

BASEPATH=$(cd `dirname $0`;pwd)

# Erstellen Sie das go2cloud-platform-Image cd /dockerwork
Docker-Build -t go2cloud-platform-mini:$release.

IMGNAME=$(Docker-Images|awk -v Release=$Release '{if($1=="go2cloud-platform-mini" && $2==Release) print $3}')

echo $IMGNAME
# Starten Sie den Container docker run -d -p ${port}:80 -v /testlog/:/work/logs ${IMGNAME}

Verwenden Sie den Parameter -v, um Protokolle dauerhaft auf dem Docker-Host zu speichern

4. Testanzeige

4.1 Testaufbau

Manuelles Erstellen von Tests

4.2 Protokoll anzeigen

4.3 Docker-Container anzeigen

4.4 Testen der App

5. Reflexion und Verbesserung

  • Die aktuell verbundene Datenbank ist eine auf einem Cloud-Server erstellte Datenbank. Später verwendet die Datenbank auch Docker, und mehrere Gruppen verwenden Docker-Compose für eine einheitliche Bereitstellung und Verwaltung.
  • Später können Sie den öffentlichen Cloud-K8s-Cluster für bequeme Tests verwenden
  • Derzeit befinden sich die vom Docker-Container generierten Protokolle auf dem Docker-Host. Später können sie auf cos gespeichert und dann zur Protokollvisualisierungsverarbeitung an den Elk-Cluster übermittelt werden.
  • Verwalten Sie Bilder einheitlich und erstellen Sie ein lokales Bild-Repository
  • Gitlab fügt Code-Review hinzu und kombiniert es mit automatischen Tests

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Docker+Gitlab+Jenkins erstellt automatisierte Bereitstellung von Grund auf
  • Einrichten einer kontinuierlichen Integrationsumgebung für GitLab+Jenkins unter CentOS (Installieren von Jenkins)
  • Docker Gitlab+Jenkins+Harbor erstellt einen persistenten Plattformbetrieb
  • Jenkins+Gitlab+Nginx Bereitstellung einer Front-End-Anwendung
  • Jenkins integriert Gitlab, um den gesamten Prozessdatensatz der automatisierten Bereitstellung zu realisieren

<<:  MySQL-Deduplizierungsmethoden

>>:  So generieren Sie eine Vue-Benutzeroberfläche per Drag & Drop

Artikel empfehlen

Implementieren Sie ein einfaches Datenantwortsystem

Inhaltsverzeichnis 1. Dep 2. Verstehen Sie den Be...

Oberflächliches Webdesign

<br />Ich war schon immer der Meinung, dass ...

Importieren Sie die CSV-Datei mit Navicat in MySQL

In diesem Artikel wird der spezifische Code zum I...

So ändern Sie die Kodierung in MySQL Version 5.7 unter Windows auf UTF-8

Vorwort Ich habe gerade angefangen, MySQL zu lern...

Detaillierte Erklärung der Lösung für das Nginx-Panikproblem

In Bezug auf das Nginx-Panikproblem müssen wir zu...

So installieren Sie Tomcat-8.5.39 auf centos7.6

So installieren Sie Tomcat-8.5.39 auf CentOS 7.6....

Implementierung des CSS-Quellcodes für herzförmige Ladeanimationen

Lassen Sie mich Ihnen ohne weitere Umschweife den...

MySQL effiziente Abfrage Left Join und Gruppieren nach (plus Index)

MySQL effiziente Abfrage MySQL verzichtet auf „Gr...

So installieren und konfigurieren Sie GitLab unter Ubuntu 20.04

einführen GitLab CE oder Community Edition ist ei...

JavaScript implementiert die Kontrollkästchenauswahlfunktion

In diesem Artikelbeispiel wird der spezifische Ja...

Analyse der Probleme und Lösungen beim Importieren großer Datenmengen in MySQL

Im Projekt stoßen wir häufig auf das Problem, gro...

Eine kurze Analyse des HTML-Space-Codes

Wie gut kennen Sie sich mit HTML aus? Wenn Sie jet...

Details zum Überschreiben von Prototypmethoden in JavaScript-Instanzobjekten

Inhaltsverzeichnis In JavaScript können wir norma...