我在 Docker 容器中的 Jenkins 中运行 Angular 12 构建,并且在尝试将资产文件复制到 dist
文件夹时看到此错误:
✖ Copying of assets failed.
Unable to copy assets: EPERM: operation not permitted, copyfile '/var/jenkins_home/workspace/MY-Web-App/src/assets/building.svg' -> '/var/jenkins_home/workspace/MY-Web-App/dist/my-web-app/assets/building.svg'
问题是在 2021 年 6 月 15 日我们更新了 Ubuntu docker 主机上的所有操作系统包之后开始的。
首先想到的是 seccomp 是错误的,但我在 docker-compose 中有这个:
jenkins:
build: ./jenkins
image: my-ci-jenkins
hostname: ....
user: root
volumes:
- /data/ci/jenkins/jenkins_home:/var/jenkins_home
- artifactsvolume:/var/jenkins_home/workspace/artifacts/dist/my-web-app
ports:
- '8080:8080'
- '50000:50000'
security_opt:
- seccomp:./jenkins/seccomp.json
depends_on:
- mariadb
- gitea
environment:
- TZ=America/Los_Angeles
- JENKINS_HOME=/var/jenkins_home
restart: always
networks:
my-ci-net:
ipv4_address: ....
除其他外,在 seccomp.json 中:
{
"defaultAction": "SCMP_ACT_ERRNO",
"syscalls": [
...
{
"name": "copyfile",
"action": "SCMP_ACT_ALLOW",
"args": null
}, ...
]
}
那么,也许是权限、NodeJS、npm?不,我目前正在以 root 身份运行该进程,已清除 node_modules
,在 Jenkinsfile
中放入大量日志以查看发生了什么。我正在使用 Jenkins 管道来运行构建 - 这些是结帐、日志记录和构建步骤:
checkout scm
sh 'rm -rf ./node_modules'
sh 'npm install'
sh 'mkdir -p ./dist/my-web-app/assets'
sh 'chmod 766 ./dist/my-web-app/assets'
sh 'ls -al ./dist/my-web-app'
sh 'whoami'
sh 'pwd'
sh 'ls -al'
sh 'node --version'
sh 'npm --version'
sh 'ls -al /var/jenkins_home/workspace/My-Web-App/src/assets'
sh 'ng build --configuration=staging'
导致以下日志:
Building...
[Pipeline] sh
+ mkdir -p ./dist/my-web-app/assets
[Pipeline] sh
+ chmod 766 ./dist/my-web-app/assets
[Pipeline] sh
+ ls -al ./dist/my-web-app
total 5848
.....
drwxrw-rw- 2 root root 4096 Jun 23 17:44 assets
.....
[Pipeline] sh
+ whoami
root
[Pipeline] sh
+ pwd
/var/jenkins_home/workspace/My-Web-App
[Pipeline] sh
+ ls -al
total 720
.....
drwxr-xr-x 3 root root 4096 Jun 23 17:43 dist
-rw-r--r-- 1 root root 95 Feb 28 2020 docker-compose.yml
-rw-r--r-- 1 root root 3522 Jun 23 16:48 Jenkinsfile
.....
[Pipeline] sh
+ node --version
v14.17.1
[Pipeline] sh
+ npm --version
6.14.13
[Pipeline] sh
+ ls -al /var/jenkins_home/workspace/My-Web-App/src/assets
total 2080
drwxr-xr-x 2 root root 4096 Jun 23 18:39 .
drwxr-xr-x 6 root root 4096 Jun 23 18:39 ..
-rw-r--r-- 1 root root 3737 Feb 28 2020 building.svg
.....
[Pipeline] sh
+ ng build --configuration=staging
- Generating browser application bundles (phase: setup)...
Compiling @angular/core : es2015 as esm2015
.....
✔ Browser application bundle generation complete.
- Generating ES5 bundles for differential loading...
✔ Browser application bundle generation complete.
✔ ES5 bundle generation complete.
- Copying assets...
✖ Copying of assets failed.
Unable to copy assets: EPERM: operation not permitted,
copyfile '/var/jenkins_home/workspace/My-Web-App/src/assets/building.svg'
-> '/var/jenkins_home/workspace/My-Web-App/dist/my-web-app/assets/building.svg'
构建成功地在 dist 文件夹中创建了 main-...js
文件等,但只是不复制资产。我可以成功创建一个文件,然后将其复制到 Jenkinsfile sh
中,但不能在 Angular 构建期间复制:
[Pipeline] sh
+ touch ./dist/my-web-app/assets/me.txt
[Pipeline] sh
+ cp ./dist/my-web-app/assets/me.txt ./dist/my-web-app/assets/me-copy.txt
[Pipeline] sh
+ ls -al ./dist/my-web-app/assets
total 8
drwxrw-rw- 2 root root 4096 Jun 24 10:40 .
drwxr-xr-x 3 root root 4096 Jun 23 18:43 ..
-rw-r--r-- 1 root root 0 Jun 24 10:40 me-copy.txt
-rw-r--r-- 1 root root 0 Jun 24 10:40 me.txt
也许是 Angular 版本?我已经用 Angular 9、10、11 和 12 尝试过同样的事情,结果相同,所以看起来不是 Angular 导致了这个问题。 Angular 的人认为这不是 Angular 的问题:https://github.com/angular/angular-cli/issues/21198
angular.config(配置)
"configurations": {
"staging": {
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/environment.staging.ts"
}
],
"optimization": true,
"outputHashing": "all",
"sourceMap": false,
"namedChunks": false,
"extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"budgets": [
{
"type": "initial",
"maximumWarning": "2.7mb",
"maximumError": "15mb"
},
{
"type": "anyComponentStyle",
"maximumWarning": "8kb",
"maximumError": "10kb"
}
]
},
...
节点,NPM?我试过 Node 12 和 14。我试过 npm cache clean --force
、npm cache verify
,如上所示,还删除了整个 node_modules
文件夹。
码头工人?我已经使用 jenkins/jenkins:latest
作为基础多次重建了 docker 镜像和容器
我已经阅读并尝试了来自有类似问题的人的大量 StackOverflow、Github 等评论,建议重新启动、重建、检查权限、升级等,但没有运气,同样的问题。
不确定问题出在哪里:Angular、Docker、Jenkins、config、perms、color-of-socks-im-wearing ......感谢任何建议。