Ada banyak artikel di Habré tentang Jenkins, tetapi hanya sedikit yang menjelaskan contoh cara kerja Jenkins dan agen buruh pelabuhan. Semua alat pembuatan proyek populer seperti
Saat ini ada solusi untuk masalah ini: Jenkins 2 bekerja dengan baik
Mengapa saya mulai menyelesaikan masalah ini?
Karena kita berada di perusahaan
- sejumlah besar runtime yang lupa dibersihkan oleh pengembang;
- ada konflik antara versi berbeda dari runtime yang sama;
- Setiap pengembang membutuhkan seperangkat komponen yang berbeda.
Ada masalah lain, tapi izinkan saya memberi tahu Anda solusinya.
Jenkins di Docker
Karena Docker sekarang sudah mapan di dunia pengembangan, hampir semua hal dapat dijalankan menggunakan Docker. Solusi saya adalah memiliki Jenkins di Docker dan dapat menjalankan container Docker lainnya. Pertanyaan ini mulai ditanyakan pada tahun 2013 di artikel “
Singkatnya, Anda hanya perlu menginstal Docker sendiri di container yang berfungsi dan memasang file /var/run/docker.sock
.
Berikut adalah contoh Dockerfile yang dibuat 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
Jadi, kami mendapatkan wadah Docker yang dapat menjalankan perintah Docker di mesin host.
Bangun pengaturan
Belum lama ini Jenkins mendapat kesempatan untuk menjelaskan aturannya dengan menggunakan
Jadi mari kita letakkan Dockerfile khusus di repositori itu sendiri, yang akan berisi semua perpustakaan yang diperlukan untuk pembangunan. Dengan cara ini, pengembang sendiri dapat menyiapkan lingkungan yang dapat diulang dan tidak perlu meminta OPS untuk menginstal versi Node.JS tertentu pada host.
FROM node:12.10.0-alpine
RUN npm install yarn -g
Gambar build ini cocok untuk sebagian besar aplikasi Node.JS. Bagaimana jika, misalnya, Anda memerlukan gambar untuk proyek JVM dengan pemindai Sonar yang disertakan di dalamnya? Anda bebas memilih komponen yang diperlukan untuk perakitan.
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 menjelaskan lingkungan perakitan, tapi apa hubungannya Jenkins dengan itu? Dan agen Jenkins dapat bekerja dengan image Docker tersebut dan membuatnya secara internal.
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"
}
}
Pengarahan agent
menggunakan properti docker
di mana Anda dapat menentukan:
- nama wadah perakitan sesuai dengan kebijakan penamaan Anda;
- argumen diperlukan untuk menjalankan wadah build, di mana dalam kasus kami, kami memasang direktori saat ini sebagai direktori di dalam wadah.
Dan sudah dalam langkah-langkah pembangunan kami menunjukkan perintah mana yang harus dijalankan di dalam agen pembangunan Docker. Ini bisa apa saja, jadi saya juga meluncurkan penerapan aplikasi menggunakan kemungkinan.
Di bawah ini saya ingin menunjukkan Jenkinsfile generik yang dapat dibuat oleh aplikasi Node.JS sederhana.
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 telah terjadi?
Berkat metode ini, kami memecahkan masalah berikut:
- waktu konfigurasi perakitan lingkungan dikurangi menjadi 10 - 15 menit per proyek;
- lingkungan pembuatan aplikasi yang sepenuhnya dapat diulang, karena Anda dapat membuatnya dengan cara ini di komputer lokal Anda;
- tidak ada masalah konflik antara versi alat perakitan yang berbeda;
- selalu ruang kerja yang bersih dan tidak tersumbat.
Solusinya sendiri sederhana dan jelas serta memungkinkan Anda mendapatkan beberapa keuntungan. Ya, ambang masuknya telah meningkat sedikit dibandingkan dengan perintah sederhana untuk rakitan, tetapi sekarang ada jaminan bahwa itu akan selalu dibuat dan pengembang sendiri dapat memilih semua yang diperlukan untuk proses pembuatannya.
Anda juga dapat menggunakan gambar yang saya kumpulkan
Saat artikel ini ditulis, muncul diskusi tentang penggunaan agen di server jarak jauh agar tidak memuat node master menggunakan plugin
Sumber: www.habr.com