jenkins - 在詹金斯管道期间面临SSH连接问题
问题描述
我在 AWS EC2 上有 2 台服务器。我想将我们的节点 JS 应用程序部署到这两个实例中。如果两个实例都可用,我的以下代码工作正常。
节点(标签:'测试'){
def sshConn = 'ssh -i /home/ec2-user/pem/ourpemfile.pem ec2-user@IP for server1'
def sshConn1 = 'ssh -i /home/ec2-user/pem/ourpemfile.pem ec2-user@IP for server2'
stage('Checkout from Github')
{
checkout([
$class: 'GitSCM',
*
*
])
}
stage('Build for Node1')
{
echo "Starting to Build..."
sh "$sshConn pm2 stop application || true"
}
stage('Deploy to Node1')
{
echo "Starting Deployment..."
" }
stage('Build for Node2')
{
echo "Starting to Build..."
sh "$sshConn1 pm2 stop application || true"
}
stage('Deploy to Node2')
{
echo "Starting Deployment..."
}
}
但我的用例是 .
如果其中一台服务器将停止,则构建作业必须成功,并且应用程序应部署在可用实例上。
目前,如果我们停止 server1 并运行 jenkins 作业,我将面临超时错误。
解决方案
您可以通过 aws-cli 命令检查 ec2 实例状态,并根据他们的状态进行部署:
如果您想试一试,您必须使用“CloudBees AWS Credentials”插件在 jenkins 中声明您的 AWS 凭证。
并添加到您的管道中:
withCredentials([[$class: 'AmazonWebServicesCredentialsBinding',
accessKeyVariable: 'aV',
secretKeyVariable: 'sV',
credentialsId: 'id_of_your_credentials',]]) {
sh '''
AWS_ACCESS_KEY_ID=${aV}\
AWS_SECRET_ACCESS_KEY=${sV}\
AWS_DEFAULT_REGION=us-east-1\
aws ec2 describe-instances --instance-id --filters Name=instance-state-name,Values=running --query "Reservations[*].Instances[?Tags[?Key == 'Name' && contains(Value, 'server1')]].[Tags[3].Value,NetworkInterfaces[0].PrivateIpAddress,InstanceId,State.Name]" --output text
'''
}
不管 AWS cli cmd :我不知道您如何管理您的服务器,我假设您使用标签“名称”来标识您的服务器。
另外,我认为您应该考虑最大建议并使用 ssh 插件来管理配置、凭据...等...
推荐阅读
- python - 如何在 python 上为 tkinter 编写菜单,以便用户只能选择一个选项?
- python - 可以在 Django 中为大型非本地文件流式传输 zip?
- c - strcmp 返回 10 即使字符串相同
- ssis - SSISDB 2019 脚本组件为空白
- bash - 在ansible中转义特殊字符
- django - 如果在 Celery 中将 retry_backoff 设置为 True,max_retries 和 retry_backoff_max 是什么意思?
- postgresql - Postgres:带有可选“WHERE”参数的函数
- php - 如何在php中优先考虑rabbitmq消息?
- java - 使用 iText 签名字段(数字签名与电子签名图像) - 阅读
- java - 根据对象中的变量名而不是字符串正则表达式在springboot中屏蔽敏感数据