webentwicklung-frage-antwort-db.com.de

Jenkinsfile und unterschiedliche Strategien für Filialen

Ich versuche, die Jenkins-Datei für alle unsere Builds in Jenkins zu verwenden, und ich habe folgendes Problem: Wir haben im Wesentlichen drei Arten von Builds:

  • pull-Request Build - es wird zusammengeführt, um es nach der Codeüberprüfung zu beherrschen, und ob Build funktioniert
  • manuelles Pull-Request-Build - Ein Build, das dasselbe wie oben ausführt, aber vom Benutzer manuell ausgelöst werden kann (z. B. wenn wir einen instabilen Test haben)
  • eine anfängliche Pipeline für die kontinuierliche Bereitstellung - dies wird den Code erstellen, für das Repository bereitstellen, Artefakte vom Repository auf dem Zielserver installieren und die Anwendung dort starten

Wie sollte ich alle oben genannten Builds in einem einzigen Jenkinsfile zusammenfassen ...? Im Moment besteht die einzige Idee darin, einen Riesen zu erstellen, wenn dies den Zweig überprüft und die Schritte ausführt.

Ich habe also zwei Fragen:

1. Ist dies der richtige Weg, um dies in Jenkinsfile zu tun?

  1. Wie erhalte ich den Namen der aktuell ausgeführten Verzweigung in einem Typ mit mehreren Verzweigungen?

Hier sehen Sie meine aktuelle 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

BEARBEITEN: Meinungsfrage gestrichen

31

Sie können die If-Anweisung für mehrere Stufen hinzufügen, wenn Sie mehrere Stufen je nach Zweig überspringen möchten.

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

oder Sie können es zu einzelnen Stufen hinzufügen, wie in:

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

1) Ich weiß nicht, ob es angebracht ist, aber wenn es Ihr Problem löst, denke ich, ist es angemessen.

2) Um den Namen der Verzweigung zu kennen, können Sie die Variable BRANCH_NAME verwenden, deren Name dem Zweignamen entnommen wird.

${env.BRANCH_NAME}

Hier ist die Antwort: Jenkins Multibranch-Pipeline: Wie lautet die Zweignamenvariable?

6
Kendru Estrada

Wir folgten dem von fabric8 für Builds verwendeten Modell und passten es nach Bedarf an, wobei die Jenkinsfile zum Definieren der Verzweigungs- und Implementierungslogik und eine release.groovy-Datei für die Buildlogik verwendet wurden.

So sieht unsere Jenkinsfile für eine Pipeline aus, die kontinuierlich vom Hauptzweig in DEV implementiert wird:

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

Hinweis: Sie finden den Code für unsere globale Pipeline-Bibliothek hier .

3
rbellamy

Mit dieser Post funktionierte das für mich:

        stage('...') {
            when {
                expression { env.BRANCH_NAME == 'master' }
            }
            steps {
                ...
            }
        }

2
Mickaël

Ich weiß nicht, ob das, was Sie wollen ... Ich bevorzuge, weil es strukturierter aussieht.

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
0
b.ben

In meinem Szenarium musste eine Phase Deploy Artifactory nur ausgeführt werden, wenn der Zweig master (webhook Gitlab) war.

Unter dem Code meiner Jenkinsfile:

stages {

    stage('Download'){

        when{
            environment name: 'gitlabSourceBranch', value: 'master'

        }

        steps{
            echo "### Deploy Artifactory ###"

            }       
    }

}

0
Renato Coutinho

für Fragen 2 können Sie dies tun

sh 'git branch> GIT_BRANCH' def gitBranch = readFile 'GIT_BRANCH'

da gehst du von git aus

0
Ross Beazley