最近在研究自动部署代码到服务器的事,一开始是准备用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
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,因为刚才注册时user是gitlab-runner,它是没有node环境的,执行npm i会报错。(我试过了,注册user为root也还是没有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