Запуск команды Curl в Jenkins за корпоративным прокси

У меня возникла проблема, когда я пытаюсь выполнить команду 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 без прокси, и это сработало.

Пожалуйста, дайте мне знать, если мне нужно добавить дополнительную информацию, заранее спасибо.

Удалите аргумент -s из curl и вставьте вывод.

harshavmb 09.04.2022 15:28

Там написано завиток: (7) Failed to connect to api.telegram.org port 443: Operation timed out

juan ocho 09.04.2022 17:32

похоже, что трафик на api.telegram.org через порт 443 заблокирован. Я не вижу, чтобы proxy использовалось вашим curl

harshavmb 09.04.2022 18:41

Если я нахожусь в контейнере с 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

juan ocho 09.04.2022 19:01

Ваш контейнер и Дженкинс находятся в одной сети?

harshavmb 09.04.2022 22:19

Спасибо за вашу помощь, как вы предложили, я могу решить эту проблему, работая с прокси в команде curl, которая сначала, возможно, из-за порядка аргументов не работала. Спасибо @harshavmb!

juan ocho 10.04.2022 14:56
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
6
31
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку 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, так как он автоматически отключает звук вывода.

Другие вопросы по теме