【问题标题】:Running the "exec" command in Jenkins "Execute Shell"在 Jenkins “Execute Shell”中运行“exec”命令
【发布时间】:2013-12-04 15:23:22
【问题描述】:

我在 Linux 主机上运行 Jenkins。我正在自动化 C++ 应用程序的构建。为了构建应用程序,我需要使用 4.7 版本的 g++,其中包括对 c++11 的支持。为了使用这个版本的 g++,我在命令提示符处运行以下命令:

exec /usr/bin/scl enable devtoolset-1.1 bash

所以我创建了一个“Execute shell”构建步骤并输入以下命令,在命令提示符下正确构建 C++ 应用程序:

exec /usr/bin/scl enable devtoolset-1.1 bash
libtoolize
autoreconf --force --install
./configure --prefix=/home/tomcat/.jenkins/workspace/project
make
make install
cd procs
./makem.sh /home/tomcat/.jenkins/workspace/project

问题是Jenkins不会在“exec /usr/bin/scl enable devtoolset-1.1 bash”命令之后运行任何命令,而是只运行“exec”命令,终止并将构建标记为成功.

关于如何重新构建上述结构以便 Jenkins 运行所有命令的任何想法?

谢谢!

【问题讨论】:

    标签: c++ linux bash c++11 jenkins


    【解决方案1】:

    在“执行 shell”脚本的开头,执行 source /opt/rh/devtoolset-1.1/enable 以启用 shell“内部”的 devtoolet。

    这给出了:

    source /opt/rh/devtoolset-1.1/enable
    libtoolize
    autoreconf --force --install
    ./configure --prefix=/home/tomcat/.jenkins/workspace/project
    make
    make install
    cd procs
    ./makem.sh /home/tomcat/.jenkins/workspace/project
    

    【讨论】:

    • 也适用于 v2 ;-) source /opt/rh/devtoolset-2/enable
    【解决方案2】:

    我需要查看scl 的实际作用。

    Examples
    
    scl enable example 'less --version'
        runs command 'less --version' in the environment with collection 'example' enabled
    scl enable foo bar bash
        runs bash instance with foo and bar Software Collections enabled
    

    所以你正在做的是运行一个 bash shell。我猜,bash shell 会立即返回,因为您处于非交互模式。 exec 在 shell 中运行命令而不创建新的 shell。这意味着如果新打开的 bash 结束,它也会提前结束你的 shell。我建议将所有构建步骤放入一个 bash 脚本(例如 run_my_build.sh)并按以下方式调用它。

    exec /usr/bin/scl enable devtoolset-1.1 run_my_build.sh
    

    【讨论】:

      【解决方案3】:

      这种事情通常在“查找”命令中起作用,但在这里可能起作用。与其运行两个或三个进程,不如运行一个执行多项操作的“sh”,如下所示:

      exec sh -c "thing1;thing2;thing3"

      如果您要求每一步都在下一步之前成功,请将分号替换为双&符号:

      exec sh -c "thing1 && thing2 && thing3"

      我不知道您希望一起执行哪些步骤,所以我希望您可以调整这个概念以满足您的需求。

      或者您可以将全部内容放入脚本并执行。

      【讨论】:

      • 嘿,马克:我试过做“&&”但是它仍然失败,因为当我运行“exec /usr/bin/scl enable devtoolset-1.1 bash”时,我相信一个单独的外壳已生成,但它仍会调用 4.4 版本的 GCC 而不是 4.7。我所做的只是像这样注入 PATH 变量: PATH=/opt/centos/devtoolset-1.1/root/usr/bin:$PATH 这基本上会将 4.7 g++ 可执行文件放在 4.4 之前,而且它只将此应用于项目。我不确定这是不是最好的解决方案,但它符合我想要做的。
      猜你喜欢
      • 1970-01-01
      • 2017-08-28
      • 2015-08-03
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多