如何在jenkins作业中从容器内的脚本运行回购

时间:2018-11-02 19:59:56

标签: docker jenkins jenkins-plugins cloudbees repo

作为自由式作业的一部分,我无法在容器内非交互地运行repo。

它提示输入用户名和电子邮件。我通过在工作中进行git config --global来解决这个问题。

但是它会进行颜色测试,并且会无限期地挂起。

看回购的源代码,我看到了

if os.isatty(0) and os.isatty(1) and not self.manifest.IsMirror:
      if opt.config_name or self._ShouldConfigureUser():
        self._ConfigureUser()
      self._ConfigureColor()

因此,我在容器中运行了以下内容:

python -C "import os; print os.isatty(0), os.isatty(1)"

当然,它已经打印出True True

查看Jenkins日志,它将启动指定了--tty的容器,似乎无法配置该选项。

我找不到bash选项来强制脚本在非交互式shell中运行。如果我将上面的python行放入文件中,并使用几乎所有命令和选项的组合来执行它,它仍然会打印出True True

我发现 only 的另一种方式是是否使用I / O重定向

bash <a.sh

会打印出False True-即stdin不是tty,并且

bash <a.sh >a.log

将显示False False

对于复杂的脚本,使用bash <script方法是否有问题?

有人知道任何詹金斯魔术来阻止使用--tty启动docker吗?

我知道--tty是元凶。我在本地构建了容器,然后运行了以下

$ docker run repotest python -c "import os;print os.isatty(0), os.isatty(1)"
False False
$ docker run --tty repotest python -c "import os;print os.isatty(0), os.isatty(1)"
True True

运行版本:

  • 回购:1.12.37(根据Ubuntu 16.04 apt-get)
  • 詹金斯:2.149
  • Cloudbees Docker插件:1.7.3
  • 容器库为ubuntu:xenial

我正在使用“在docker容器内构建”选项。

1 个答案:

答案 0 :(得分:1)

要“非交互地”运行bash脚本repo_script.sh,或者更确切地说,在没有与标准流相关联的终端的情况下,您可以像这样简单地运行脚本

 repo_script.sh < /dev/null 2>&1 | cat

假设您希望以类似于repo_script.sh的方式查看输出。通过将标准输出和错误传递给其他进程,文件描述符显示为管道,而不是repo_script.sh的TTY。您也可以将输出定向到文件,或者如果不关心输出,甚至定向到/dev/null

 log_file=/dev/null
 repo_script.sh < /dev/null > "${log_file}" 2>&1

运行脚本
 bash < repo_script.sh | cat

也可能会起作用,尽管这是非常不合常规的,而且我认为运行脚本的黑手党方式只是为了打破TTY与标准输入的关联。从脚本引擎的角度来看,从文件中读取脚本程序与从标准输入中读取脚本程序是不同的(通常,如果它是终端,则不可搜索),因此可以< / em>可能以意想不到的方式咬你。这种方式无法将您的意图明确传达给下一个需要了解您代码的人,并且可能由于头部外伤而导致该人部分脱发。

不需要任何bash选项,仅使用如上所述的解释外壳中的输出方向即可轻松理解,兼容多平台的标准约定,以更改标准流关联。

P.S。我认为您的repo脚本只需测试标准输入是否为TTY就足够了。在我看来,该脚本的作者在那里没有足够深入的思考。如果您没有与标准输入相关联的终端设备,那么根本没有用等待输入,并且您可以确定一切都需要在没有用户交互的情况下运行,或者在不可能的情况下以错误停止。