
Ada banyak artikel tentang Habré tentang Jenkins, tetapi beberapa contoh karya Jenkins dan agen buruh pelabuhan dijelaskan. Semua alat pembuatan proyek populer seperti Drone.io , Bitbucket Pipeline , GitLab , tindakan GitHub dan lainnya dapat mengumpulkan semuanya dalam wadah. Tapi bagaimana dengan Jenkins?
Hari ini ada solusi untuk masalah ini: Jenkins 2 hebat dalam bekerja dengan agen Docker . Dalam artikel ini saya ingin berbagi pengalaman dan menunjukkan bagaimana Anda bisa melakukannya sendiri.
Mengapa saya memecahkan masalah ini?
Karena kami di Citronium menggunakan banyak teknologi berbeda, kami harus menyimpan berbagai versi Node.JS, Gradle, Ruby, JDK, dan lainnya di mesin perakitan. Namun seringkali konflik versi tidak dapat dihindari. Ya, Anda akan benar jika Anda mengatakan bahwa ada berbagai versi manajer seperti nvm, rvm, tetapi tidak semuanya lancar dengan mereka dan solusi ini memiliki masalah:
- sejumlah besar runtime yang lupa dibersihkan oleh pengembang;
- ada konflik antara versi berbeda dari runtimes yang sama;
- Setiap pengembang membutuhkan komponen yang berbeda.
Ada masalah lain, tetapi izinkan saya memberi tahu Anda lebih baik tentang solusi ini.
Jenkins di Docker
Karena Docker sekarang berakar dengan baik di industri pengembangan, hampir semuanya dapat dimulai menggunakan Docker. Solusi saya adalah agar Jenkins berada di Docker dan dapat menjalankan kontainer Docker lainnya. Pertanyaan ini mulai ditanyakan kembali pada tahun 2013 di artikel " Docker sekarang dapat berjalan dalam Docker ".
Jika secara singkat hanya perlu menginstal Docker di wadah yang berfungsi dan me-mount file /var/run/docker.sock
.
Berikut adalah contoh Dockerfile yang keluar untuk Jenkins.
FROM jenkins/jenkins:lts ARG DOCKER_COMPOSE_VERSION=1.25.0 USER root RUN apt-get update && \ apt-get upgrade -y && \ 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 && \ apt-get clean autoclean && apt-get autoremove && rm -rf /var/lib/{apt,dpkg,cache,log}/ RUN curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose RUN usermod -aG docker jenkins && gpasswd -a jenkins docker USER jenkins
Dengan demikian, kami mendapat wadah Docker yang dapat menjalankan perintah Docker pada mesin host.
Penyiapan bangun
Belum lama ini, Jenkins mendapat kesempatan untuk menggambarkan aturannya menggunakan sintaks Pipeline , yang memungkinkan Anda untuk dengan mudah mengubah skrip build dan menyimpannya di repositori.
Jadi mari kita letakkan Dockerfile khusus di repositori itu sendiri, yang akan berisi semua pustaka yang diperlukan untuk membangun pustaka. Dengan demikian, pengembang itu sendiri dapat menyiapkan lingkungan yang berulang dan OPS tidak perlu diminta untuk menempatkan versi Node.JS tertentu di host.
FROM node:12.10.0-alpine RUN npm install yarn -g
Gambar build ini cocok untuk sebagian besar aplikasi Node.JS. Dan jika, misalnya, Anda memerlukan gambar untuk proyek JVM dengan pemindai yang disertakan di dalam Sonar? Anda sendiri bebas memilih komponen yang perlu Anda bangun.
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 menggambarkan lingkungan buatan, tetapi apa yang harus dilakukan Jenkins dengan lingkungan itu? Dan agen Jenkins dapat bekerja dengan gambar Docker dan membangun di dalamnya.
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 properti docker
, tempat Anda dapat menentukan:
- nama wadah perakitan sesuai dengan kebijakan penamaan Anda;
- argumen yang diperlukan untuk memulai wadah perakitan, di mana dalam kasus kami, kami memasang direktori saat ini sebagai direktori di dalam wadah.

Dan sudah dalam langkah-langkah perakitan kami menunjukkan perintah mana yang harus dijalankan di dalam agen Docker perakitan. Itu bisa melakukan apa saja, jadi saya juga menjalankan penyebaran aplikasi menggunakan ansible.
Di bawah ini saya ingin menunjukkan Jenkinsfile generik yang dapat membangun 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 terjadi
Berkat metode ini, kami telah memecahkan masalah berikut:
- waktu konfigurasi perakitan lingkungan dikurangi menjadi 10 - 15 menit per proyek;
- lingkungan aplikasi yang sepenuhnya dapat diulang, karena dapat juga dipasang di komputer lokal;
- tidak ada konflik dengan berbagai versi alat perakitan;
- selalu ruang kerja bersih yang tidak tersumbat.
Solusinya sendiri sederhana dan jelas dan memungkinkan Anda untuk mendapatkan beberapa keuntungan. Ya, ambang entri telah naik sedikit dibandingkan dengan perintah build sederhana, tetapi sekarang ada jaminan bahwa itu akan selalu dikumpulkan dan pengembang sendiri dapat memilih semua yang diperlukan untuk proses build-nya.
Anda juga dapat menggunakan gambar yang saya kumpulkan Jenkins + Docker . Semua sumber terbuka dan berbaring di rmuhamedgaliev / jenkins_docker .
Selama penulisan artikel, ada diskusi tentang penggunaan agen di server jauh agar tidak memuat master node menggunakan docker-plugin . Tetapi saya akan membicarakan hal ini di masa depan.