So erstellen Sie Projekte in Jenkins, wenn Sie viele verschiedene Umgebungen benötigen

Bild


Es gibt viele Artikel über Habré über Jenkins, aber es werden nur wenige Beispiele für die Arbeit von Jenkins und Hafenagenten beschrieben. Alle gängigen Tools zum Erstellen von Projekten wie Drone.io , Bitbucket Pipeline , GitLab , GitHub und andere können alles in Containern sammeln. Aber was ist mit Jenkins?


Heute gibt es eine Lösung für das Problem: Jenkins 2 kann hervorragend mit Docker-Agenten zusammenarbeiten . In dem Artikel möchte ich Erfahrungen teilen und zeigen, wie Sie es selbst tun können.


Warum habe ich dieses Problem gelöst?


Da wir bei Citronium viele verschiedene Technologien verwenden, müssen wir verschiedene Versionen von Node.JS, Gradle, Ruby, JDK und anderen auf der Montagemaschine behalten. Oft lassen sich Versionskonflikte jedoch nicht vermeiden. Ja, Sie werden Recht haben, wenn Sie sagen, dass es verschiedene Versionsmanager wie nvm, rvm gibt, aber nicht alles mit ihnen so reibungslos läuft und diese Lösungen Probleme haben:


  • eine große Menge von Laufzeiten, die Entwickler vergessen zu reinigen;
  • Es gibt Konflikte zwischen verschiedenen Versionen der gleichen Laufzeiten.
  • Jeder Entwickler benötigt einen anderen Komponentensatz.

Es gibt noch andere Probleme, aber ich möchte Ihnen die Lösung näher erläutern.


Jenkins in Docker


Da Docker mittlerweile gut in der Entwicklungsbranche verwurzelt ist, kann mit Docker fast alles gestartet werden. Meine Lösung ist, dass Jenkins in Docker ist und andere Docker-Container ausführen kann. Diese Frage wurde bereits 2013 im Artikel " Docker kann jetzt in Docker ausgeführt werden " gestellt.


In Kürze ist es lediglich erforderlich, Docker im /var/run/docker.sock zu installieren und die Datei /var/run/docker.sock .


Hier ist ein Dockerfile-Beispiel, das für Jenkins herauskam.


 FROM jenkins/jenkins:lts ARG DOCKER_COMPOSE_VERSION=1.25.0 USER root RUN apt-get update && \ apt-get upgrade -y && \ apt-get -y install apt-transport-https \ ca-certificates \ curl \ gnupg2 \ git \ software-properties-common && \ curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \ add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \ $(lsb_release -cs) \ stable" && \ apt-get update && \ apt-get -y install docker-ce && \ apt-get clean autoclean && apt-get autoremove && rm -rf /var/lib/{apt,dpkg,cache,log}/ RUN curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose RUN usermod -aG docker jenkins && gpasswd -a jenkins docker USER jenkins 

So haben wir einen Docker-Container, der Docker-Befehle auf dem Host-Rechner ausführen kann.


Setup erstellen


Vor nicht allzu langer Zeit hatte Jenkins die Möglichkeit, seine Regeln mithilfe der Pipeline- Syntax zu beschreiben, mit der Sie das Build-Skript einfach ändern und im Repository speichern können.


Legen wir also ein spezielles Dockerfile im Repository selbst ab, das alle Bibliotheken enthält, die zum Erstellen der Bibliothek erforderlich sind. Auf diese Weise kann der Entwickler selbst eine wiederholbare Umgebung vorbereiten, und OPS muss nicht aufgefordert werden, eine bestimmte Version von Node.JS auf dem Host zu speichern.


 FROM node:12.10.0-alpine RUN npm install yarn -g 

Dieses Build-Image ist für die meisten Node.JS-Anwendungen geeignet. Und wenn Sie beispielsweise ein Image für ein JVM-Projekt mit einem im Sonar enthaltenen Scanner benötigen? Sie können selbst die Komponenten auswählen, die Sie erstellen müssen.


 FROM adoptopenjdk/openjdk12:latest RUN apt update \ && apt install -y \ bash unzip wget RUN mkdir -p /usr/local/sonarscanner \ && cd /usr/local/sonarscanner \ && wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.3.0.1492-linux.zip \ && unzip sonar-scanner-cli-3.3.0.1492-linux.zip \ && mv sonar-scanner-3.3.0.1492-linux/* ./ \ && rm sonar-scanner-cli-3.3.0.1492-linux.zip \ && rm -rf sonar-scanner-3.3.0.1492-linux \ && ln -s /usr/local/sonarscanner/bin/sonar-scanner /usr/local/bin/sonar-scanner ENV PATH $PATH:/usr/local/sonarscanner/bin/ ENV SONAR_RUNNER_HOME /usr/local/sonarscanner/bin/ 

Wir haben die Build-Umgebung beschrieben, aber was hat Jenkins damit zu tun? Und Jenkins-Agenten können mit solchen Docker-Images arbeiten und diese im Inneren erstellen.


 stage("Build project") { agent { docker { image "project-build:${DOCKER_IMAGE_BRANCH}" args "-v ${PWD}:/usr/src/app -w /usr/src/app" reuseNode true label "build-image" } } steps { sh "yarn" sh "yarn build" } } 

Die agent Direktive verwendet die docker Eigenschaft, in der Sie Folgendes angeben können:


  • Name des Assembly-Containers gemäß Ihrer Namensrichtlinie;
  • Argumente, die zum Starten des Assembly-Containers erforderlich sind. In unserem Fall wird das aktuelle Verzeichnis als Verzeichnis im Container bereitgestellt.

Jenkins


Und bereits in den Assemblyschritten geben wir an, welche Befehle im Assembly Docker-Agenten ausgeführt werden sollen. Es kann alles, also starte ich auch App Deploy mit Ansible.


Im Folgenden möchte ich eine generische Jenkins-Datei zeigen, mit der eine einfache Node.JS-Anwendung erstellt werden kann.


 def DOCKER_IMAGE_BRANCH = "" def GIT_COMMIT_HASH = "" pipeline { options { buildDiscarder( logRotator( artifactDaysToKeepStr: "", artifactNumToKeepStr: "", daysToKeepStr: "", numToKeepStr: "10" ) ) disableConcurrentBuilds() } agent any stages { stage("Prepare build image") { steps { sh "docker build -f Dockerfile.build . -t project-build:${DOCKER_IMAGE_BRANCH}" } } stage("Build project") { agent { docker { image "project-build:${DOCKER_IMAGE_BRANCH}" args "-v ${PWD}:/usr/src/app -w /usr/src/app" reuseNode true label "build-image" } } steps { sh "yarn" sh "yarn build" } } post { always { step([$class: "WsCleanup"]) cleanWs() } } } 

Was ist passiert?


Dank dieser Methode haben wir die folgenden Probleme gelöst:


  • Die Konfigurationszeit der Umgebungsassembly wird auf 10 bis 15 Minuten pro Projekt reduziert.
  • vollständig wiederholbare Umgebung der Anwendungsassembly, da diese auch auf dem lokalen Computer zusammengestellt werden kann;
  • Keine Konflikte mit verschiedenen Versionen von Montagewerkzeugen.
  • Immer ein sauberer Arbeitsplatz, der nicht verstopft.

Die Lösung selbst ist einfach und offensichtlich und bietet einige Vorteile. Ja, die Eintrittsschwelle ist im Vergleich zu einfachen Build-Befehlen etwas angestiegen, aber jetzt besteht die Garantie, dass sie immer erfasst wird und der Entwickler selbst alles auswählen kann, was für seinen Build-Prozess erforderlich ist.


Sie können auch das Bild verwenden, das ich Jenkins + Docker gesammelt habe. Alle Quellen sind offen und liegen auf rmuhamedgaliev / jenkins_docker .


Während des Schreibens des Artikels gab es eine Diskussion über die Verwendung von Agenten auf Remote-Servern, um den Masterknoten nicht mit dem Docker-Plugin zu laden. Aber ich werde in Zukunft darüber sprechen.

Source: https://habr.com/ru/post/de481466/


All Articles