2016-04-19 10 views
26

मैं जेनकींस में हमारे सभी निर्माणों के लिए जेनकिन्स फ़ाइल का उपयोग करने की कोशिश कर रहा हूं, और मुझे निम्नलिखित समस्या है। हम मूल रूप से 3 तरह का बनाता है:जेनकिन्सफाइल और शाखाओं के लिए विभिन्न रणनीतियों

  • पुल अनुरोध निर्माण - यह कोड की समीक्षा के बाद गुरु विलय हो जाएगा, और निर्माण काम करता है
  • मैनुअल पुल अनुरोध निर्माण - निर्माण के समान ही होता है उपर्युक्त, लेकिन उपयोगकर्ता द्वारा मैन्युअल रूप से ट्रिगर किया जा सकता है (उदाहरण के लिए यदि हमारे पास कुछ अस्थिर परीक्षण है)
  • प्रारंभिक निरंतर वितरण पाइपलाइन - यह कोड का निर्माण करेगा, भंडार पर तैनात करेगा, लक्ष्य सर्वर पर भंडार से कलाकृतियों को स्थापित करेगा और प्रारंभ करें आवेदन वहाँ

मुझे उपर्युक्त सभी बिल्डों को एक जेनकिन्सफाइल में कैसे शामिल करना चाहिए। अभी मेरे पास एकमात्र विचार है जो एक विशालकाय बनाना है यदि वह जांच करेगा कि यह कौन सी शाखा है और यह कदम उठाएगी।

तो मैं दो प्रश्न हैं:

1. कि उचित तरीके से Jenkinsfile में यह करने के लिए है?

  1. बहु-शाखा नौकरी प्रकार में वर्तमान में निष्पादित शाखा का नाम कैसे प्राप्त करें?

संदर्भ के लिए, मेरे वर्तमान Jenkinsfile है:

def servers = ['server1', 'server2'] 

def version = "1.0.0-${env.BUILD_ID}" 

stage 'Build, UT, IT' 
node { 
    checkout scm 
    env.PATH = "${tool 'Maven'}/bin:${env.PATH}" 
    withEnv(["PATH+MAVEN=${tool 'Maven'}/bin"]) { 
     sh "mvn -e org.codehaus.mojo:versions-maven-plugin:2.1:set -DnewVersion=$version -DgenerateBackupPoms=false" 
     sh 'mvn -e clean deploy' 
     sh 'mvn -e scm:tag' 
    } 
} 


def nodes = [:] 
for (int i = 0; i < servers.size(); i++) { 
    def server = servers.get(i) 
    nodes["$server"] = { 
     stage "Deploy to INT ($server)" 
     node { 
      sshagent(['SOME-ID']) { 
       sh """ 
       ssh ${server}.example.com <<END 
       hostname 
       /apps/stop.sh 
       yum -y update-to my-app.noarch 
       /apps/start.sh 
       END""".stripIndent() 
      } 
     } 
    } 
} 

parallel nodes 

संपादित करें: हटा राय आधारित प्रश्न

+0

की संभावित डुप्लिकेट [जेनकींस Multibranch पाइपलाइन: क्या शाखा का नाम चर रहा है] (http://stackoverflow.com/questions/32789619/jenkins-multibranch-pipeline-what- is-the-branch-name-variable) –

उत्तर

5

1) अगर यह उचित है मैं नहीं जानता, लेकिन यह आपकी समस्या सुलझती, मुझे लगता है कि काफी उचित है।

2) शाखा के नाम को जानने के लिए आप BRANCH_NAME चर का उपयोग कर सकते हैं, इसका नाम शाखा नाम से लिया गया है।

${env.BRANCH_NAME} 

यहाँ जवाब है: Jenkins Multibranch pipeline: What is the branch name variable?

+10

असल में यह '$ {env.BRANCH_NAME}' –

+0

हाँ है, आप सही हैं –

0
प्रश्नों के लिए

2 आप

श ऐसा करने में सक्षम हो सकता है 'Git शाखा> GIT_BRANCH' डीईएफ़ gitBranch = readfile 'GIT_BRANCH'

चूंकि आप गिट

4

से बाहर देख रहे हैं हमद्वारा उपयोग किए गए मॉडल का पालन करते हैं निर्माण के लिए, हमें इसकी आवश्यकता के अनुसार tweaking, जहां Jenkinsfile शाखा और तैनाती हैंडलिंग तर्क परिभाषित करने के लिए प्रयोग किया जाता है, और release.groovy फ़ाइल तर्क बनाने के लिए फ़ाइल का उपयोग किया जाता है।

यहाँ हमारे Jenkinsfile एक पाइप लाइन है कि लगातार मास्टर शाखा से देव में तैनात करने के लिए की तरह लग रहा है:

#!groovy 
import com.terradatum.jenkins.workflow.* 

node { 

    wrap([$class: 'TimestamperBuildWrapper']) { 
    checkout scm 

    echo "branch: ${env.BRANCH_NAME}" 
    def pipeline = load "${pwd()}/release.groovy" 

    if (env.DEPLOY_ENV != null) { 
     if (env.DEPLOY_ENV.trim() == 'STAGE') { 
     setDisplayName(pipeline.staging() as Version) 
     } else if (env.DEPLOY_ENV.trim() == 'PROD') { 
     setDisplayName(pipeline.production() as Version) 
     } 
    } else if (env.BRANCH_NAME == 'master') { 
     try { 
     setDisplayName(pipeline.development() as Version) 
     } catch (Exception e) { 
     hipchatSend color: 'RED', failOnError: true, message: "<p>BUILD FAILED: </p><p>Check console output at <a href='${env.BUILD_URL}'>${env.JOB_NAME} [${env.BUILD_NUMBER}]</a></p><p><pre>${e.message}</pre></p>", notify: true, room: 'Aergo', v2enabled: false 
     throw e; // rethrow so the build is considered failed 
     } 
    } else { 
     setDisplayName(pipeline.other() as Version) 
    } 
    } 
} 

def setDisplayName(Version version) { 
    if (version) { 
    currentBuild.displayName = version.toString() 
    } 
} 

नोट: यदि आप हमारे वैश्विक पाइपलाइन पुस्तकालय here के लिए कोड पा सकते हैं।

+0

मैं कहूंगा, यह मेरे लिए वास्तव में सहायक था, लेकिन इसके बजाय release.groovy फ़ाइल का उपयोग क्यों करें release.groovy से vars/... के तहत विधियों को शामिल करने और रिलीज.groovy लोड किए बिना उन्हें विश्व स्तर पर सुलभ रखने के लिए? मैं केवल इसलिए पूछता हूं क्योंकि मैं एक समान सड़क पर जाने वाला हूं जहां मेरी 'रूट' जेनकिन्सफाइल में पाइपलाइन के लिए केवल कॉन्फ़िगरेशन है, जो वर्र्स/से एक विधि द्वारा लिपटा हुआ है ... जो पूरे निर्माण को परिभाषित करता है, vars/... विधियों को लोड करता है और आवश्यकतानुसार वैश्विक libs। यहां लक्ष्य यह है कि अंतिम उपयोगकर्ताओं को आवश्यक कॉन्फ़िगरेशन को परिभाषित करके और उनके निर्माण प्रकार को कॉल करके अपने स्वयं के जेनकिन्सफाइल लिखने दें। – user797963

+0

यहां एक लिंक है जो बेहतर बताता है कि मैं किसके लिए जा रहा हूं: https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-a-more- संरचित-dsl। जेनकिन्सफाइल में buildPlugin {} में सभी आवश्यक कॉन्फ़िगरेशन होंगे, और buildPlugin.groovy फ़ाइल में पूरे निर्माण को चलाने के लिए कई चरण और चरण होंगे (लिंक में केवल मामूली उदाहरण नहीं)। – user797963

+0

आप निश्चित रूप से 'release.groovy' से कोड को अपनी वैश्विक पाइपलाइन लाइब्रेरी में धक्का दे सकते हैं, इस चेतावनी के साथ कि आप ऐसी परिस्थिति से बचना चाहते हैं जहां आपके पास एक पुस्तकालय में एक ही निर्माण के लिए विशिष्ट कोड है जो सेवा के लिए डिज़ाइन किया गया है सभी बनाता है। – rbellamy

12

आप जोड़ सकते हैं कई चरणों के लिए बयान करता है, तो आप शाखा के अनुसार कई चरणों को छोड़ के रूप में चाहते हैं:

stage("Deploy"){ 
    if(env.BRANCH_NAME == 'master'){ 
    // Deploy steps here 
    } 
} 
:

if(env.BRANCH_NAME == 'master'){ 
    stage("Upload"){ 
     // Artifact repository upload steps here 
     } 
    stage("Deploy"){ 
     // Deploy steps here 
     } 
    } 

या, आप इसे अलग-अलग चरण में के रूप में जोड़ सकते हैं

+0

सरल और उत्कृष्ट! – oblivion

0

यह नहीं पता कि आप क्या चाहते हैं .. मुझे पसंद है क्योंकि यह अधिक संरचित दिखता है।

Jenkinsfile

node { 
    def rootDir = pwd() 

    def branchName = ${env.BRANCH_NAME} 

    // Workaround for pipeline (not multibranches pipeline) 
    def branchName = getCurrentBranch() 

    echo 'BRANCH.. ' + branchName 
    load "${rootDir}@script/Jenkinsfile.${branchName}.Groovy" 
} 

def getCurrentBranch() { 
    return sh (
     script: 'git rev-parse --abbrev-ref HEAD', 
     returnStdout: true 
    ).trim() 
} 

Jenkinsfile। mybranch .Groovy

echo 'mybranch' 
// Pipeline code here 
संबंधित मुद्दे