Terdapat banyak artikel tentang HabrΓ© tentang Jenkins, tetapi hanya sedikit yang menerangkan contoh cara Jenkins dan ejen docker berfungsi. Semua alat binaan projek popular seperti
Hari ini terdapat penyelesaian kepada masalah itu: Jenkins 2 hebat dalam bekerja dengannya
Mengapa saya mula menyelesaikan masalah ini?
Memandangkan kita berada dalam syarikat
- sejumlah besar masa jalan yang terlupa untuk dibersihkan oleh pembangun;
- terdapat konflik antara versi berbeza bagi masa jalan yang sama;
- Setiap pembangun memerlukan set komponen yang berbeza.
Terdapat masalah lain, tetapi izinkan saya memberitahu anda tentang penyelesaiannya.
Jenkins di Docker
Memandangkan Docker kini sudah mantap dalam dunia pembangunan, hampir semua perkara boleh dijalankan menggunakan Docker. Penyelesaian saya ialah mempunyai Jenkins dalam Docker dan dapat menjalankan bekas Docker yang lain. Soalan ini mula ditanya pada tahun 2013 dalam artikel "
Ringkasnya, anda hanya perlu memasang Docker sendiri dalam bekas yang berfungsi dan lekapkan fail /var/run/docker.sock
.
Berikut ialah contoh Dockerfile yang ternyata untuk 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 jenkins
Oleh itu, kami mendapat bekas Docker yang boleh melaksanakan arahan Docker pada mesin hos.
Bina persediaan
Tidak lama dahulu Jenkins mendapat peluang untuk menerangkan peraturannya menggunakan
Jadi mari kita letakkan Dockerfile khas dalam repositori itu sendiri, yang akan mengandungi semua perpustakaan yang diperlukan untuk binaan. Dengan cara ini, pembangun sendiri boleh menyediakan persekitaran yang boleh diulang dan tidak perlu meminta OPS untuk memasang versi Node.JS tertentu pada hos.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Imej binaan ini sesuai untuk kebanyakan aplikasi Node.JS. Bagaimana jika, sebagai contoh, anda memerlukan imej untuk projek JVM dengan pengimbas Sonar disertakan di dalamnya? Anda bebas memilih komponen yang anda perlukan untuk pemasangan.
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/
Kami menerangkan persekitaran perhimpunan, tetapi apakah kaitan Jenkins dengannya? Dan ejen Jenkins boleh bekerja dengan imej Docker sedemikian dan membinanya secara dalaman.
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"
}
}
Arahan agent
menggunakan harta docker
di mana anda boleh menentukan:
- nama bekas pemasangan mengikut dasar penamaan anda;
- hujah yang diperlukan untuk menjalankan bekas binaan, di mana dalam kes kami, kami melekapkan direktori semasa sebagai direktori di dalam bekas.
Dan sudah dalam langkah binaan kami menunjukkan arahan yang hendak dilaksanakan di dalam ejen binaan Docker. Ini boleh jadi apa sahaja, jadi saya juga melancarkan penggunaan aplikasi menggunakan ansible.
Di bawah saya ingin menunjukkan Jenkinsfile generik yang boleh dibina oleh aplikasi Node.JS yang mudah.
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()
}
}
}
Apa yang berlaku?
Terima kasih kepada kaedah ini, kami menyelesaikan masalah berikut:
- masa konfigurasi pemasangan persekitaran dikurangkan kepada 10 - 15 minit setiap projek;
- persekitaran binaan aplikasi yang boleh diulang sepenuhnya, kerana anda boleh membinanya dengan cara ini pada komputer tempatan anda;
- tiada masalah dengan konflik antara versi alat pemasangan yang berbeza;
- sentiasa ruang kerja bersih yang tidak tersumbat.
Penyelesaiannya sendiri adalah mudah dan jelas dan membolehkan anda mendapat beberapa kelebihan. Ya, ambang kemasukan telah meningkat sedikit berbanding dengan arahan mudah untuk perhimpunan, tetapi kini terdapat jaminan bahawa ia akan sentiasa dibina dan pemaju sendiri boleh memilih semua yang diperlukan untuk proses binaannya.
Anda juga boleh menggunakan imej yang saya kumpulkan
Semasa menulis artikel ini, perbincangan timbul tentang menggunakan ejen pada pelayan jauh supaya tidak memuatkan nod induk menggunakan pemalam
Sumber: www.habr.com