让 gitlab 作业不等待“脚本”部分的任何返回

Posted

技术标签:

【中文标题】让 gitlab 作业不等待“脚本”部分的任何返回【英文标题】:Make gitlab job not wait for any return from "script" section 【发布时间】:2021-07-13 17:37:35 【问题描述】:

在 gitlab 管道 (gitlab-ci.yml) 中,我使用 SSHPASS 通过临时 IP 配置基于 linux 的设备以实现自动化。

script:
  - sshpass -p $TARGET_password ssh -o StrictHostKeyChecking=no $TARGET_username@$TARGET_IP 'bash -s' < $configfile

我正在发送一个包含一堆命令的脚本,最后一个是配置永久 IP。 一旦脚本更改了 IP,作业就会挂起并不确定地等待任何返回,因为它丢失了与临时 IP 的会话。

问题:

是否可以发送更改 IP 的命令并立即断开连接而不等待任何返回。 是否有 gitlab-ci 指令不等待“脚本”部分的任何返回? 我知道有“on-success”和“on-failure”,但这些假设我们有一个 stdout 或 stderr retuen。

【问题讨论】:

是否可以将$configfile 输入拆分为与更改 ip 无关的所有内容,然后拆分为更改 ip 的单个小脚本? ip是怎么改的? 【参考方案1】:

如果您知道脚本的大致执行时间(即 10 秒),您可以使用 timeout 实用程序,例如

timeout 10 <your command here>

关于超时的巧妙之处在于,如果达到超时,它会以错误代码 124 退出,因此如果您的脚本不使用此退出代码进行任何操作,您可以进行类似的操作

timeout 10 <your command here> ||  EXITCODE=$?; if [ $EXITCODE != 124 ]; then exit $EXITCODE; fi; 

如果您的脚本以 0 或 124 以外的任何值退出,它将使您的管道失败

测试:

echo sleep 11 > good_night.txt 
timeout 10 ssh some_host 'bash -s' < good_night.txt ||  EXITCODE=$?; echo $EXITCODE; if [ $EXITCODE != 124 ]; then exit $EXITCODE; fi;  
124

检查 How to set ssh timeout? 以获取其他 ssh 超时选项

【讨论】:

出色的@Andrew!非常感谢,超时和 ssh 超时选项都很有用。

以上是关于让 gitlab 作业不等待“脚本”部分的任何返回的主要内容,如果未能解决你的问题,请参考以下文章

如果前一个管道中正在运行相同的作业,如何等待 GitLab 作业?

如何在 gitlab 作业脚本的特定分支中执行 shell 脚本文件?

让lua脚本等待/暂停/睡眠/阻塞几秒钟的最简单方法?

让lua脚本等待/暂停/睡眠/阻塞几秒钟的最简单方法?

GitLab CI 构建仍在等待中

如何在 Python 中运行另一个脚本而不等待它完成? [复制]