Jenkins-i buruzko HabrΓ©-ri buruzko artikulu asko daude, baina gutxi batzuk deskribatzen dituzte Jenkins eta docker agenteek nola funtzionatzen duten. Horrelako proiektu ezagun guztiak eraikitzeko tresnak
Gaur egun arazoari irtenbide bat dago: Jenkins 2 bikaina da lanean
Zergatik hasi nintzen arazo hau konpontzen?
Konpainian gaudenez
- Garatzaileek garbitzea ahazten duten exekuzio-denbora handi bat;
- exekuzio-denbora beraren bertsio ezberdinen artean gatazkak daude;
- Garatzaile bakoitzak osagai multzo ezberdin bat behar du.
Badira beste arazo batzuk, baina konponbidearen berri emango dizut.
Jenkins Docker-en
Docker garapen munduan ondo ezarrita dagoenez, ia edozer gauza exekutatu daiteke Docker erabiliz. Nire irtenbidea Jenkins Docker-en izatea eta beste Docker-eko edukiontzi batzuk exekutatu ahal izatea da. Galdera hau 2013an hasi zen egiten "artikuluan
Laburbilduz, Docker bera laneko edukiontzi batean instalatu eta fitxategia muntatu besterik ez duzu behar /var/run/docker.sock
.
Hona hemen Jenkinsentzat atera den Dockerfile adibide bat.
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
Horrela, Docker edukiontzi bat lortu dugu, Docker komandoak exekutatu ditzakeen makina ostalarian.
Eraikitzeko konfigurazioa
Duela ez asko Jenkinsek bere arauak erabiliz deskribatzeko aukera izan zuen
Beraz, jar dezagun Dockerfile berezi bat biltegian bertan, eraikuntzarako beharrezkoak diren liburutegi guztiak edukiko dituena. Horrela, garatzaileak berak ingurune errepikagarria prestatu dezake eta ez dio OPS-ri eskatu beharko Ostalarian Node.JS-ren bertsio zehatz bat instalatzeko.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Eraikitze-irudi hau Node.JS aplikazio gehienetarako egokia da. Zer gertatzen da, adibidez, barruan Sonar eskaner bat duen JVM proiektu baterako irudi bat behar baduzu? Muntatzeko behar dituzun osagaiak aukeratzeko askatasuna duzu.
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/
Muntaketa-ingurunea deskribatu genuen, baina zer zerikusi du Jenkinsek? Eta Jenkins-eko agenteek Docker-eko irudiekin lan egin dezakete eta barnean eraiki ditzakete.
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"
}
}
Zuzentaraua agent
jabetza erabiltzen du docker
non zehaztu dezakezu:
- muntaketa-edukiontziaren izena zure izendatze-politikaren arabera;
- eraikitzeko edukiontzia exekutatzeko beharrezkoak diren argumentuak, non gure kasuan uneko direktorioa edukiontzi barruan direktorio gisa muntatzen dugu.
Eta dagoeneko eraikitzeko urratsetan Docker eraikitzeko agentearen barruan zein komando exekutatu behar diren adierazten dugu. Hau edozer izan daiteke, beraz, aplikazioen hedapena ere abiarazten dut ansible erabiliz.
Jarraian, Node.JS aplikazio sinple batek eraiki dezakeen Jenkinsfile generiko bat erakutsi nahi dut.
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()
}
}
}
Zer gertatu da?
Metodo honi esker, arazo hauek konpondu ditugu:
- ingurunea muntatzeko konfigurazio-denbora 10 - 15 minutura murrizten da proiektu bakoitzeko;
- guztiz errepikagarria den aplikazioa eraikitzeko ingurunea, zure tokiko ordenagailuan horrela eraiki dezakezu eta;
- ez dago arazorik muntaketa tresnen bertsio ezberdinen arteko gatazkekin;
- beti trabatu egiten ez den lan-espazio garbia.
Irtenbidea bera erraza eta bistakoa da eta abantaila batzuk lortzeko aukera ematen du. Bai, sarrera-atalasea apur bat igo da muntaien komando sinpleekin alderatuta, baina orain beti eraikiko den bermea dago eta garatzaileak berak bere eraikuntza-prozesurako beharrezkoa den guztia aukeratu dezake.
Nik bildutako irudia ere erabil dezakezu
Artikulu hau idaztean, eztabaida sortu zen urruneko zerbitzarietan agenteak erabiltzeari buruz, nodo nagusia plugin bat erabiliz ez kargatzeko
Iturria: www.habr.com