1. 授权认证
  2. 获取用户个人信息
  3. 项目协同
  4. 代码托管
  5. 持续集成
  6. 制品仓库
  7. 测试管理
  1. 项目协同
  2. 代码仓库
  3. DevOps 实践之旅
  4. 一分钟开始持续集成之旅
  5. 持续部署
  6. 制品库

自动部署到 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/'
}

上一篇自动部署到云存储
最近更新
感谢反馈有用
感谢反馈没用