Habré-ում կան բազմաթիվ հոդվածներ Ջենքինսի մասին, սակայն քչերն են նկարագրում Ջենքինսի և դոկերի գործակալների աշխատանքի օրինակները: Բոլոր հայտնի նախագծերի կառուցման գործիքները, ինչպիսիք են
Այսօր կա խնդրի լուծում. Jenkins 2-ը հիանալի է աշխատում նրա հետ
Ինչու՞ սկսեցի լուծել այս խնդիրը:
Քանի որ մենք ընկերությունում ենք
- մեծ քանակությամբ գործարկման ժամանակ, որը մշակողները մոռանում են մաքրել;
- կան հակասություններ նույն գործարկման ժամանակների տարբեր տարբերակների միջև.
- Յուրաքանչյուր մշակողի կարիք ունի բաղադրիչների տարբեր հավաքածու:
Այլ խնդիրներ էլ կան, բայց լուծման մասին ասեմ։
Ջենկինսը Docker-ում
Քանի որ Docker-ն այժմ լավ հաստատված է զարգացման աշխարհում, գրեթե ամեն ինչ կարելի է գործարկել Docker-ի միջոցով: Իմ լուծումն այն է, որ Jenkins-ը լինի Docker-ում և կարողանա գործարկել այլ Docker կոնտեյներներ: Այս հարցը սկսեց տրվել դեռևս 2013 թվականին հոդվածում «
Մի խոսքով, պարզապես անհրաժեշտ է տեղադրել Docker-ն ինքնին աշխատանքային կոնտեյներով և տեղադրել ֆայլը /var/run/docker.sock
.
Ահա մի օրինակ Dockerfile, որը պարզվեց Ջենկինսի համար:
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
Այսպիսով, մենք ստացանք Docker կոնտեյներ, որը կարող է կատարել Docker հրամանները հյուրընկալող մեքենայի վրա:
Կառուցման կարգավորում
Ոչ վաղ անցյալում Ջենքինսը հնարավորություն ստացավ նկարագրելու իր կանոնները՝ օգտագործելով
Այսպիսով, եկեք տեղադրենք հատուկ Dockerfile-ը հենց պահոցում, որը կպարունակի կառուցման համար անհրաժեշտ բոլոր գրադարանները: Այս կերպ ծրագրավորողն ինքը կարող է պատրաստել կրկնվող միջավայր և ստիպված չի լինի OPS-ին խնդրել հոսթի վրա տեղադրել Node.JS-ի կոնկրետ տարբերակը։
FROM node:12.10.0-alpine
RUN npm install yarn -g
Այս build պատկերը հարմար է Node.JS հավելվածների մեծ մասի համար: Իսկ եթե, օրինակ, ձեզ անհրաժեշտ է պատկեր JVM նախագծի համար, որի ներսում ներառված է Sonar սկաները: Դուք ազատ եք ընտրելու այն բաղադրիչները, որոնք անհրաժեշտ են հավաքման համար:
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/
Մենք նկարագրեցինք հավաքման միջավայրը, բայց ի՞նչ կապ ունի Ջենքինսը դրա հետ: Եվ Jenkins-ի գործակալները կարող են աշխատել նման Docker պատկերների հետ և կառուցել դրանք ներսում:
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"
}
}
Հրահանգ agent
օգտագործում է գույքը docker
որտեղ կարող եք նշել.
- հավաքման կոնտեյների անվանումը՝ ըստ ձեր անվանման քաղաքականության.
- արգումենտներ, որոնք անհրաժեշտ են կառուցման կոնտեյները գործարկելու համար, որտեղ մեր դեպքում մենք տեղադրում ենք ընթացիկ գրացուցակը որպես գրացուցակ կոնտեյների ներսում:
Եվ արդեն կառուցման քայլերում մենք նշում ենք, թե որ հրամանները պետք է կատարվեն Docker build գործակալի ներսում։ Սա կարող է լինել ցանկացած բան, այնպես որ ես նաև գործարկում եմ հավելվածների տեղակայումը ansible-ի միջոցով:
Ստորև ես ուզում եմ ցույց տալ ընդհանուր Jenkinsfile-ը, որը կարող է ստեղծել հասարակ Node.JS հավելվածը:
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 րոպե մեկ նախագծի համար;
- միանգամայն կրկնվող հավելվածների կառուցման միջավայր, քանի որ դուք կարող եք այն կառուցել այս կերպ ձեր տեղական համակարգչում.
- հավաքման գործիքների տարբեր տարբերակների միջև հակասությունների հետ կապված խնդիրներ չկան.
- միշտ մաքուր աշխատանքային տարածք, որը չի խցանվում:
Լուծումն ինքնին պարզ է և ակնհայտ և թույլ է տալիս որոշակի առավելություններ ստանալ: Այո, մուտքի շեմը մի փոքր բարձրացել է հավաքների պարզ հրամանների համեմատ, բայց այժմ երաշխիք կա, որ այն միշտ կկառուցվի, և մշակողն ինքը կարող է ընտրել այն ամենը, ինչ անհրաժեշտ է իր կառուցման գործընթացի համար:
Կարող եք նաև օգտագործել իմ հավաքած պատկերը
Այս հոդվածը գրելիս քննարկում առաջացավ հեռավոր սերվերների վրա գործակալներ օգտագործելու մասին, որպեսզի չբեռնվի հիմնական հանգույցը՝ օգտագործելով plugin
Source: www.habr.com