为什么 Jenkins 除了工作区之外还要挂载临时卷?

2024-04-08

我在用gulp从使用 dockerfile 构建的映像在 docker 容器上运行我的 js 应用程序。 我是詹金斯的高级初学者:)。

docker文件

FROM node:10.11.0-alpine

RUN apk update && apk add --no-cache git curl python py-pip bzip2 alpine-sdk && \
  pip install --upgrade awscli && \
  rm -rf /tmp/* /var/lib/apt/lists/* /var/cache/apk/*

WORKDIR /app

COPY . .

ADD . /usr/src/app/.
RUN chmod -R 777 /usr/src/app

WORKDIR /usr/src/app

jenkinsFile - 我正在使用顺序阶段。第一阶段是初始化,我在其中设置 docker 容器。 docker 映像在内部托管,我将其拉下来并运行 shell 命令。为了简单起见,我在这里仅添加相关阶段。

 pipeline {
        agent none
        options {
            timeout(time: timeoutSeconds, unit: 'SECONDS')
            disableConcurrentBuilds()
        }
 stage('Initialize') {
                agent {
                    docker {
                        image 'js-docker-image'
                        registryUrl 'https://my-artifactory-url'
                        registryCredentialsId artifactoryCredentialsId
                        args '-u root -v /var/run/docker.sock:/var/run/docker.sock'
                        label 'docker'
                    }
                }
                stages {
                    stage('Install Dependencies') {
                        steps {
                            script {
                                def command = '''
                                    npm install
                                    '''
                                sh command
                            }
                        }
                    }
                    stage('Build') {
                        steps {
                            script {
                                def command = '''
                                    ./node_modules/.bin/gulp build_only
                                   '''
                                sh command
                            }
                        }
                    }
...

以下是构建输出中的相关部分。我删除了一些敏感信息。

...
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Initialize)
[Pipeline] node
Running on slave06 in /opt/jenkins/slave06/workspace/ntegrate-playground-573
[Pipeline] {
[Pipeline] checkout
...
$ docker run -t -d -u 133733063:133693953 -u root -v /var/run/docker.sock:/var/run/docker.sock -w /opt/jenkins/slave06/workspace/ntegrate-playground-573 -v /opt/jenkins/slave06/workspace/ntegrate-playground-573:/opt/jenkins/slave06/workspace/ntegrate-playground-573:rw,z -v /opt/jenkins/slave06/workspace/ntegrate-playground-573@tmp:/opt/jenkins/slave06/workspace/ntegrate-playground-573@tmp:rw,z -e ********  docker-internal-registry/js-docker-image:latest cat
...
...
$ docker top f6cddf731de8cd63c37e12462f1041db2f4a14486ad98e00dbb81d210711bc63
+ npm install
npm WARN [email protected] /cdn-cgi/l/email-protection requires a peer of canvas@^2.5.0 but none is installed. You must install peer dependencies yourself.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] /cdn-cgi/l/email-protection (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected] /cdn-cgi/l/email-protection: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

audited 901232 packages in 20.046s
found 16 vulnerabilities (4 low, 1 moderate, 11 high)
  run `npm audit fix` to fix them, or `npm audit` for details
[Pipeline] }
[Pipeline] // script
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] script
[Pipeline] {
[Pipeline] sh
+ ./node_modules/.bin/gulp build_only
/opt/jenkins/slave06/workspace/ntegrate-playground-573@tmp/durable-8c5396a6/script.sh: line 1: ./node_modules/.bin/gulp: not found

问题

  1. 为什么 Jenkins 尝试使用 @tmp 附加新卷?

  2. 耐用-8c5396a6 是什么?


1) 为什么 Jenkins 尝试使用 @tmp 附加新卷?

the @tmp用于放置临时工件,例如 Shell 脚本sh,詹金斯将 创建一个.sh文件,其中包含以下脚本sh,然后执行这个.sh file.

因为这.sh文件不是源代码的一部分,只是阶段运行期间生成的临时文件。

您可以想到以下文件@tmp由 Jenkins 管理,而不是由用户管理。用户无法控制它。它是 Jenkins 管道设计的一部分。

对于源代码,由使用管理的构建/打包工件,它们不会被放置在@tmp,但在工作工作区文件夹中,在您的情况下是/opt/jenkins/slave06/workspace/ntegrate-playground-573,其中没有@tmp.

2)什么是durable-8c5396a6?

詹金斯生成.sh为每个文件sh同名script.sh。 如果有多个sh在你的 Jenkinsfile 中,詹金斯把script.sh放在不同的文件夹中以避免以前的情况sh被下一个覆盖sh

调试您的问题,添加两条命令pwd and ls -l before ./node_modules/.bin/gulp build_only。用它来检查您当前的工作目录以及当前工作目录下的文件和文件夹。

最可能的失败原因是你的工作目录错误,其次是gulp未添加到项目依赖项中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Jenkins 除了工作区之外还要挂载临时卷? 的相关文章

随机推荐