Cara mengumpul projek dalam Jenkins jika anda memerlukan banyak persekitaran yang berbeza

Cara mengumpul projek dalam Jenkins jika anda memerlukan banyak persekitaran yang berbeza

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 Drone.io, Saluran Paip Bitbucket, GitLab, Tindakan GitHub dan lain-lain, boleh kumpul semua dalam bekas. Tetapi bagaimana dengan Jenkins?

Hari ini terdapat penyelesaian kepada masalah itu: Jenkins 2 hebat dalam bekerja dengannya Ejen Docker. Dalam artikel ini saya ingin berkongsi pengalaman saya dan menunjukkan bagaimana anda boleh melakukannya sendiri.

Mengapa saya mula menyelesaikan masalah ini?

Memandangkan kita berada dalam syarikat Citronium Oleh kerana kami menggunakan banyak teknologi yang berbeza, kami perlu menyimpan versi Node.JS, Gradle, Ruby, JDK dan lain-lain versi yang berbeza pada mesin pemasangan. Tetapi selalunya konflik versi tidak dapat dielakkan. Ya, anda akan betul jika anda mengatakan bahawa terdapat pelbagai pengurus versi seperti nvm, rvm, tetapi tidak semuanya begitu lancar dengan mereka dan penyelesaian ini mempunyai masalah:

  • 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 "Docker kini boleh berjalan dalam Docker".

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 Paip sintaks, yang menjadikannya agak mudah untuk menukar skrip binaan dan menyimpannya dalam repositori.

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

Semasa menulis artikel ini, perbincangan timbul tentang menggunakan ejen pada pelayan jauh supaya tidak memuatkan nod induk menggunakan pemalam pemalam docker. Tetapi saya akan bercakap tentang ini pada masa akan datang.

Sumber: www.habr.com

Tambah komen