Дженкинс не меняет каталог с помощью команды sh 'cd directory' - PullRequest
0 голосов
/ 20 сентября 2019

Я использую Mac.У меня есть проекты для ios и android по реагирующим и созданным сценариям fastlane для каждого проекта.Теперь я хочу автоматизировать сборки с Jenkins в конвейере, поэтому у меня есть файл Jenkins.В рабочем пространстве Jenkins мне нужно перейти в папку ios и выполнить скрипт fastlane.

Но проблема в том, что Дженкинс не меняет каталог с помощью команды sh 'cd ios'.Я вижу это, потому что я выполняю команду pwd до и после команды смены каталога.

Я пытался использовать символическую ссылку, запустить команду в моем текущем процессе с помощью команды "точка" (например, sh '. cd ios'),попытался использовать полный путь к папке ios.Но все это не принесло успеха: (

Итак, почему Дженкинс не меняет каталог с помощью команды sh 'cd ios'? Как я могу справиться с этим? Заранее спасибо.

Вот мой сценарий

pipeline {

агент любой

tools {nodejs "Jenkins_NodeJS"}

stage {

stage('Pulling git repo'){
  steps{
    git(
      url: 'url_to_git_repo',
      credentialsId: 'jenkins_private_key2',
      branch: 'new_code'
    )
  }
}

stage('Prepare') {
    steps{
      sh 'npm install -g yarn'
      sh 'yarn install'
    }
}

stage('Building') {
    steps{
      sh 'cd /Users/igor/.jenkins/workspace/MobileAppsPipeline/ios'
      sh 'ls -l'
      sh '/usr/local/bin/fastlane build_and_push'
    }
}

}}

Ответы [ 3 ]

3 голосов
/ 20 сентября 2019

Только для записи, потому что это более наглядно, и вы используете описательные конвейеры;)

Если вы хотите выполнить какую-то работу в определенном каталоге, для этого есть step:

stage('Test') {
  steps {  
    dir('ios') { // or absolute path
      sh '/usr/local/bin/fastlane build_and_push'
    }
  }
}

Следующий пример

pipeline {
    agent any

    stages {
        stage('mkdir') {
            steps {
              sh'mkdir ios && touch ios/HelloWorld.txt'  
            }
        }
        stage('test') {
            steps {
              dir('ios') {
                  sh'ls -la'
              }
            }
        }
    }
}

дает результат

[Pipeline] stage
[Pipeline] { (mkdir)
[Pipeline] sh
+ mkdir ios 6073 touch ios/HelloWorld.txt
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (test)
[Pipeline] dir
Running in /stuff/bob/workspace/test-1/ios
[Pipeline] {
[Pipeline] sh
+ ls -la
total 12
drwxrwxr-x 3 bob bob 4096 Sep 20 13:34 .
drwxrwxr-x 6 bob bob 4096 Sep 20 13:34 ..
drwxrwxr-x 2 bob bob 4096 Sep 20 13:34 HelloWorld.txt
[Pipeline] }
[Pipeline] // dir
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
1 голос
/ 22 сентября 2019

Запустите ваши команды, используя следующий формат, таким образом, любой сценарий оболочки может быть запущен в файле Jenkins.

// Формат оболочки: sh "" "#! / Bin / bash your command" ""

Пример:

    sh """ 
    #!/bin/bash
    cd /Users/igor/.jenkins/workspace/MobileAppsPipeline/ios
    ls -l
    /usr/local/bin/fastlane build_and_push
    """ 
0 голосов
/ 20 сентября 2019

Это из-за того, что все команды Jenkins выполняются в каталоге [Jenkins home] / workspace / [имя вашего конвейера] (надеюсь, вы используете конвейер).

Если вам нужно изменить каталог, тогда ваш скрипт долженбыть как:

node {
    stage("Test") {
        sh script:'''
          #!/bin/bash
          echo "This is start $(pwd)"
          mkdir hello
          cd ./hello
          echo "This is $(pwd)"
        '''
    }
}

И ваш вывод будет:

enter image description here

Вторая команда sh начнется в каталоге рабочего пространства.

...