#git #shell #jenkins #github #jenkins-pipeline
Вопрос:
Я пытаюсь клонировать репо на сервере, используя учетные данные, хранящиеся в Jenkins, и я выполняю определенные операции с этим репо.
pipeline {
options {
skipDefaultCheckout()
timestamps()
}
parameters {
string(name: 'FILENAME', defaultValue: 'tmp', description: 'Enter the file name that needs to be copied')
string(name: 'DB_NAME', defaultValue: 'tmp_db', description: 'Enter the database name that needs to be created')
string(name: 'VERSION', defaultValue: '1', description: 'Enter the DB name version')
choice(name: 'RUN', choices: 'Migrate Data', description: 'Data migration')
}
agent {
node { label 'myserver' }
}
triggers {
pollSCM('H/5 * * * *')
}
stages {
stage('Clean amp; Clone') {
steps {
cleanWs()
git(branch: 'jenkinsfilr-branch',
credentialsId: 'lsdeploy-github',
url: 'https://github.com/xyz')
}
}
stage('Run the shell script On-prem'){
steps {
git(branch: 'progress',
credentialsId: 'lsdeploy-github',
url: 'https://github.com/abc')
}
configFileProvider([configFile(fileId: 'env-on-prem', targetLocation: '.env')]) {
sh '''
bash -x ./ops/database-migration/migrate.sh ${FILENAME} ${DB_NAME} ${VERSION}
'''
}
}
}
}
}
В migrate.sh содержит операции, выполняемые с abc
папкой (клонированной из https://github.com/abc) в то время как migrate.sh находится в xyz
репо (клонирован из https://github.com/xyz). В этом случае, поскольку репо abc клонировано последним, Дженкинс выдает ошибку, из-за которой он не может найти migrate.sh сценарий. Есть ли какой-нибудь способ избежать этой ошибки? Я пытался выступать git clone --branch progress https://github.com/abc
в migrate.sh сценарий, но он запрашивает у меня учетные данные. Я попробовал другой способ, чтобы сохранить учетные данные в Jenkins, а также клонировать репозиторий. Какая-нибудь помощь?
Комментарии:
1. Можете ли вы предоставить учетные данные в переменной среды? Если это так, вы можете использовать эту запись из часто задаваемых вопросов Git .
2. Вы говорите, что ваш конвейер выдает ошибку, в которой говорится, что он не может найти migrate.sh, но затем вы скажете позже, что, когда вы добавляете новую строку в migrate.sh, затем вас попросят предоставить учетные данные. Как вам удается бежать migrate.sh если файл не найден?
3. Я думаю, что вам нужно сделать это
cd
сxyz
каталогом, прежде чем запускать migrate.sh сценарий. Или, в качестве альтернативы, вы моглиcp
бы migrate.sh скрипт в ваш рабочий каталог, а затем запустите его.4. Спасибо @ShaneBishop, это было так просто, и это сработало
Ответ №1:
Благодаря @shane Bishop, вот решение, которое наконец-то сработало
pipeline {
options {
skipDefaultCheckout()
timestamps()
}
parameters {
string(name: 'FILENAME', defaultValue: 'tmp', description: 'Enter the file name that needs to be copied')
string(name: 'DB_NAME', defaultValue: 'tmp_db', description: 'Enter the database name that needs to be created')
string(name: 'VERSION', defaultValue: '1', description: 'Enter the DB name version')
choice(name: 'RUN', choices: 'Migrate Data', description: 'Data migration')
}
agent {
node { label 'myserver' }
}
triggers {
pollSCM('H/5 * * * *')
}
stages {
stage('Clean amp; Clone') {
steps {
cleanWs()
git(branch: 'jenkinsfilr-branch',
credentialsId: 'lsdeploy-github',
url: 'https://github.com/xyz')
}
}
stage('Run the shell script On-prem'){
steps {
sh 'cp ./ops/database-migration/on-prem/migrate.sh ./'
git(branch: 'progress',
credentialsId: 'lsdeploy-github',
url: 'https://github.com/abc')
}
configFileProvider([configFile(fileId: 'env-on-prem', targetLocation: '.env')]) {
sh '''
bash -x migrate.sh ${FILENAME} ${DB_NAME} ${VERSION}
'''
}
}
}
}
}