我有一个项目的Gitlab-ci配置,我想将.less
内扩展名为src
的文件复制到dist
,并保持其路径。为此,我使用:
find . -name '*.less' -exec rsync -R {} ../dist ';'
我使用以下命令安装了gitlab-runner映像:
docker pull gitlab/gitlab-runner:latest
并运行:
docker run -d --name gitlab_runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
并注册到:
docker run --rm -t -i -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
使用 docker 作为执行程序-也许这很重要-。
这是我的项目的结构:
.
├── .gitignore
├── .gitlab-ci.yml
├── README.md
├── package.json
├── dist
├── src
│ ├── components
│ │ └── MyComponent
│ │ ├── Loader.less
│ │ └── Loader.tsx
│ └── index.tsx
└── tsconfig.json
这是我的package.json:
{
"name": "@me/components",
"version": "0.0.0",
"description": "Components library",
"scripts": {
"build": "tsc -d && cd src && find . -name '*.less' -exec rsync -R {} ../dist ';' && cd ..",
},
"devDependencies": {
"typescript": "^3.6.2",
"react-dom": "^16.9.0"
},
"dependencies": {
"prop-types": "^15.7.2",
"react": "^16.9.0",
}
}
这是我的.gitlab-ci.yml
文件:
image: node:latest
stages:
- install
- build
install:
stage: install
script:
- npm install
artifacts:
paths:
- node_modules/
build:
stage: build
script:
- npm run build
artifacts:
paths:
- dist
如您所见,gitlab运行程序将运行npm run build
,该行具有以下行:
"build": "tsc -d && cd src && find . -name '*.less' -exec rsync -R {} ../dist ';' && cd ..",
问题是我得到以下输出:
$ npm run build
> @me/components@0.0.0 build /builds/me/components
> tsc -d && cd src && find . -name '*.less' -exec rsync -R {} ../dist ';' && cd ..
find: 'rsync': No such file or directory
find: 'rsync': No such file or directory
find: 'rsync': No such file or directory
find: 'rsync': No such file or directory
我想这是因为gitlabRunner docker映像的Linux版本没有rsync
。
如果在使用docker exec -it 9387492637 bash
运行时进入docker容器,我可以尝试运行cd src && find . -name '*.less' -exec rsync -R {} ../dist ';' && cd ..
root@239f8a797:/test# cd src && find . -name '*.less' -exec rsync -R {} ../dist ';' && cd ..
find: 'rsync': No such file or directory
find: 'rsync': No such file or directory
如果我尝试安装rsync
,它将失败:
root@239f8a797:/test# apt-get install rsync
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package rsync
是因为gitlab-runner映像中未安装rsync
吗?是因为执行者?我该如何解决这个问题?
谢谢!
答案 0 :(得分:0)
如果不包含rsync
,我建议在扩展图像中添加rsync
,并使用该图像代替正式图像,否则每次都需要docker exec
。
FROM gitlab/gitlab-runner:latest
RUN apt-get update -y && \
apt-get install rsync -y
或者另一个选择是
docker exec -it 9387492637 bash -c "apt-get update -y && apt-get install rsync -y"
更新: 从@zeehio答案中,我还认为nodejs出了点问题。因此,您可以遵循@zeehio的方法,也可以使用此方法。
FROM node:latest
RUN apt-get update -y && \
apt-get install rsync -y
或者我建议使用alpine based nodejs
图像,比node:latest
轻得多
FROM node:alpine
RUN apk add --no-cache rsync
奖金:
您仅在 80MB
中获得了nodejs,npm和rsync。
node:latest
node:latest
是 907MB ,大约是高山的9倍。
答案 1 :(得分:0)
在我看来,node:latest
图片没有rsync
。您可以在脚本运行之前安装rsync
:
before_script:
- apt-get update -qq && apt-get install -y -qq rsync
或您的.gitlab-ci.yml
完整:
image: node:latest
stages:
- install
- build
install:
stage: install
script:
- npm install
artifacts:
paths:
- node_modules/
build:
stage: build
before_script:
- apt-get update -qq && apt-get install -y -qq rsync
script:
- npm run build
artifacts:
paths:
- dist