首页 > 解决方案 > 在詹金斯管道期间面临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 作业,我将面临超时错误。

标签: 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 插件来管理配置、凭据...等...


推荐阅读