jenkins pipeline 实践

jenkins 运行在什么地方

jenkins 上可以执行服务器命。执行代码的服务器是jenkins选中的节点,node。在jenkins中有一个节点列表,每一个任务都可以选在在哪个node上运行,jenkins所在的机器也可以是一个node,所以我们执行的任务,可以再jenkins 所在的机器上执行,也可以在其他的机器上执行。如果需要在jenkins pipeline中执行其他的服务器上的命令,那么就需要一些额外的插件来辅助我们完成. 这里我们用到的插件是ssh-steps-plugin.

pipeline 执行shell

下面给出了一个示例的jenkins pipeline。里面包含了在pipeline中执行远端server上的命令的方法。其中 32行 "current tag name is: ---> ${tag_name};中的变量${tag_name} 是对jenkins 参数的引用,在编译项目之前,我们可以通过这个选择框填写参数,帮助我们来构建要执行的任务。input 会在pipeline运行的过程中弹出一个确认框,来确认是否需要继续运行脚本,input("do you want to continue?");

着重介绍一下 withCredentials 里面的部分。 sshUserPrivateKey(); 里面的几个参数简单说明一下,第一个参数,credentialsId 表示这个是jenkins中凭证id.具体见下图。
《jenkins pipeline 实践》
《jenkins pipeline 实践》
《jenkins pipeline 实践》
这三个参数,单独说明, keyFileVariable: 'identity',表明将credential的密码存放在$identity 变量中,其余两个同理。 passphraseVariable: '', usernameVariable: 'userName'。这样我们的pipeline中就会避免直接写账号密码的尴尬局面,这些保密信息的存放是需要谨慎考虑的,所以我们才选择这个方式。

pipeline{
    agent any
    environment {
        test_env = "a sample test env"
    }
    stages {
        stage('Build') {
            steps {
                script {
                    wrap([$class: 'BuildUser'])
                    {
                        echo "full name is $BUILD_USER"
                        echo "user id is $BUILD_USER_ID"
                    }
                }
            }
        }
        stage('Test') {
            steps {
                script {
                    echo "current tag name is: ---> ${tag_name}";
                    input("do you want to continue?");
                    def remote = [:]
                    remote.name = 'nofile'
                    remote.host = '101.221.102.12'
                    remote.allowAnyHosts = true
                    withCredentials([
                        sshUserPrivateKey(
                            credentialsId: 'nofile',
                            keyFileVariable: 'identity',
                            passphraseVariable: '',
                            usernameVariable: 'userName')
                        ])
                    {
                        remote.user = userName
                        remote.identityFile = identity
                        sshCommand remote: remote, command:
                            '''
                            for i in {1..5}; do echo -n "Loop $i "; date ; sleep 1; done
                            '''
                    }
                }
            }
        }
    }
}

用到的插件

  1. SSH Pipeline Steps
  2. SSH Credentials
  3. user build vars plugin
  4. AnsiColor
  5. Credentials Plugin

这里列举了一部分,如果使用过程中发现功能缺失,很可能是没有对应的插件,所以考虑按照关键字搜索下对应的插件并安装尝试。

参考资料

  1. https://stackoverflow.com/questions/37219348/jenkins-pipeline-sh-bad-substitution
  2. https://blog.csdn.net/hxpjava1/article/details/79739848
  3. https://github.com/jenkinsci/ssh-steps-plugin#withcredentials
点赞