簡體   English   中英

Jenkins Ansible插件找不到可執行文件

[英]Jenkins ansible plugin can't find executable

我正在Amazon EC2上運行Jenkins-Docker容器中的主服務器和單獨盒子上的代理。 我的劇本使用Jenkins Ansible插件執行Ansible腳本。

我必須在代理上安裝新版本的Ansible。 我使用“ 從源代碼運行”說明從git安裝了Ansible,並將其安裝到/home/ec2-user/ansible. 如果我使用ssh代理,並運行which ansible ~/ansible/bin/ansible按預期方式獲得~/ansible/bin/ansible 在“管理Jenkins”>“全局工具配置”頁面上,我在新安裝的“ Ansible可執行文件目錄”中輸入了/home/ec2-user/ansible/bin

但是,當我運行Jenkins管道時,得到以下信息:

Running on docker-agent-1 in /home/ec2-user/jenkins/workspace/planet-healthcare-pipeline
[Pipeline] {
[Pipeline] pwd
[Pipeline] stage
[Pipeline] { (Download source and capture commit ID)
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ which ansible
which: no ansible in (/usr/local/bin:/bin:/usr/bin)

它說它正在docker-agent-1 (這是我的代理的名稱)上運行,如果在此ssh可以看到Ansible。 Jenkins為什么找不到Ansible可執行文件?

更新:將PATH添加為環境變量后,它可以找到Ansible,但是現在其他東西壞了。 這是新的輸出:

Running on docker-agent-1 in /home/ec2-user/jenkins/workspace/planet-healthcare-pipeline
[Pipeline] {
[Pipeline] pwd
[Pipeline] stage
[Pipeline] { (Download source and capture commit ID)
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ which ansible
/home/ec2-user/ansible/bin/ansible
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ ansible --version
ansible 2.2.0 (devel 1975a545bd) last updated 2016/09/20 16:19:06 (GMT +000)
  lib/ansible/modules/core: (detached HEAD 70d4ff8e38) last updated 2016/09/20 16:19:08 (GMT +000)
  lib/ansible/modules/extras: (detached HEAD db7a3f48e1) last updated 2016/09/20 16:19:09 (GMT +000)
  config file = /home/ec2-user/jenkins/workspace/planet-healthcare-pipeline/ansible.cfg
  configured module search path = Default w/o overrides
[Pipeline] git
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url git@bitbucket.org:planetgroup/planethealthcareportal.git # timeout=10
Fetching upstream changes from git@bitbucket.org:planetgroup/planethealthcareportal.git
 > git --version # timeout=10
using GIT_SSH to set credentials Deployment key for Planet Healthcare Portal
 > git fetch --tags --progress git@bitbucket.org:planetgroup/planethealthcareportal.git +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/develop^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/develop^{commit} # timeout=10
Checking out Revision e69608a15c9d433e2a22824c7e607048332a4160 (refs/remotes/origin/develop)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f e69608a15c9d433e2a22824c7e607048332a4160
 > git branch -a -v --no-abbrev # timeout=10
 > git branch -D develop # timeout=10
 > git checkout -b develop e69608a15c9d433e2a22824c7e607048332a4160
 > git rev-list e69608a15c9d433e2a22824c7e607048332a4160 # timeout=10
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ git rev-parse --verify HEAD
[Pipeline] readFile
[Pipeline] echo
Current commit ID: e69608a
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Copy application.yml to environment)
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ sudo cp **** config/application.yml
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Build image)
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ docker build -t planethealthcare/portal_app .
Sending build context to Docker daemon 557.1 kB
Sending build context to Docker daemon 1.114 MB
Sending build context to Docker daemon 1.671 MB
Sending build context to Docker daemon 2.228 MB
Sending build context to Docker daemon 2.785 MB
Sending build context to Docker daemon 3.342 MB
Sending build context to Docker daemon 3.398 MB

Step 1 : FROM ruby:2.3
 ---> 7b66156f376c
Step 2 : MAINTAINER David Ham <dham@uxfactory.com>
 ---> Using cache
 ---> 47f6f577f049
Step 3 : RUN apt-get update && apt-get install -y     build-essential     curl     gstreamer1.0-plugins-base     gstreamer1.0-tools     gstreamer1.0-x     libqt5webkit5-dev     qt5-default     xvfb     && apt-get clean     && rm -rf /var/lib/apt/lists/*     && mkdir -p /app
 ---> Using cache
 ---> 38c1313e574d
Step 4 : WORKDIR /app
 ---> Using cache
 ---> 75a023d99fce
Step 5 : COPY Gemfile Gemfile.lock ./
 ---> Using cache
 ---> c39c81496a6b
Step 6 : ENV QMAKE /usr/bin/qmake
 ---> Using cache
 ---> 3226bf5f4e63
Step 7 : RUN bundle install --retry 20
 ---> Using cache
 ---> 91cb9908d53a
Step 8 : COPY . ./
 ---> 7330a8f5ba7c
Removing intermediate container bd55b7deddaf
Step 9 : EXPOSE 3000
 ---> Running in 76e6418e2b3f
 ---> 81427ffb31f5
Removing intermediate container 76e6418e2b3f
Step 10 : CMD bundle exec rails server
 ---> Running in c2a90c3c59f6
 ---> 15ab02b3ab8d
Removing intermediate container c2a90c3c59f6
Successfully built 15ab02b3ab8d
[Pipeline] dockerFingerprintFrom
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Run test suite)
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=phc_portal_test postgres:9.5
[Pipeline] dockerFingerprintRun
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ docker inspect -f . planethealthcare/portal_app
.
[Pipeline] withDockerContainer
$ docker run -t -d -u 500:500 --link 85511ce90ce11c24818ae63bbbf7ab47745be7d96807d450b4adebd4c3196c5e:postgres -p 3000:3000 -e RAILS_ENV=test -w /home/ec2-user/jenkins/workspace/planet-healthcare-pipeline -v /home/ec2-user/jenkins/workspace/planet-healthcare-pipeline:/home/ec2-user/jenkins/workspace/planet-healthcare-pipeline:rw -v /home/ec2-user/jenkins/workspace/planet-healthcare-pipeline@tmp:/home/ec2-user/jenkins/workspace/planet-healthcare-pipeline@tmp:rw -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** --entrypoint cat planethealthcare/portal_app
[Pipeline] {
[Pipeline] echo
running tests...
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ rails db:migrate
/home/ec2-user/jenkins/workspace/planet-healthcare-pipeline@tmp/durable-32785ba4/script.sh: 2: /home/ec2-user/jenkins/workspace/planet-healthcare-pipeline@tmp/durable-32785ba4/script.sh: rails: not found
[Pipeline] }
$ docker stop 3acf37726ce1061d2e0f6e8d0cec882c707b42e710916636b17aaece4f516f2d
$ docker rm -f 3acf37726ce1061d2e0f6e8d0cec882c707b42e710916636b17aaece4f516f2d
[Pipeline] // withDockerContainer
[Pipeline] sh
[planet-healthcare-pipeline] Running shell script
+ docker stop 85511ce90ce11c24818ae63bbbf7ab47745be7d96807d450b4adebd4c3196c5e
85511ce90ce11c24818ae63bbbf7ab47745be7d96807d450b4adebd4c3196c5e
+ docker rm -f 85511ce90ce11c24818ae63bbbf7ab47745be7d96807d450b4adebd4c3196c5e
85511ce90ce11c24818ae63bbbf7ab47745be7d96807d450b4adebd4c3196c5e
[Pipeline] }
[Pipeline] // stage
[Pipeline] mail
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
ERROR: script returned exit code 127
Finished: FAILURE

這是管道:

node('docker') {
    currentBuild.result = "SUCCESS"

    try{
        def git_commit = ""
        def workspace = pwd()
        def APPLICATION_YML
        def image

        stage("Download source and capture commit ID") {
            sh "which ansible"
            sh "ansible --version"


            // Download source
            git branch: 'develop', credentialsId: 'b96345a1-543c-4ccd-9a86-deca7203625c', url: 'git@bitbucket.org:planetgroup/planethealthcareportal.git'

            // Get the commit ID
            sh 'git rev-parse --verify HEAD > GIT_COMMIT'
            git_commit = readFile('GIT_COMMIT').take(7)
            echo "Current commit ID: ${git_commit}"
        }

        stage("Copy application.yml to environment"){
            // write the application.yml to a file
            withCredentials([[$class: 'FileBinding', credentialsId: '67dbd2e7-008f-4463-89a6-9645060e8ec8', variable: 'APPLICATION_YML']]) {
                sh "sudo cp ${env.APPLICATION_YML} config/application.yml"
            }
        }

        stage("Build image"){
            image = docker.build "planethealthcare/portal_app"
        }

        stage("Run test suite"){
            // start postgres
            def postgres95 = docker.image('postgres:9.5')
            postgres95.withRun("-p 5432:5432 -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=phc_portal_test"){ postgres ->
                image.inside("--link ${postgres.id}:postgres -p 3000:3000 -e RAILS_ENV=test") {
                    echo "running tests..."
                    sh "rails db:migrate"
                    sh "rspec --tag ~pending"
                    sh "cucumber"
                }
            }
        }

        stage("Push to ECR registry"){
            docker.withRegistry('https://0000000000.dkr.ecr.us-east-1.amazonaws.com', 'ecr:dham'){
                image.push "${git_commit}"
                image.push 'latest'
            }
        }

        stage("Deploy app"){
            // run the playbook
            ansiblePlaybook([
              colorized: true,
              credentialsId: 'planet-healthcare',
              installation: 'ansible-2-2-0',
              inventory: 'staging',
              playbook: 'deploy.yml',
              extras: "--extra-vars 'app_build_id=${git_commit}''"
            ])
        }
    }

    catch(err) {
        currentBuild.result = "FAILURE"

        mail body: "project build error: ${err}\n\n\n ${currentBuild.description}" ,
        subject: 'project build failed',
        to: 'me@example.com'

        throw err
    }

}

它的失敗,在“運行測試套件”的階段-它無法找到rails運行rails db:migrate ,即使我知道它在容器中。

為什么在代理上設置PATH會影響Docker容器內發生的腳本?

您在腳本中執行which ansible嗎? 它僅搜索定義的PATH。
看來/home/ec2-user/ansible/bin不在/usr/local/bin:/bin:/usr/bin (從您的輸出中)。
您可以轉到Jenkins中的agent-node設置,並使用$PATH:/home/ec2-user/ansible/bin值添加PATH環境變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM