运行 企业代理背后 Jenkins 中的 curl 命令
Running Curl Command in Jenkins Behind Corporative Proxy
当我尝试在 Jenkinsfile 的一个步骤中执行 CURL 命令时遇到问题,当它在代理后面工作时。
我正在 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 存储库克隆代码,制作图像,将其推送到注册表,最后使用 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 机器上测试了它并且它有效。
如果我需要添加更多信息,请告诉我,在此先感谢。
由于 Jenkins 在企业代理后面,您必须将代理信息传递给 curl 才能连接到目标服务。
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"
'''
这也可以通过环境变量设置 http_proxy
/https_proxy
.
如果代理需要基本身份验证,可以像 <protocol>://<proxy-username>:<proxy-password@><proxy-host>:<proxy-port>
一样传递
最后,在调试 curl
时,删除 -s
参数很重要,因为它会默默地静音输出。
当我尝试在 Jenkinsfile 的一个步骤中执行 CURL 命令时遇到问题,当它在代理后面工作时。
我正在 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 存储库克隆代码,制作图像,将其推送到注册表,最后使用 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 机器上测试了它并且它有效。
如果我需要添加更多信息,请告诉我,在此先感谢。
由于 Jenkins 在企业代理后面,您必须将代理信息传递给 curl 才能连接到目标服务。
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"
'''
这也可以通过环境变量设置 http_proxy
/https_proxy
.
如果代理需要基本身份验证,可以像 <protocol>://<proxy-username>:<proxy-password@><proxy-host>:<proxy-port>
最后,在调试 curl
时,删除 -s
参数很重要,因为它会默默地静音输出。