2016-09-20 6 views
0

Я запускаю Jenkins на Amazon EC2 - мастер в контейнере Docker и агент на отдельной коробке. Моя playbook выполняет сценарий Ansible, используя плагин Jenkins Ansible.Jenkins ansible plugin не может найти исполняемый файл

Мне пришлось установить новую версию Ansible на агента. Я установил Ansible из git, используя инструкции Running from Source, и установлен на /home/ec2-user/ansible. Если я передаю ssh агенту и запустил which ansible, я получаю ~/ansible/bin/ansible, как и ожидалось. Я ввел /home/ec2-user/ansible/bin в «Ansible executables directory» для моей новой установки на странице «Управление инструментами Jenkins> Global Tool Configuration».

Когда я запускаю мой трубопровод Дженкинс, однако, я получаю это:

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 там. Почему Дженкинс не может найти исполняемый файл?

UPDATE: После добавления 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 [email protected]:planetgroup/planethealthcareportal.git # timeout=10 
Fetching upstream changes from [email protected]:planetgroup/planethealthcareportal.git 
> git --version # timeout=10 
using GIT_SSH to set credentials Deployment key for Planet Healthcare Portal 
> git fetch --tags --progress [email protected]: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 <[email protected]> 
---> 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/[email protected]:/home/ec2-user/jenkins/workspace/[email protected]: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/[email protected]/durable-32785ba4/script.sh: 2: /home/ec2-user/jenkins/workspace/[email protected]/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: '[email protected]: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: '[email protected]' 

     throw err 
    } 

} 

Это неудачу в стадии «Run тестовый набор» - он не может найти rails запустить rails db:migrate, хотя я знаю, он находится в контейнере.

Почему настройка PATH на агенте влияет на скрипт, который происходит внутри контейнера Docker?

ответ

1

Вы выполняете which ansible в своем скрипте? Он ищет только определенные PATH.
И кажется /home/ec2-user/ansible/bin нет в /usr/local/bin:/bin:/usr/bin (с вашего выхода).
Вы можете перейти к настройкам агента-агента в Jenkins и добавить переменную окружения PATH с значением $PATH:/home/ec2-user/ansible/bin.

+0

Спасибо за ваш ответ! Я сделал то, что вы сказали, и это сработало, но теперь команды в контейнере Docker перерыв. Обновленный ответ выше. –

Смежные вопросы