在我的计算机上bash
在docker:git
上一直持续。
~ # bash
bash-4.4# ps
PID USER TIME COMMAND
1 root 0:00 sh
26 root 0:00 bash
32 root 0:00 ps
bash-4.4# echo $0
bash
bash-4.4# echo $SHELL
/bin/ash
ash
似乎有些不安,但是我可以运行#!/bin/bash
文件,到目前为止还可以。
但是,在gitlab.com上的Gitlab CI上,命令bash
不会返回任何内容,但它似乎不会继续运行。为什么会这样?
$ apk add --update bash
$ bash
$ ps && pwd && echo $0 && echo $SHELL && ls /bin
PID USER TIME COMMAND
1 root 0:00 /bin/sh
10 root 0:00 /bin/sh
25 root 0:00 ps
/builds/230s/industrial_calibration
/bin/sh
ash
base64
bash
bashbug
:
计算机上更详细的输出:
$ lsb_release -a|grep Description
No LSB modules are available.
Description: Ubuntu 16.04.4 LTS
$ docker pull docker:git
$ docker images | grep -i docker
docker git 5c58d1939c5d 10 days ago 152MB
$ docker run -it docker:git
~ # apk add --update bash
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
:
(10/10) Installing tar (1.29-r1)
Executing busybox-1.27.2-r11.trigger
OK: 37 MiB in 31 packages
~ # bash
bash-4.4# ps
PID USER TIME COMMAND
1 root 0:00 sh
26 root 0:00 bash
32 root 0:00 ps
bash-4.4# echo $0
bash
bash-4.4# echo $SHELL
/bin/ash
.gitlab-ci.yml
使用(由于传递的文件使用bash
特定的语法,因此在最后一行失败):
image: docker:git
before_script:
- apk add --update bash coreutils tar # install industrial_ci depedencies
- bash
- git clone https://github.com/plusone-robotics/industrial_ci.git .ci_config -b gitlab_modularize
- ps && pwd && echo $0 && echo $SHELL && ls /bin
- source ./.ci_config/industrial_ci/src/tests/gitlab_module.sh
更新:在bash -c
中购买基于bash的文件确实有效,但是对我来说可能没有用,因为我真正想要的是使用该文件中定义的函数,并且因为{ {1}}行终止并且不携带上下文,该功能将在后面的IMO行中不可用。
bash -c
答案 0 :(得分:0)
image: alpine
before_script:
- apk add --update bash coreutils tar
- bash
- echo smth
现在假设您是计算机。您等待每个命令完成后再执行下一个命令,而无需使用键盘。所以你会怎么做?让我们尝试使用Alpine,用;
替换换行符:
$ docker run -ti --rm alpine sh -c 'apk add --update bash; bash; echo smth'
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/6) Installing pkgconf (1.3.10-r0)
(2/6) Installing ncurses-terminfo-base (6.0_p20171125-r0)
(3/6) Installing ncurses-terminfo (6.0_p20171125-r0)
(4/6) Installing ncurses-libs (6.0_p20171125-r0)
(5/6) Installing readline (7.0.003-r0)
(6/6) Installing bash (4.4.19-r1)
Executing bash-4.4.19-r1.post-install
Executing busybox-1.27.2-r7.trigger
OK: 13 MiB in 17 packages
bash-4.4#
您不要触摸键盘。您可以无休止地等待bash-4.4#
行消失,因为bash会无休止地等待您键入任何内容。 echo smth
命令将永远不会执行,gitlab将超时,等待bash结束。
现在,如果您想使用gitlab-ci在bash中使用bash在高山中执行某些操作,我建议您这样做:创建一个可执行脚本ci-myscript.sh
,您将其添加并提交到您的仓库中:
$ cat ci-myscript.sh
#!/bin/bash
git clone https://github.com/plusone-robotics/industrial_ci.git .ci_config -b gitlab_modularize
ps && pwd && echo $0 && echo $SHELL && ls /bin
source ./.ci_config/industrial_ci/src/tests/gitlab_module.sh
第一行#!/bin/bash
告诉Shell应该在bash
下执行此脚本。现在,从您的gitlab-ci中运行:
image: docker:git
before_script:
- apk add --update bash coreutils tar
- ./ci-myscript-sh
创建这样的脚本实际上是一个很好的工作流程,因为您可以先在计算机上本地测试脚本,然后再在gitlab-ci中对其进行测试。
另一种选择是按@Mazel在注释中建议的单次调用bash。
image: docker:git
before_script:
- apk add --update bash coreutils tar
- bash -c 'git clone https://github.com/plusone-robotics/industrial_ci.git .ci_config -b gitlab_modularize; ps && pwd && echo $0 && echo $SHELL && ls /bin; source ./.ci_config/industrial_ci/src/tests/gitlab_module.sh'
那样,您需要在一行中调用所有内容,因为下一行与上一行不会具有相同的环境。