Jenkins 不会通过 sh 'cd directory' 命令更改目录
Jenkins doesn't change directory through sh 'cd directory' command
我用mac。我在 react-native 上有 ios 和 android 项目,并为每个项目创建了 fastlane 脚本。现在我想在管道中使用 Jenkins 自动构建,所以我有 Jenkins 文件。在 Jenkins 的 space 工作中,我必须转到 ios
文件夹,然后执行 fastlane 脚本。
但问题是 Jenkins 不会使用命令 sh 'cd ios'
更改目录。我可以看到它,因为我在更改目录命令之前和之后执行了 pwd
命令。
我尝试在当前进程中使用符号 link、运行 命令和 "dot" 命令(如 sh '. cd ios'
),尝试使用完整路径 ios文件夹。但是这一切并没有带来成功:(
那么,为什么 Jenkins 不使用 sh 'cd ios'
命令更改目录?我该如何应对?提前谢谢你。
这是我的脚本
pipeline {
任何代理人
工具{nodejs "Jenkins_NodeJS"}
阶段{
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'
}
}
}
}
这是因为目录 [Jenkins home]/workspace/[your pipeline name] 中的所有 Jenkins 命令 运行(我希望你使用管道)。
如果您需要更改目录,那么您的脚本应如下所示:
node {
stage("Test") {
sh script:'''
#!/bin/bash
echo "This is start $(pwd)"
mkdir hello
cd ./hello
echo "This is $(pwd)"
'''
}
}
你的输出将是:
第二个 sh
命令将在工作区目录中启动。
仅作记录,因为它更具描述性并且您使用的是描述性管道 ;)
如果你想在特定目录中做一些工作,有一个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
运行 您的命令使用以下格式,这就是任何 shell 脚本在 Jenkins 文件中 运行 的方式。
// Shell 格式:
嘘“”“
#!/bin/bash
你的命令
"""
示例:
sh """
#!/bin/bash
cd /Users/igor/.jenkins/workspace/MobileAppsPipeline/ios
ls -l
/usr/local/bin/fastlane build_and_push
"""
我用mac。我在 react-native 上有 ios 和 android 项目,并为每个项目创建了 fastlane 脚本。现在我想在管道中使用 Jenkins 自动构建,所以我有 Jenkins 文件。在 Jenkins 的 space 工作中,我必须转到 ios
文件夹,然后执行 fastlane 脚本。
但问题是 Jenkins 不会使用命令 sh 'cd ios'
更改目录。我可以看到它,因为我在更改目录命令之前和之后执行了 pwd
命令。
我尝试在当前进程中使用符号 link、运行 命令和 "dot" 命令(如 sh '. cd ios'
),尝试使用完整路径 ios文件夹。但是这一切并没有带来成功:(
那么,为什么 Jenkins 不使用 sh 'cd ios'
命令更改目录?我该如何应对?提前谢谢你。
这是我的脚本
pipeline {
任何代理人
工具{nodejs "Jenkins_NodeJS"}
阶段{
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'
}
}
} }
这是因为目录 [Jenkins home]/workspace/[your pipeline name] 中的所有 Jenkins 命令 运行(我希望你使用管道)。
如果您需要更改目录,那么您的脚本应如下所示:
node {
stage("Test") {
sh script:'''
#!/bin/bash
echo "This is start $(pwd)"
mkdir hello
cd ./hello
echo "This is $(pwd)"
'''
}
}
你的输出将是:
第二个 sh
命令将在工作区目录中启动。
仅作记录,因为它更具描述性并且您使用的是描述性管道 ;)
如果你想在特定目录中做一些工作,有一个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
运行 您的命令使用以下格式,这就是任何 shell 脚本在 Jenkins 文件中 运行 的方式。
// Shell 格式: 嘘“”“ #!/bin/bash 你的命令 """
示例:
sh """
#!/bin/bash
cd /Users/igor/.jenkins/workspace/MobileAppsPipeline/ios
ls -l
/usr/local/bin/fastlane build_and_push
"""