Daar is baie artikels oor Habré oor Jenkins, maar min beskryf voorbeelde van hoe Jenkins en dok-agente werk. Alle gewilde projekbou-instrumente soos
Vandag is daar 'n oplossing vir die probleem: Jenkins 2 is wonderlik om mee te werk
Hoekom het ek hierdie probleem begin oplos?
Aangesien ons in geselskap is
- 'n groot hoeveelheid looptyd wat ontwikkelaars vergeet om skoon te maak;
- daar is konflikte tussen verskillende weergawes van dieselfde looptye;
- Elke ontwikkelaar benodig 'n ander stel komponente.
Daar is ander probleme, maar kom ek vertel jou van die oplossing.
Jenkins in Docker
Aangesien Docker nou goed gevestig is in die ontwikkelingswêreld, kan byna enigiets met Docker bestuur word. My oplossing is om Jenkins in Docker te hê en ander Docker-houers te kan bestuur. Hierdie vraag begin terug in 2013 in die artikel "
Kortom, jy hoef net Docker self in 'n werkende houer te installeer en die lêer te monteer /var/run/docker.sock
.
Hier is 'n voorbeeld Dockerfile wat vir Jenkins uitgedraai het.
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
Ons het dus 'n Docker-houer gekry wat Docker-opdragte op die gasheermasjien kan uitvoer.
Bou opstelling
Nie lank gelede nie het Jenkins die geleentheid gekry om sy reëls te beskryf deur gebruik te maak
Laat ons dus 'n spesiale Dockerfile in die bewaarplek self plaas, wat al die biblioteke sal bevat wat nodig is vir die bou. Op hierdie manier kan die ontwikkelaar self 'n herhaalbare omgewing voorberei en sal nie OPS hoef te vra om 'n spesifieke weergawe van Node.JS op die gasheer te installeer nie.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Hierdie boubeeld is geskik vir die meeste Node.JS-toepassings. Wat as jy byvoorbeeld 'n prent benodig vir 'n JVM-projek met 'n Sonar-skandeerder ingesluit? U is vry om die komponente te kies wat u benodig vir montering.
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/
Ons het die monteringsomgewing beskryf, maar wat het Jenkins daarmee te doen? En Jenkins-agente kan met sulke Docker-beelde werk en dit intern bou.
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"
}
}
Richtlijn agent
eiendom gebruik docker
waar jy kan spesifiseer:
- die naam van die monteerhouer volgens u naambeleid;
- argumente wat nodig is om die bouhouer te laat loop, waar ons in ons geval die huidige gids as 'n gids binne die houer monteer.
En reeds in die boustappe dui ons aan watter opdragte binne die Docker-bouagent uitgevoer moet word. Dit kan enigiets wees, so ek begin ook toepassing-ontplooiing met behulp van ansible.
Hieronder wil ek 'n generiese Jenkins-lêer wys wat 'n eenvoudige Node.JS-toepassing kan bou.
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()
}
}
}
Wat het gebeur?
Danksy hierdie metode het ons die volgende probleme opgelos:
- omgewing samestelling konfigurasie tyd word verminder tot 10 - 15 minute per projek;
- 'n heeltemal herhaalbare toepassingsbou-omgewing, aangesien jy dit so op jou plaaslike rekenaar kan bou;
- daar is geen probleme met konflikte tussen verskillende weergawes van monteergereedskap nie;
- altyd 'n skoon werkspasie wat nie verstop raak nie.
Die oplossing self is eenvoudig en voor die hand liggend en laat jou toe om 'n paar voordele te kry. Ja, die toegangsdrempel het effens gestyg in vergelyking met eenvoudige opdragte vir samestellings, maar nou is daar 'n waarborg dat dit altyd gebou sal word en die ontwikkelaar kan self alles kies wat nodig is vir sy bouproses.
Jy kan ook die prent gebruik wat ek versamel het
Tydens die skryf van hierdie artikel het 'n bespreking ontstaan oor die gebruik van agente op afgeleë bedieners om nie die hoofnodus met 'n inprop te laai nie
Bron: will.com