У меня возникла проблема, когда я пытаюсь выполнить команду CURL на одном из шагов Jenkinsfile, когда он работает за прокси-сервером.
Я работаю над Ubuntu 18 и запускаю контейнер Jenkins следующим образом:
docker run -d
-u root --privileged
-v jenkins_home:/var/jenkins_home
-v /var/run/docker.sock:/var/run/docker.sock
-v "$HOME":/home
-e JENKINS_OPTS="--prefix=/jenkins"
--group-add 997
-p 8080:8080
-p 50000:50000
--name jenkins
jenkinsci/blueocean
А затем у меня есть простой Jenkinsfile
, который клонирует код из репозитория git, создает образ, отправляет его в реестр и, наконец, отправляет сообщение Telegram с помощью curl.
pipeline {
agent any
environment {
dockerImage = ''
}
stages {
stage('Testing') {
steps {
echo 'testing'
}
}
stage('Build image') {
steps {
script{
dockerImage = docker.build("registry.***.com.ar/hellonode")
}
}
}
stage('Push image') {
steps{
script {
docker.withRegistry('https://registry.***.com.ar', 'registryCredentials') {
dockerImage.push("${env.BUILD_NUMBER}")
dockerImage.push("latest")
}
}
}
}
stage('Push Notification') {
steps {
script{
withCredentials([string(credentialsId: 'telegramToken', variable: 'TOKEN'),
string(credentialsId: 'telegramChatId', variable: 'CHAT_ID')]) {
sh '''
curl -s -X \
POST https://api.telegram.org/bot${TOKEN}/sendMessage \
-d chat_id=${CHAT_ID} \
-d parse_mode="HTML" \
-d text="🚀 <b>Jenkins CI:</b> <b>Iniciando build $BUILD_DISPLAY_NAME</b> $JOB_NAME"
'''
}
}
}
}
}
}
И это не удается при выполнении команды curl (я получаю ERROR: script returned exit code 7
).
Но я думаю, что это должно быть связано с Linux или корпоративным прокси, потому что я тестировал то же самое на своей машине с Windows без прокси, и это сработало.
Пожалуйста, дайте мне знать, если мне нужно добавить дополнительную информацию, заранее спасибо.
Там написано завиток: (7) Failed to connect to api.telegram.org port 443: Operation timed out
похоже, что трафик на api.telegram.org
через порт 443
заблокирован. Я не вижу, чтобы proxy
использовалось вашим curl
Если я нахожусь в контейнере с docker exec -it jenkins sh
и скручиваюсь с помощью прокси curl -x XXX.XX.XXX.XXX:8080 -s -X POST "https://api.telegram.org/bot.../sendMessage" -d chat_id="..." -d parse_mode="HTML" -d text="<b>Jenkins CI:</b> <b>Iniciando</b>"
, это работает, но не работает, если я помещаю это в Jenkinsfile
Ваш контейнер и Дженкинс находятся в одной сети?
Спасибо за вашу помощь, как вы предложили, я могу решить эту проблему, работая с прокси в команде curl, которая сначала, возможно, из-за порядка аргументов не работала. Спасибо @harshavmb!
Поскольку Jenkins находится за корпоративным прокси-сервером, вам необходимо передать информацию о прокси-сервере curl для подключения к целевым службам.
На справочной странице завиток сказано, что вы можете передавать информацию о прокси-сервере с аргументом --proxy
или -x
(ярлык).
sh '''
curl -s --proxy <protocol>://<proxy-host>:<proxy-port> -X \
POST https://api.telegram.org/bot${TOKEN}/sendMessage \
-d chat_id=${CHAT_ID} \
-d parse_mode="HTML" \
-d text="🚀 <b>Jenkins CI:</b> <b>Iniciando build $BUILD_DISPLAY_NAME</b> $JOB_NAME"
'''
Это также можно установить с помощью env vars http_proxy
/https_proxy
.
В случае, если прокси ожидает базовую авторизацию, ее можно передать как <protocol>://<proxy-username>:<proxy-password@><proxy-host>:<proxy-port>
Наконец, при отладке curl
важно удалить аргумент -s
, так как он автоматически отключает звук вывода.
Удалите аргумент
-s
из curl и вставьте вывод.