Cara mengumpulkan proyek di Jenkins jika Anda memerlukan banyak lingkungan berbeda

Cara mengumpulkan proyek di Jenkins jika Anda memerlukan banyak lingkungan berbeda

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 Drone.io, Pipa Bitbucket, GitLab, Tindakan GitHub dan lain-lain, bisa mengumpulkan semuanya dalam wadah. Tapi bagaimana dengan Jenkins?

Saat ini ada solusi untuk masalah ini: Jenkins 2 bekerja dengan baik Agen buruh pelabuhan. Pada artikel ini saya ingin berbagi pengalaman saya dan menunjukkan bagaimana Anda bisa melakukannya sendiri.

Mengapa saya mulai menyelesaikan masalah ini?

Karena kita berada di perusahaan sitronium Karena kami menggunakan banyak teknologi berbeda, kami harus menyimpan versi Node.JS, Gradle, Ruby, JDK, dan lainnya yang berbeda di mesin perakitan. Namun seringkali konflik versi tidak dapat dihindari. Ya, Anda benar jika Anda mengatakan bahwa ada berbagai manajer versi seperti nvm, rvm, tetapi tidak semuanya berjalan lancar dan solusi ini bermasalah:

  • 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 “Docker sekarang dapat berjalan di dalam Docker".

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 Pipa saluran sintaksis, yang membuatnya cukup mudah untuk mengubah skrip build dan menyimpannya di repositori.

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 dockerdi 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 Jenkins + Docker. Semua sumber terbuka dan berlokasi di rmuhamedgaliev/jenkins_docker.

Saat artikel ini ditulis, muncul diskusi tentang penggunaan agen di server jarak jauh agar tidak memuat node master menggunakan plugin plugin buruh pelabuhan. Tapi saya akan membicarakan hal ini di masa depan.

Sumber: www.habr.com

Tambah komentar