如何在检出Jenkinsfile中的存储库之前清理管道

guz6ccqo  于 2023-06-05  发布在  Jenkins
关注(0)|答案(2)|浏览(149)

我想做一个clean before checkout操作,在Jenkins git插件文档中描述:
在每次 checkout 之前清理工作区,方法是删除所有未跟踪的文件和目录,包括. gitignore中指定的文件和目录。...
但如何将此选项添加到默认的结帐步骤,这是做的第一步?
我觉得它应该是git插件扩展的一个选项,可以包含在Jenkinsfile的options块中,如文档中所述:
options指令允许从Pipeline本身内部配置Pipeline特定的选项。Pipeline提供了许多这样的选项,例如buildDiscarder,但它们也可能由插件提供。
但是,如何应该知道哪些选项和他们的名字这个插件提供?没有在文档中找到它,也可能是我错了,clean before checkout应该放在Jenkinsfile的options块中。
请帮帮我

gajydyqb

gajydyqb1#

正如在评论中已经提到的,要做的是在管道中使用skipDefaultCheckout()(Source)-选项,以便在管道启动时不 checkout 存储库。

skipDefaultCheckout

默认情况下,在代理指令中跳过从源代码管理 checkout 代码。
要手动获取存储库,可以使用checkout scmSource

pipeline {
    agent any
    options {
        skipDefaultCheckout()
    }
    stages {
        stage('Example') {
            steps {
                // Cleanup before starting the stage
                // deleteDir() / cleanWs() or your own way of cleaning up

                // Checkout the repository
                checkout scm 

                // do whatever you like
            }
        }
    }
}
lkaoscv7

lkaoscv72#

我的工作之一,我用这个:

def gitCheckoutExtensions = []
    if (cleanWorkspace) {
        println '>>> workspace will be cleaned and retrieved all codes again..!'
        gitCheckoutExtensions.push([$class: 'CleanBeforeCheckout'])
    }

    gitCheckoutExtensions.push([$class: 'LocalBranch', localBranch: srcBranch])

    checkout([
        $class: 'GitSCM',
        branches: [[name: "*/${srcBranch}"]],
        doGenerateSubmoduleConfigurations: false,
        extensions: gitCheckoutExtensions,
        submoduleCfg: [],
        userRemoteConfigs: [
            [
                credentialsId: credId,
                url: url
            ]
        ]
    ])

较长的阶段形式是:

@Library('gui_multi_repo@master')_

pipeline {
    agent {
        docker {
            label "DockerAgent"
            image "node:14.21.3"
        }
    }
    
    parameters {
        string(trim: true, name: 'REPO_URL', defaultValue: "http://user.name@server_domain_or_ipAddres", description: 'Repo adresi')
        string(trim: true, name: 'REPO_CRED_ID', defaultValue: RepoCredId, description: 'GIT Repo bağlantısı olacaksa CRED_ID kullanılacak')
        string(trim: true, name: 'REPO_SOURCE_BRANCH_NAME', defaultValue: 'refs/remotes/origin/developer', description: 'Kodları hangi BRANCH üstünden çekeceğini belirtiyoruz')
        string(trim: true, name: 'REPO_TARGET_BRANCH_NAME', defaultValue: 'refs/remotes/origin/master', description: 'Push ile kodun gönderileceği branch')
    }
    
    stages {
        stage("Git İşlemleri") {
            steps {
                script {
                    def credId="${params.REPO_CRED_ID}"
                    def repoUrl="${params.REPO_URL}"
                    def srcBranch="${params.REPO_SOURCE_BRANCH_NAME}"
                    def targetBranch="${params.REPO_TARGET_BRANCH_NAME}"
                    def tagName="cem13"
                    def tagMessage="naber13"
                    
                    echo "credId: $credId"
                    echo "repoUrl: $repoUrl"
                    echo "srcBranch: $srcBranch"
                    echo "targetBranch: $targetBranch"
                    echo "tagName: $tagName"
                    echo "tagMessage: $tagMessage"
                    
                    /** 
                     * CredId ile tanımlanan Git kimlik bilgilerini alır
                     * Artık GIT_USERNAME ve GIT_PASSWORD değişkenleri içinde, verilen credId'nin
                     * kullanıcı adı ve şifresi olacak ve tüm çıktılarda *** ile gizlenecek
                     */
                    
                    checkout([$class: 'GitSCM',
                        branches: [[name: "${srcBranch}"]],
                        extensions: [
                            [$class: 'CleanBeforeCheckout']
                        ],
                        userRemoteConfigs: [[
                            // credId veya gitCredentials.id ile tanımlanan kullanıcı bilgilerinin id değeri verilir
                            credentialsId: "${credId}", 
                            url: "${repoUrl}"
                        ]]
                    ])
                    
                    withCredentials([usernamePassword(credentialsId: "${credId}", passwordVariable: 'GIT_PASSWORD', usernameVariable: 'GIT_USERNAME')]) {
                        
                        def gitUrlWithCredentials = repoUrl.replaceFirst(/(http[s]:\/\/).*@(.*)/,"\$1${GIT_USERNAME}:${GIT_PASSWORD}@\$2")
                        echo "gitUrlWithCredentials: ${gitUrlWithCredentials}"
                        
                        sh """
                            #!/bin/sh -e
                            
                            git config --global credential.helper cache
                            git config --global push.default simple
                            
                            # Kullanıcı e-posta adresini ayarlar
                            git config --global user.email "${GIT_USERNAME}@domain.com"
                            
                            # Kullanıcı adını ayarlar
                            git config --global user.name "${GIT_USERNAME.replace('.', ' '}" 
                            
                            # SSL Doğrulama yapmaz
                            git config --global http.sslverify 'false'
                            
                            # Git URL'sinde parolayı kullanarak güncellenmiş URL'yi oluşturun
                            git tag -a ${tagName} -m '${tagMessage}'
                         
                            git push ${gitUrlWithCredentials} ${tagName}
                            
                            git checkout ${targetBranch}
                            
                            # sonra birleştireceğimiz 'kaynak dalını' isteyelim
                            git merge ${srcBranch}
                            
                            git push ${gitUrlWithCredentials} ${targetBranch}
                        """
                    }
                }
            }
        }
        
    }
    
    post { 
        success{
            echo "** Süreç başarıyla tamamlandı"
        }
        failure {
            echo "** Süreç hatalı tamamlandı"
        }
        cleanup{
            echo "** Süreç tamamlandı cleanup zamanı"
        }
        always { 
            echo "** Süreç günahıyla sevabıyla tamamlandı"
        }
    }

}

相关问题