Jenkins - 管道和自由式构建的不同结果(纸箱安装无法安装某些模块)

时间:2018-02-23 03:52:34

标签: perl docker jenkins-pipeline

我有一个Perl项目,包括cpanfile

REPO/
  Jenkinsfile
  PROJECT1/
    cpanfile
    local/
  PROJECT2/
    cpanfile -> ../PROJECT1/cpanfile
    local/   -> ../PROJECT1/local
  ...

我在jenkinsci/blueocean图片的Docker容器中运行Jenkins。

现在我想使用Jenkins构建,测试和部署这个Perl项目。

起初,我尝试使用自由式构建。这是我的构建脚本:

docker run -t --rm \
  -v $WORKSPACE:/usr/src/myapp -w /usr/src/myapp/PROJECT1 \
  localhost:20000/perl-carton:5.26 \
  carton install
  • localhost:20000/perl-carton:5.26是我从perl:5.26构建的Docker镜像。我在这个图像中添加了一些Perl模块,比如Carton和一些依赖项,比如libgd-dev,用于我的项目。
  • 我将工作区安装到/usr/src/myapp并将容器的工作目录设置为工作区下方的PROJECT1,因为cpanfile就在那里。

docker run ...命令在我的主机中运行良好(将$WORKSPACE替换为$PWD)。

此命令也适用于Jenkins容器。

然后,我尝试使用Jenkins Pipeline。我这样做Jenkinsfile

// Jenkinsfile
pipeline {
    agent none
    stages {
        stage('Build') {
            agent {
                docker {
                    image 'localhost:20000/perl-carton:5.26'
//                    args '-v $WORKSPACE:/usr/src/myapp -w /usr/src/myapp/PROJECT1'
                }
            }
            steps {
                sh 'cd PROJECT1 && carton install'
            }
    ...
}
  • 我评论了-v ... -w ...,因为我从输出中发现Jenkins安装了它的工作区并通过强制将工作目录设置为该工作区:docker run ... -w /var/jenkins_home/workspace/JOBNAME --volumes-from DOCKER_CONTAINER_ID ...。所以我的-w ...选项被覆盖了。

我希望这条管道可以做同样的工作。但是当我运行这个管道时,它无法安装一些模块。

[AppStore(pipeline)] Running shell script
+ cd PROJECT1
+ carton install
Installing modules using /var/jenkins_home/workspace/JOBNAME/PROJECT1/cpanfile
! Installing DBD::SQLite failed. See /root/.cpanm/work/1519351987.18/build.log for details. Retry with --force to force install it.
! Installing the dependencies failed: Module 'DBD::SQLite' is not installed
! Bailing out the installation for DBIx-Class-0.082840.
...
Installing modules failed

最后,我尝试修改Jenkinsfile而不是使用agent docker并让它在shell命令中运行docker:

agent any
steps {
    sh 'docker run -t --rm -v $WORKSPACE:/usr/src/myapp -w /usr/src/myapp/PROJECT1 localhost:20000/perl-carton:5.26 carton install'
}

这是我所期待的成功。

我不知道造成这种差异的原因。

1 个答案:

答案 0 :(得分:4)

我找到了答案。

我在Jenkins中命名了管道作业TestProject(pipeline)

作业名称包含括号, 工作区目录的名称也是如此, 和shell命令中的BOOM ......

cc -c  -I/Users/gypark/temp/b(test)/local/..omitted../Install
  -fno-common -DPERL_DARWIN -fno-strict-aliasing -pipe -fstack-protector -O3   
  -DVERSION=\"0.005\" -DXS_VERSION=\"0.005\"  
  "-I/Users/gypark/perl5/perlbrew/perls/perl-5.18/lib/5.18.1/darwin-thread-multi-2level/CORE"   filehandles.c
/bin/sh: -c: line 0: syntax error near unexpected token `(

我创建了一个新的管道项目,名称中没有括号。一切都成功。