
Постоји много чланака на Хабреу о Џенкинсу, али неколико описује примере како функционишу Џенкинс и доцкер агенти. Сви популарни алати за прављење пројеката као што су , , , и други, могу све скупити у контејнере. Али шта је са Џенкинсом?
Данас постоји решење за проблем: Џенкинс 2 је одличан у раду . У овом чланку желим да поделим своје искуство и покажем како то можете учинити сами.
Зашто сам почео да решавам овај проблем?
Пошто смо у друштву Пошто користимо много различитих технологија, морамо да задржимо различите верзије Ноде.ЈС, Градле, Руби, ЈДК и других на машини за склапање. Али често се сукоби верзија не могу избећи. Да, бићете у праву ако кажете да постоје различити менаџери верзија као што су нвм, рвм, али није све тако глатко са њима и ова решења имају проблема:
- велика количина времена извршавања коју програмери заборављају да очисте;
- постоје сукоби између различитих верзија истог времена извршавања;
- Сваком програмеру је потребан другачији скуп компоненти.
Постоје и други проблеми, али дозволите ми да вам кажем нешто о решењу.
Џенкинс у Доцкеру
Пошто је Доцкер сада добро успостављен у свету развоја, скоро све се може покренути помоћу Доцкера. Моје решење је да имам Џенкинса у Доцкер-у и да будем у могућности да покрећем друге Доцкер контејнере. Ово питање је почело да се поставља још 2013. године у чланку „".
Укратко, само треба да инсталирате сам Доцкер у радни контејнер и монтирате датотеку /var/run/docker.sock.
Ево примера Доцкерфиле-а који се показао за Џенкинса.
FROM jenkins/jenkins:lts
USER root
RUN apt-get update &&
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 &&
usermod -aG docker jenkins
RUN curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
RUN apt-get clean autoclean && apt-get autoremove —yes && rm -rf /var/lib/{apt,dpkg,cache,log}/
USER jenkinsТако смо добили Доцкер контејнер који може да извршава Доцкер команде на главној машини.
Буилд сетуп
Не тако давно Џенкинс је добио прилику да опише своја правила користећи синтаксу, што олакшава промену скрипте за изградњу и складиштење у спремишту.
Дакле, ставимо посебан Доцкерфиле у само спремиште, који ће садржати све библиотеке неопходне за прављење. На овај начин, сам програмер може да припреми поновљиво окружење и неће морати да тражи од ОПС-а да инсталира одређену верзију Ноде.ЈС-а на хосту.
FROM node:12.10.0-alpine
RUN npm install yarn -gОва слика израде је погодна за већину Ноде.ЈС апликација. Шта ако вам је, на пример, потребна слика за ЈВМ пројекат са укљученим Сонар скенером? Слободно бирате компоненте које су вам потребне за монтажу.
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/
Описали смо монтажно окружење, али какве везе Џенкинс има са тим? А агенти Џенкинса могу да раде са таквим Доцкер сликама и да их интерно граде.
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"
}
}Direktiva agent користи имовину dockerгде можете одредити:
- назив контејнера за склапање према вашој политици именовања;
- аргументи потребни за покретање контејнера за изградњу, где у нашем случају монтирамо тренутни директоријум као директоријум унутар контејнера.
И већ у корацима изградње указујемо које команде треба извршити унутар Доцкер агента за прављење. Ово може бити било шта, тако да такође покрећем примену апликације користећи ансибле.
У наставку желим да покажем генерички Јенкинсфиле који може да направи једноставна Ноде.ЈС апликација.
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()
}
}
}Шта се десило?
Захваљујући овој методи, решили смо следеће проблеме:
- време конфигурације монтаже окружења је смањено на 10 - 15 минута по пројекту;
- потпуно поновљиво окружење за прављење апликација, пошто га на овај начин можете изградити на свом локалном рачунару;
- нема проблема са сукобима између различитих верзија алата за склапање;
- увек чист радни простор који се не запушава.
Само решење је једноставно и очигледно и омогућава вам да добијете неке предности. Да, улазни праг је мало порастао у поређењу са једноставним командама за склопове, али сада постоји гаранција да ће увек бити изграђен и да сам програмер може изабрати све што је неопходно за његов процес изградње.
Такође можете користити слику коју сам прикупио . Сви извори су отворени и налазе се на адреси .
Током писања овог чланка, настала је дискусија о коришћењу агената на удаљеним серверима како се не би учитавао главни чвор помоћу додатка . Али о овоме ћу говорити у будућности.
Извор: ввв.хабр.цом
