自动部署代码到服务器

3,323 阅读2分钟
原文链接: github.com

最近在研究自动部署代码到服务器的事,一开始是准备用GitLab Runner来做的,它能实现当推代码到某指定远端分支时触发自动部署,可是前端代码的打包比较占内存,打包会说The build failed because the process exited too early. This probably means the system ran out of memory or someone called kill -9 on the process(测试服务器本身也比较渣就是了),于是放弃。现在是写的脚本来实现的。

先写总结

对于代码放在GitLab而且代码不需要打包,或者服务器比较6能在服务器打包成功,那就用GitLab Runner来实现自动部署吧,毕竟配置好了以后只需要无脑推代码就行了。其它情况就用脚本吧,写好了每次需要部署的时候运行下脚本就行。

GitLab Runner

这块直接去看官方文档照着来就好,有坑的在下面说到了。

1 在服务器上安装好GitLab Runner

值得注意的是sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner这个意思是指GitLab Runner在自动部署时,是以gitlab-runner这个user来干的。

2 在服务器上注册GitLab Runner

image

3 写配置文件,命名为.gitlab-ci.yml放在项目根目录下

我写的一个很简单的如下:

<>codestages:
  - build

js_build:
  stage: build
  before_script: 
    - PATH=/root/.nvm/versions/node/v9.3.0/bin:$PATH
    - export PATH
  script:
    - npm i
    - npm run build
    - cp -R build /www/certui-test/vip # 拷贝build文件夹到你的目标文件夹去
  only:
    - test

需要注意的是,在before_script中需要定义下PATH让它包含node,因为刚才注册时usergitlab-runner,它是没有node环境的,执行npm i会报错。(我试过了,注册userroot也还是没有node,不知道为啥...)

用脚本实现

直接上脚本,有两个,一个build.sh一个deploy.sh,在需要部署时只需要运行build.sh
大致思路是:本地打包 --> 上传文件到服务器 --> 服务器原本的文件进行备份,然后将新的代码移动到目标文件夹。

build.sh

#!/bin/bash

npm run build
./deploy.sh

它的内容很简单,就是先执行打包,打包OK后执行deploy.sh

deploy.sh

#!/usr/bin/expect

set user ubuntu # 服务器的用户名
set ip 1.2.3.4 # 服务器的ip
set password 123456 # ssh的密码
set timeout 1200
set date [timestamp -format {%m-%d-%T}]
set dir certui

spawn scp -r ./build ${user}@${ip}:/tmp/ # scp 上传本地的build文件夹到服务器;上传到/tmp是因为这样不会有权限问题
expect "password"
send "${password}\r"
expect {
  eof {
    puts "上传成功"
  }
  timeout { 
    puts "***上传失败***"
    exit 2 
  }
}

spawn ssh ${user}@${ip} # ssh连上服务器
expect "password"
send "${password}\r"
expect "Last login"

send "sudo su - root \r" # 切换用户为root
send "cd /www \r"
send "mv ${dir} ${dir}.${date} \r" # 备个份
send "mkdir ${dir} \r"
send "mv /tmp/build/ ${dir}/vip \r"

interact

这里是把ssh的密码给直接写在脚本里了,也可以做成执行脚本时手动输入然后脚本去读取的方式。

想了想,这好像是我写的第一份脚本?感受到了脚本的威力了233