【问题标题】:Run a set of linux commands using Jenkinsfile in Jenkins在 Jenkins 中使用 Jenkinsfile 运行一组 linux 命令
【发布时间】:2021-06-04 19:07:21
【问题描述】:

我必须创建一个 jenkins 作业来自动执行某些任务,这些任务将执行某些操作,例如更新公共站点、将公共版本更改为最新的公共版本、更新公共站点上的软件和重新启动服务器,这些包括某些操作,例如将文件复制到一个 tmp 文件夹,登录到本地服务器,转到该文件夹​​并解压缩文件等。 我创建了 jenkinsfile 如下:

pipeline {
    options {
        skipDefaultCheckout()
        timestamps()
    }
    parameters {
        string(name: 'filename', defaultValue: 'abc', description: 'Enter the file name that needs to be copied')
        string(database: 'database', defaultValue: 'abc', description: 'Enter the database that needs to be created')
        choice(name: 'Run', choices: '', description: 'Data migration')
    }
    agent {
        node { label 'aws && build && linux && ubuntu' }
    }
    triggers {
        pollSCM('H/5 * * * *')
    }
    stages {
        stage('Clean & Clone') {
            steps {
                cleanWs()
                checkout scm
            }
        }
        stage('Updating the public site'){
            steps{
                sh "scp ./${filename}.zip <user>@<server name>:/tmp"
                sh "ssh <user>@<server name>"
                sh "cp ./tmp/${filename}.zip ./projects/xyz/xyz-site/"
                sh "cd ./projects/xyz/xyz-site/ "
                sh "unzip ./${filename}.zip"
                sh "cp -R ./${filename}/* ./"
        }
        stage('Changing public version to latest public release') {
            steps {
                sh "scp ./${filename}.sql.gz <user>@<server name>:/tmp"
                sh "ssh <user>@<server name>"
                sh "mysql -u root -p<PASSWORD>"
                sh "show databases;"
                sh "create database ${params.database};"
                sh "GRANT ALL PRIVILEGES ON <newdb>.* TO 'ixxyz'@'localhost' WITH GRANT OPTION;"
                sh "exit;"
                sh "zcat tmp/${filename}.sql.gz | mysql -u root -p<PASSWORD> <newdb>"
                sh "db.default.url="jdbc:mysql://localhost:3306/<newdb>""    
                sh "ps aux|grep monitor.sh|awk '{print "kill "$2}' |bash"             
            }
        }
        stage('Updating Software on public site') {
            steps {
                sh "scp <user>@<server>:/tmp/abc<version>_empty_h2.zip"
                sh "ssh <user>@<server name>"
                sh "su <user>"
                sh "mv tmp/<version>_empty_h2.zip ./xyz/projects/xyz"
                sh "cd xyz/projects/xyz"
                sh "cp latest/conf/local.conf <version>_empty_h2/conf/"         
            }    
        }
        stage('Restarting Server') {
            steps {
                sh "rm latest/RUNNING_PID"
                sh "bash reload.sh"
                sh "nohup bash monitor.sh &"       
            }           
        }
    }
}


有没有办法可以动态获取根文件夹中的 zip 文件名?我使用了${filename}.zip ,但它似乎不起作用。

另外,有没有更好的方法来使用 jenkins 执行这些操作?非常感谢任何帮助。

【问题讨论】:

  • 尝试使用 ${filename}.zip 的绝对路径

标签: bash shell jenkins jenkins-pipeline jenkins-groovy


【解决方案1】:

您可以在一个 shell 脚本中为每个阶段编写所有步骤,并在一个阶段下执行。
关于filename.zipeither,您可以将其作为parameter 并将此值传递给您的阶段。或者您也可以使用find 命令作为 shell 命令或 shell 脚本在当前目录中查找 .zip 文件。
find &lt;dir&gt; -iname \*.zip
find . -iname \*.zip .

例子:

pipeline {
    options {
        skipDefaultCheckout()
        timestamps()
    }
    parameters {
         
         string(name: 'filename', defaultValue: 'abc', description: 'Enter the file name that needs to be copied')
        choice(name: 'Run', choices: '', description: 'Data migration')
    }
    stage('Updating the public site'){
            steps{
                sh "scp ./${params.filename}.zip <user>@<server name>:/tmp"
                ...
            }
        }
}

要根据您的问题在某个位置执行脚本,您可以使用 dir 和放置脚本的路径。
或者你也可以直接给路径sh label: 'execute script', script:"C:\\Data\\build.sh"

stage('Your stage name'){
            steps{
                   script {
                           // Give path where your scripts are placed
                           dir ("C:\\Data") {
                             sh label: 'execute script', script:"build.sh <Your Arguments> "
                ...
                            }
                   }
                
            }
        }

【讨论】:

  • 感谢您的回答。这是一种更好的方法,以便用户可以在 jenkins 中输入文件名,并将文件名传递给脚本。在一个阶段执行所有命令是否会带来任何好处?不是很容易区分每个阶段,以便于跟踪吗?另外,有没有办法可以将密码传递给脚本?我正在考虑的一种方法是将其存储在 Jenkins 的配置文件中并将其作为 ARG 传递。还有其他更好的方法吗?
  • @merilstack:您可以保留所有阶段并为每个阶段设置一个 shell 脚本。我只是为一个阶段提供了一个示例。是的,您可以通过参数将密码传递给此脚本。例如:``` sh(script "script1 --password ="" ")``` 或者您也可以使用 jenkins 的凭据并将该变量作为输入传递给您的脚本
  • @merilstack 你还需要其他信息吗
  • 所以如果我为每个阶段传递一个shell脚本,那么它们应该与源代码中的Jenkinsfile放在同一个文件夹中对吧?
  • @merilstack 是的,或者您还提供脚本所在的路径。例如:dir("C:\\Data") { }`` 我已在答案中添加了此内容
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
  • 1970-01-01
相关资源
最近更新 更多