0

我有一个 jenkins 管道来检查、构建和部署一个反应项目。

pipeline {
    agent {
        docker {
            image 'node:6-alpine'
            args '-v /home/nginx/console:/home/'
            args '-p 3000:3000' 
        }
    }
        environment {
        CI = 'true' 
    }

    stages {
        stage('Install') { 
            steps {
                sh 'touch /tmp/azeiodfsihqznlkdsqjfn'
                sh 'npm install' 
            }
        }
        stage('Test') { 
            steps {
                sh 'npm test' 
            }
        }

        stage('Build') { 
            steps {
                sh 'npm run build' 
            }
        }



        stage('Deploy') {

            steps {
                sh 'ls'
                sh '$(pwd)'
            }
        }

    }
}

我想将/home容器的文件夹与/home/nginx/console主机上的目录一起挂载。构建后,在容器内,我会将dist/*内容移动到 /home 以便将其放入/home/nginx/console

但似乎没有安装该卷。当我在 /home 中创建文件时,我的主机中没有任何内容。

编辑:在我的控制台日志中,我有:

Checking out Revision 3471c656f032692288de13f357c4b8ba54b16ca4 (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 3471c656f032692288de13f357c4b8ba54b16ca4
Commit message: "Update Jenkinsfile"
 > git rev-list --no-walk c5930fc469fd066720df45cdf466788957cdb0bc # timeout=10
[Pipeline] }
[Pipeline] // stage
[Pipeline] withEnv
[Pipeline] {
[Pipeline] sh
+ docker inspect -f . node:6-alpine
.
[Pipeline] withDockerContainer
Jenkins seems to be running inside container 1ce58d845edf831599312c3d016c418a720891ea17c7bacd8327c48f9c44e9f6
$ docker run -t -d -u 0:0 -p 3000:3000 -w /var/jenkins_home/workspace/gara-developer-console --volumes-from 1ce58d845edf831599312c3d016c418a720891ea17c7bacd8327c48f9c44e9f6 -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** node:6-alpine cat
$ docker top 2fe2bdef3f475373cf85dfd452b6bbda21bc02dc308458ffff061b0ae9e963ec -eo pid,comm
[Pipeline] {
[Pipeline] withEnv
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Install)
[Pipeline] sh
+ touch /home/azeiodfsihqznlkdsqjfn
[Pipeline] sh
+ npm install

请问,你知道我该如何纠正吗?

4

3 回答 3

0

正如@Matt 在评论中所说,解决方案是只有一个命令

你的第二个参数覆盖第一个。将它们与 args 结合起来

'-v /home/nginx/console:/home/ -p 3000:3000'
于 2019-08-02T00:34:28.987 回答
0

您不需要在这里做任何事情(特别是您应该能够删除该args '-v ...'行)。Jenkins 会自行将工作区目录挂载到与主机相同的路径上的 Docker 容器中。

到您Deploy上台时,构建的内容已在 Jenkins 工作区目录中,无论是在您的主机上还是在容器内。如果您在生产系统上运行 Jenkins(考虑移动它!)并且“部署”操作实际上只是复制到不同的主机目录,您可以agent为该步骤声明一个替代。我会尝试使管道看起来像

stage('Deploy') {
  agent { any }
  steps {
    ...
  }
}

(实际上我可能会颠倒这个并只运行 Docker 中的npm步骤,默认不在 Docker 中运行。)

于 2019-08-01T13:13:35.920 回答
0

我认为您需要从/home/mount 的路径中删除尾部斜杠,因为目前我希望您的 mount-v /home/nginx/console:/home/能够创建 mount /home/console

因此,要么将文件写入/home/console容器内部,要么将 mount 语句更新为:

args '-v /home/nginx/console:/home'

于 2019-08-01T12:47:43.250 回答