Kumaha cara ngumpulkeun proyék di Jenkins upami anjeun peryogi seueur lingkungan anu béda

Kumaha cara ngumpulkeun proyék di Jenkins upami anjeun peryogi seueur lingkungan anu béda

Aya seueur tulisan ngeunaan Habré ngeunaan Jenkins, tapi sakedik ngajelaskeun conto kumaha Jenkins sareng agén docker damel. Sadaya alat ngawangun proyék populér sapertos Drone.io, Pipa Bitbucket, GitLab, Tindakan GitHub jeung sajabana, bisa ngumpulkeun sagalana dina peti. Tapi kumaha upami Jenkins?

Dinten aya solusi pikeun masalah: Jenkins 2 hébat dina gawé bareng agén Docker. Dina tulisan ieu kuring hoyong bagikeun pangalaman kuring sareng nunjukkeun kumaha anjeun tiasa ngalakukeunana sorangan.

Naha kuring mimiti ngarengsekeun masalah ieu?

Kusabab urang di parusahaan Citronium Kusabab urang ngagunakeun loba téknologi béda, urang kudu tetep versi béda tina Node.JS, Gradle, Ruby, JDK sarta séjén dina mesin assembly. Tapi mindeng konflik versi teu bisa dihindari. Leres, anjeun leres upami anjeun nyarios yén aya sababaraha manajer versi sapertos nvm, rvm, tapi henteu sadayana lancar sareng aranjeunna sareng solusi ieu ngagaduhan masalah:

  • jumlah badag runtime nu pamekar poho pikeun ngabersihan;
  • aya konflik antara versi béda tina runtimes sarua;
  • Unggal pamekar peryogi sakumpulan komponén anu béda.

Aya masalah sejen, tapi hayu atuh ngabejaan Anjeun tentang solusi.

Jenkins di Docker

Kusabab Docker ayeuna parantos mapan di dunya pamekaran, ampir sadayana tiasa dijalankeun nganggo Docker. Solusi kuring nyaéta gaduh Jenkins di Docker sareng tiasa ngajalankeun wadah Docker anu sanés. Patarosan ieu mimiti ditaroskeun deui dina 2013 dina tulisan "Docker ayeuna tiasa ngajalankeun dina Docker".

Pondokna, anjeun ngan ukur kedah masang Docker sorangan dina wadah kerja sareng pasang filena /var/run/docker.sock.

Ieu conto Dockerfile anu tétéla pikeun 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

Janten, kami ngagaduhan wadah Docker anu tiasa ngalaksanakeun paréntah Docker dina mesin host.

Setélan ngawangun

Teu lila pisan Jenkins meunang kasempetan pikeun ngajelaskeun aturan na ngagunakeun pipa sintaksis, anu matak ngagampangkeun ngarobih skrip ngawangun sareng nyimpenna dina gudang.

Ku kituna hayu urang nempatkeun hiji Dockerfile husus dina Repository sorangan, nu bakal ngandung sakabéh perpustakaan diperlukeun pikeun ngawangun. Ku cara ieu, pamekar sorangan tiasa nyiapkeun lingkungan anu tiasa diulang sareng henteu kedah naroskeun OPS pikeun masang versi khusus Node.JS dina host.

FROM node:12.10.0-alpine

RUN npm install yarn -g

Gambar ngawangun ieu cocog pikeun kalolobaan aplikasi Node.JS. Kumaha upami, contona, anjeun peryogi gambar pikeun proyék JVM kalayan panyeken Sonar kalebet di jero? Anjeun bébas milih komponén nu peryogi pikeun assembly.

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/

Urang digambarkeun lingkungan assembly, tapi naon Jenkins kudu ngalakukeun jeung eta? Sareng agén Jenkins tiasa damel sareng gambar Docker sapertos kitu sareng ngawangun aranjeunna sacara 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"
    }
}

Pitunjuk agent ngagunakeun harta dockerdimana anjeun tiasa nangtukeun:

  • nami wadahna assembly nurutkeun kawijakan ngaran anjeun;
  • argumen diperlukeun pikeun ngajalankeun wadahna ngawangun, dimana bisi urang Gunung diréktori ayeuna salaku diréktori jero wadahna.

Sareng parantos dina léngkah-léngkah ngawangun kami nunjukkeun paréntah mana anu kedah dieksekusi di jero agén ngawangun Docker. Ieu tiasa nanaon, janten kuring ogé ngaluncurkeun panyebaran aplikasi nganggo ansible.

Handap Abdi hoyong nembongkeun Jenkinsfile generik yén aplikasi Node.JS basajan bisa ngawangun.

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()
        }
    }

}

Aya naon?

Hatur nuhun kana metoda ieu, urang ngajawab masalah di handap ieu:

  • waktos konfigurasi assembly lingkungan diréduksi jadi 10 - 15 menit per proyék;
  • lingkungan ngawangun aplikasi sagemblengna repeatable, saprak anjeun bisa ngawangun eta cara kieu dina komputer lokal Anjeun;
  • teu aya masalah sareng konflik antara versi béda tina parabot assembly;
  • salawasna hiji workspace bersih nu teu meunang clogged.

Solusi sorangan basajan tur atra tur ngidinan Anjeun pikeun meunangkeun sababaraha kaunggulan. Leres, bangbarung éntri parantos ningkat sakedik dibandingkeun sareng paréntah saderhana pikeun majelis, tapi ayeuna aya jaminan yén éta bakal salawasna diwangun sareng pamekar nyalira tiasa milih sadayana anu dipikabutuh pikeun prosés ngawangunna.

Anjeun oge bisa make gambar kuring dikumpulkeun Jenkins + Docker. Sadaya sumber kabuka sareng ayana di rmuhamedgaliev/jenkins_docker.

Nalika nyerat tulisan ieu, timbul diskusi ngeunaan ngagunakeun agén dina server jauh supados henteu ngamuat master node nganggo plugin. docker-plugin. Tapi kuring bakal ngobrol ngeunaan ieu dina mangsa nu bakal datang.

sumber: www.habr.com

Tambahkeun komentar