
Habr vietnē ir daudz rakstu par Jenkins, taču tikai daži apraksta Jenkins un Docker aģentu darbības piemēru. Visi populāri projektu veidošanas rīki, piemēram, , , , un citi var visu būvēt konteineros. Bet kā ar Dženkinsu?
Šodien problēmai ir risinājums: Jenkins 2 lieliski darbojas ar Šajā rakstā vēlos dalīties savā pieredzē un parādīt, kā to var izdarīt pašam.
Kāpēc es sāku risināt šo problēmu?
Tā kā mēs esam uzņēmumā Tā kā mēs izmantojam dažādas tehnoloģijas, mums būvēšanas datorā ir jāuztur dažādas Node.JS, Gradle, Ruby, JDK un citu versijas. Taču versiju konflikti bieži vien ir neizbēgami. Lai gan jums varētu būt taisnība, sakot, ka pastāv dažādi versiju pārvaldnieki, piemēram, nvm un rvm, tie ne vienmēr ir tik vienkārši, un šiem risinājumiem ir savas problēmas:
- liels apjoms izpildlaiku, ko izstrādātāji aizmirst sakopt;
- pastāv konflikti starp dažādām viena un tā paša izpildlaika versijām;
- Katram izstrādātājam ir nepieciešams atšķirīgs komponentu komplekts.
Ir arī citas problēmas, bet ļaujiet man pastāstīt par risinājumu.
Dženkinss Dokerā
Tā kā Docker tagad ir labi nostiprinājies izstrādātāju pasaulē, gandrīz visu var palaist, izmantojot Docker. Mans risinājums ir iekļaut Jenkins Docker un spēt palaist citus Docker konteinerus. Šis jautājums pirmo reizi tika aplūkots 2013. gada rakstā "".
Īsāk sakot, jums vienkārši jāinstalē pats Docker darba konteinerā un jāpievieno fails. /var/run/docker.sock.
Šeit ir Dockerfile piemērs, kas tika iegūts Jenkins.
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 jenkinsTādējādi mēs ieguvām Docker konteineru, kas var izpildīt Docker komandas resursdatora datorā.
Būvēšanas iestatīšana
Ne tik sen Dženkinss ieguva spēju aprakstīt savus noteikumus, izmantojot sintakse, kas atvieglo būvēšanas skripta maiņu un saglabāšanu repozitorijā.
Tātad, ievietosim pašā repozitorijā īpašu Dockerfile failu, kurā būs visas veidošanai nepieciešamās bibliotēkas. Tādā veidā izstrādātājs var sagatavot atkārtojamu vidi, nelūdzot OPS instalēt konkrētu Node.JS versiju resursdatorā.
FROM node:12.10.0-alpine
RUN npm install yarn -gŠis būvējuma attēls ir piemērots lielākajai daļai Node.JS lietojumprogrammu. Bet ko darīt, ja, piemēram, projektam ir nepieciešams JVM attēls ar integrētu Sonar skeneri? Jūs varat brīvi izvēlēties būvējumam nepieciešamās komponentes.
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/
Mēs esam aprakstījuši būvēšanas vidi, bet kāda tam ir saistība ar Jenkins? Jenkins aģenti var strādāt ar šiem Docker attēliem un veidot tajos.
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"
}
}Direktīva agent izmanto īpašumu docker, kur varat norādīt:
- montāžas konteinera nosaukums saskaņā ar jūsu nosaukumu piešķiršanas politiku;
- argumenti, kas nepieciešami būvēšanas konteinera palaišanai, kur mūsu gadījumā mēs pievienojam pašreizējo direktoriju kā direktoriju konteinera iekšpusē.
Un būvēšanas soļos mēs norādām, kuras komandas palaist Docker būvēšanas aģentā. Tas var būt jebkas, tāpēc es arī vadu lietojumprogrammu izvietošanu, izmantojot Ansible.
Zemāk es vēlos parādīt vispārīgu Jenkinsfile, kas var izveidot vienkāršu Node.JS lietojumprogrammu.
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()
}
}
}Tātad, kas notika?
Izmantojot šo metodi, mēs atrisinājām šādas problēmas:
- būvēšanas vides konfigurēšanas laiks tiek samazināts līdz 10–15 minūtēm katram projektam;
- pilnībā atkārtojama lietojumprogrammu veidošanas vide, jo to var veidot arī lokālā datorā;
- nav problēmu ar konfliktiem starp dažādām būvēšanas rīku versijām;
- vienmēr tīra darba vieta, kurā nav nekārtības.
Pats risinājums ir vienkāršs un acīmredzams, un tas piedāvā tikai priekšrocības. Jā, ienākšanas barjera ir nedaudz augstāka nekā ar vienkāršām būvēšanas komandām, taču tagad ir garantija, ka būvēšana vienmēr darbosies, un izstrādātājs var izvēlēties visu nepieciešamo savam būvēšanas procesam.
Varat arī izmantot attēlu, ko esmu apkopojis. Visi avoti ir atvērti un atrodas vietnē .
Rakstot šo rakstu, tika apspriesta aģentu izmantošana attālos serveros, lai izvairītos no galvenā mezgla ielādes ar spraudni. Bet par šo es jums pastāstīšu nākotnē.
Avots: www.habr.com
