DevOps 自动上线的原理与实战

把一个网站部署到服务器分为几步?答:3步。

  1. 打成压缩包;
  2. SCP 上传到服务器;
  3. SSH 解压;

如果使用持续集成,则可以实现提交代码时自动上线,原理如下图:

DevOps 自动上线的原理与实战_第1张图片
image.png

常见的持续集成有:商业化的 CircleCI、开源的 Jenkins,本文以 Jenkins 云服务—— CODING 为例。

实战

  1. 注册 coding.net,创建一个 Git 仓库,提交代码;
  2. 创建一个私钥放在 CODING,把公钥放在服务器的 .ssh/authorized_keys,实现 SSH 信任,参考文档:《在持续集成中使用凭据》;
  3. 新建构建计划,选择“使用静态配置的 Jenkinsfile”,然后可以使用“图形化编辑器”,也可以使用“文本编辑器”填入下面代码,保存并构建;
DevOps 自动上线的原理与实战_第2张图片
image.png

DevOps 自动上线的原理与实战_第3张图片
image.png
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 '构建中...'
        // 把 markdown 转成 HTML
        sh 'apt-get update && apt-get install -y python3-pip'
        sh 'pip3 install mkdocs'
        sh 'mkdocs build'
        // 打包成压缩包
        sh 'tar -zcf 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.user = 'ubuntu'
          // 需要先创建一对 SSH 密钥,把私钥放在 CODING 凭据管理,把公钥放在服务器的 `.ssh/authorized_keys`,实现免密码登录
          withCredentials([sshUserPrivateKey(credentialsId: "c4af855d-402a-4f38-9c83-f6226ae3441c", keyFileVariable: 'id_rsa')]) {
            remote.identityFile = id_rsa

            // SSH 上传文件到远端服务器
            sshPut remote: remote, from: '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/china-speed"
            sshCommand remote: remote, sudo: true, command: "cp -R /tmp/site/* /var/www/china-speed/"
            sshCommand remote: remote, sudo: true, command: "cp -R /tmp/apache2/ /etc/"
            // 重启 apache2
            sshCommand remote: remote, sudo: true, command: "a2ensite china-speed.org.cn"
            sshCommand remote: remote, sudo: true, command: "a2enmod headers rewrite ssl"
            sshCommand remote: remote, sudo: true, command: "systemctl reload apache2"
          }
        }

        echo '部署完成'
      }
    }
  }
}
  1. 经过一番调试,Jenkins 构建成功了,这时候再把它保存在代码仓库里,把设置修改为“使用代码库中的 Jenkinsfile”,以后推送代码即可自动上线。
DevOps 自动上线的原理与实战_第4张图片
image.png

完整代码:https://china-speed.coding.net/p/china-speed/d/china-speed/git

视频课程:https://cloud.tencent.com/edu/learning/live-1681

你可能感兴趣的:(DevOps 自动上线的原理与实战)