自动部署到 Linux 服务器

功能介绍

持续集成可自动部署项目到 Linux 服务器,步骤如下:

  1. 在云计算(比如腾讯云)的网页控制台创建 SSH 密钥对,把私钥录入 CODING 凭据管理,把公钥加载到服务器。也可以使用命令手动创建,把私钥 id_rsa 录入 CODING 凭据管理,把公钥 id_rsa.pub 的内容复制到服务器的 ~/.ssh/authorized_keys,参考文档:《凭据管理》

腾讯云 创建 SSH 密钥对
腾讯云 下载 SSH 私钥
腾讯云 服务器 绑定 SSH 公钥
CODING 凭据管理 录入 SSH 私钥

  1. 在持续集成中使用下述 Jenkinsfile:执行 SSH 进行部署;

Jenkinsfile

pipeline {
  agent any
  stages {
    stage('检出') {
      steps {
        checkout(
          [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
          userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]]
        )
      }
    }
    stage('构建') {
      steps {
        echo '构建中...'
        // Java Spring Boot Gradle Jar
        // sh './gradlew bootJar'

        // Java Spring Boot Gradle War
        // sh './gradlew bootWar'

        // Java Maven
        // sh 'mvn package'
        // sh 'ls target/'

        // PHP
        // sh 'composer install --optimize-autoloader --no-dev'
        // sh 'tar -zcf /tmp/tmp.tar.gz .'

        // 静态资源
        sh 'tar -zcf /tmp/tmp.tar.gz apache2/ site/'
        echo '构建完成.'
      }
    }
    stage('部署') {
      steps {
        echo '部署中...'
        script {
          // 声明服务器信息
          def remote = [:]
          remote.name = 'web-server'
          remote.allowAnyHosts = true
          remote.host = '106.54.86.239'
          remote.port = 22
          remote.user = 'ubuntu'

          // 把「CODING 凭据管理」中的「凭据 ID」填入 credentialsId,而 id_rsa 无需修改
          withCredentials([sshUserPrivateKey(credentialsId: "c4af855d-402a-4f38-9c83-f6226ae3441c", keyFileVariable: 'id_rsa')]) {
            remote.identityFile = id_rsa

            // SSH 上传文件到远端服务器
            sshPut remote: remote, from: '/tmp/tmp.tar.gz', into: '/tmp/'
            // 解压缩
            sshCommand remote: remote, command: "tar -zxf /tmp/tmp.tar.gz -C /tmp/"
            sshCommand remote: remote, sudo: true, command: "mkdir -p /var/www/example-site"
            sshCommand remote: remote, sudo: true, command: "cp -R /tmp/site/* /var/www/example-site/"
            sshCommand remote: remote, sudo: true, command: "cp -R /tmp/apache2/ /etc/"
            // 重启 apache2
            sshCommand remote: remote, sudo: true, command: "a2ensite example.com"
            sshCommand remote: remote, sudo: true, command: "a2enmod headers rewrite ssl"
            sshCommand remote: remote, sudo: true, command: "systemctl reload apache2"
          }
        }

        echo '部署完成'
      }
    }
  }
}

建议服务器关闭密码登录,因为可能会被暴力破解,而只允许 SSH 私钥方式登录,更安全。

如果一定要使用密码登录服务器,则使用下述 Jenkinsfile 代码:

// 把「CODING 凭据管理」中的「凭据 ID」填入 credentialsId,而 username 和 password 无需修改
withCredentials([usernamePassword(credentialsId: "xxx", usernameVariable: 'username', passwordVariable: 'password')]) {
  remote.user = username
  remote.password = password

  sshPut remote: remote, from: '/tmp/tmp.tar.gz', into: '/tmp/'
}
上一篇自动部署到云存储
文档是否对您有用?
感谢反馈有用
感谢反馈没用