Angular Build EPERM:不允许操作,复制文件

时间:2021-06-24 17:48:38

标签: angular docker jenkins docker-compose angular-cli

我在 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 --forcenpm cache verify,如上所示,还删除了整个 node_modules 文件夹。

码头工人?我已经使用 jenkins/jenkins:latest 作为基础多次重建了 docker 镜像和容器

我已经阅读并尝试了来自有类似问题的人的大量 StackOverflow、Github 等评论,建议重新启动、重建、检查权限、升级等,但没有运气,同样的问题。

不确定问题出在哪里:Angular、Docker、Jenkins、config、perms、color-of-socks-im-wearing ......感谢任何建议。

0 个答案:

没有答案