如何在Github Actions Docker中运行多个命令

117
什么是在一个“action”中运行多个命令的正确方法?
例如: 我想将一个Python脚本作为“action”运行。在运行此脚本之前,我需要安装“requirements.txt”。
我可以想到几种选项: - 创建一个Dockerfile,在其中使用命令“RUN pip install -r requirements.txt”。 - 使用“python:3”镜像,并在运行“main.workflow”中的参数之前,在“entrypoint.sh”文件中运行“pip install -r requirements.txt”。 - 将“pip install”和“python myscript.py”都用作“args”。
另一个例子: 我想运行存在于我的存储库中的脚本,然后比较2个文件(其输出和已经存在的文件)。
这是一个包含两个命令的过程,而在第一个示例中,“pip install”命令可以被视为一个“构建命令”,而不是一个“测试命令”。
问题是: 我能否为另一个命令创建另一个Docker,它将包含上一个Docker的输出?
我正在寻找有关在“Dockerfile”,“entrypoint”或“args”中放置命令的指南。
1个回答

206

你可以使用管道符 |run 属性上运行多个命令。看看这个例子:

name: My Workflow

on: [push]

jobs:
  runMultipleCommands:
    runs-on: ubuntu-latest
    steps:
     - uses: actions/checkout@v1
     - run: |
        echo "A initial message"
        pip install -r requirements.txt
        echo "Another message or command"
        python myscript.py
        bash some-shell-script-file.sh -xe
     - run: echo "One last message"

在我的测试中,像 ./myscript.sh 这样运行 shell 脚本返回了一个“.”。但是像 bash myscript.sh -xe 这样运行它就像预期的那样工作。

我的工作流文件 | 结果

如果你想在 docker 机器内部运行 这个脚本,你可以在你的 run 子句中运行像这样的命令:

docker exec -it pseudoName /bin/bash -c "cd myproject; pip install -r requirements.txt;"
关于“为另一个命令创建另一个Docker,其中将包含先前Docker的输出”,您可以在dockerfile上使用多阶段构建。例如:

有关“为另一个命令创建另一个Docker,其中将包含先前Docker的输出”,您可以在Dockerfile中使用多阶段构建。一些像这样的内容:

## First stage (named "builder")
## Will run your command (using add git as sample) and store the result on "output" file
FROM alpine:latest as builder
RUN apk add git > ./output.log

## Second stage
## Will copy the "output" file from first stage
FROM alpine:latest
COPY --from=builder ./output.log .
RUN cat output.log
# RUN your checks
CMD []

这样apk add git的结果就被保存到了一个文件中,并且这个文件被复制到第二个阶段,可以对结果运行任何检查。


4
如果遇到奇怪的错误,请检查空格。删除它并使用制表符重新缩进。 - Stan
1
请注意,如果您为相同的“name”标题两次指定“run”,则会出现错误:“工作流无效...已定义'run'”。尽管您的示例未在“steps”下使用“name”键。 - Daniel Stevens
我在这方面遇到了问题,即使使用了 |,它仍然忽略空格。最终,我通过在每行末尾使用分号来解决了这个问题,当操作忽略空格时,这是一个有效的 bash 命令。 - Seth
@Seth 我没有找到任何相关的参考资料..也许你应该在这里创建一个新问题,并附上你的脚本,以便更容易地找到解决方案。如果你愿意,你可以在这里发送给我问题链接。 - Tiago Gouvêa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接