如何根据git标签配置jenkins来发布软件?

时间:2018-01-26 09:26:43

标签: jenkins continuous-integration gitlab jenkins-pipeline continuous-deployment

我正在尝试配置Jenkins 管道以执行以下任务:

  1. Git lab使用Web Hook启动Jenkins工作。

  2. 从git repo中提取数据。 (完成)

  3. 启动docker容器以测试Angular应用程序。 (完成)

  4. 下载Google Chrome并在docker容器中安装。 (完成)

  5. 使用Karma运行Angular测试。 (完成)

  6. 检查提交是否已标记为Release

  7. 如果不是这样的话就停止。

  8. 如果是这种情况,则部署应用程序以测试环境

  9. 什么阻碍了进展:

    • 我不知道如何检查Git提交是否标记为Release 或不。

    • 如果标签中没有标签,如何停止构建?

    我还注意到输出GIT_COMMIT env变量它始终为null

    echo "Commit: ${env.GIT_COMMIT}"
    

    管道{

    agent none
    
    stages {
    
        // Starge 1: Get the data from git
        stage('Preparation') {
    
            agent any
            steps {
    
                git branch: 'master', credentialsId: 'MY_CREDENTIALS', url: 'http://gitlab/root/test2.git'
            }
        }
    
    
        // Stage 2: Build the image and test the repo
        stage("Start docker and run the tests") {
    
            agent { 
    
                //dockerfile true
    
                docker {
                    //image 'node:latest'
                    image 'teracy/angular-cli'
                    args '-u root --network=gitlab_inet'       
                }
    
            }
    
            steps {
                echo "Tag: ${env.BUILD_TAG}"
                sh 'wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb &>/dev/null'
    
                sh 'dpkg -i google-chrome-stable_current_amd64.deb; apt-get -fy install'
                sh 'rm -f google-chrome-stable_current_amd64*'
    
                sh 'export CHROME_BIN=/usr/bin/google-chrome'
    
                sh 'ng -v'
                sh 'npm install && npm run test'
            }
    
        }
    
    
    }
    

    }

    有关配置的说明:

    我正在使用gitlab并在Jenkins上使用gitlab插件。

    有关管道的说明

    我知道使用自由样式构建我可以在Refspec字段中指定标记。但是我想构建一个管道并为每个构建产生一个docker容器。

1 个答案:

答案 0 :(得分:1)

我认为这可以帮到你

pipeline {
    agent any

    stages {
        stage ('Checkout') {
            steps {
                git branch: 'master', credentialsId: 'xxx', url: 'url-to-my-gitrepo.git'
            }
        }
        stage ('Optional Deploy') {
            when {
                expression { 
                    TAG = sh returnStdout: true, script: 'git tag --contains ' + "\$(git log --pretty=format:%h -n 1)" + ''
                    return TAG == 'Release' 
                }
            }
            steps {
                echo 'Commit contains a tag RELEASE'
                echo 'Deploying'
            }
        }
    }

    post {
        always {
            cleanWs()
        }
    }
}

这将首先检查您的主分支。然后它将通过一个表达式。我创建了一个变量TAG。此标记包含您提交的TAG。所以要理解,首先我会得到我的回购的最后一次提交:

git log --pretty=format:%h -n 1

然后我将检查该特定提交上是否有标记并修改输出:

git tag --contains COMMITHASH.trim()

最后我要比较一下TAG == 'Release'。 如果是,它将在下一个steps部分和echo两个部分进行,您可以开始部署。如果它与完成的管道不匹配并清除帖子部分中的所有内容。