bounty还有5天到期。回答此问题可获得+50声望奖励。TheTanadu想要引起更多关注这个问题:我试着自己搜索,大部分类似的错误都在本地解决了,我试过了--没有用。看起来好像docker镜像有问题。
在做项目的时候,我在使用Dockerized的方式创建自己的Github操作时遇到了麻烦。在操作运行过程中,我收到错误消息Usage Error: Couldn't find the node_modules state file - running an install might help (findPackageLocation)
。但是我构建它,node_modules
是在容器中创建的。所以它应该在那里。我检查了堆栈上的其他问题,但它们似乎只是本地的,与Github Action无关。
以下是我的Github Actions工作流程的说明:
action.yml(in User/my-action@main
)
name: 'Reusable Action'
description: 'Independent Reusable Action'
inputs:
github-token:
description: 'Github token'
required: true
outputs:
some_output:
description: 'Some output'
runs:
using: 'docker'
image: 'Dockerfile'
这里是Dockerfile(User/my-action@main
)
FROM node:16-alpine
WORKDIR /usr/src/app
ENV PATH=/usr/src/app/node_modules/.bin:$PATH
# Install dependencies
RUN apk add --no-cache git openssh-client python3 make g++
# copy project
COPY . .
# Check yarn, should be 3.5.0 (it shows up as 3.5.0)
RUN cat /usr/src/app/.yarnrc.yml
RUN printf "Project yarn version: "; yarn --version
# Install yarn dependencies
RUN yarn install
# build
RUN yarn build
RUN echo "Successfully built"
CMD [ "yarn", "start" ]
下面是我如何在工作流(User/other-repo
)中调用它
name: My reusable action in other repo
description: It's reusable
inputs:
secret_token:
required: true
description: Secret to use for authentication
runs:
using: composite
steps:
- name: Do this
id: my-id
uses: User/my-action@main
with:
github-token: ${{ inputs.secret_token }}
- name: Overwrite PR body
id: overwrite_pr_body
uses: AsasInnab/pr-body-action@v1
with:
body: ${{ steps.my-id.outputs.some_output }}
GITHUB_TOKEN: ${{ inputs.secret_token }}
当在本地(docker build -t my-test-image .
)运行它时,它会通过。..但是当在GitHub Actions中运行时,它会失败,并出现上面的错误代码。
除了上面提到的,我还做了以下尝试:
- 更新项目到Yarn浆果
- 由于this问题而删除。锁
- 指定的
usr/src/app
工作目录
2条答案
按热度按时间3npbholx1#
经过一些调查,我发现问题出在运行
yarn start
命令的方式上。我最初将它包含在Dockerfile
的CMD
或ENTRYPOINT
指令中。然而,我发现通过将
yarn start
命令移动到一个单独的脚本中,然后从“ENTRYPOINT”指令调用该脚本,容器在Github Action中正确启动。最终外观:
和脚本
/entrypoint.sh
脚本oipij1gg2#
编辑添加;
根据通过更改入口点解决的问题,似乎
node:16-alpine
entrypoint试图运行yarn through node,而不是shell。虽然现在已经可以运行了,但最好记住,您的入口点并不总是
sh
。虽然从设置为脚本的入口点开始是一个很好的模式,但对原始CMD
的类似修复是ENTRYPOINT ["/bin/sh", "-c"]
。原创
docker build
可能“完成”良好(读作:没有错误),但是yarn install
可以静默地失败,i.也就是说,它可能无法正确安装,但退出0 --所以您构建可以“成功”,而不是 * 实际上成功 *。至少,尝试docker run --rm -it my-test-image sh
跳转到完成构建的shell中,并确认它实际上正确构建。我怀疑基础镜像中安装的yarn版本与您的配置目标版本之间存在差异,因此如果安装失败,您可能需要在安装之前更新yarn。
User/other-repo
)来调用它,你可以从包含它的仓库中测试/调用action,uses: ./
会在你的仓库的./
中使用一个action.y[a]ml
。 例如 *。用一个工作流来测试这个动作是一个很好的实践,这个工作流可以是发布这个动作的存储库上的CI工作流。