基于GitLab CI、Docker的Node.js持续集成部署方案
理论部分不赘述,一张图说完整个流程,实操以Centos 7和root用户为例
GitLab Runner安装和配置
1、 在部署机器安装CI Runner
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
2、 注册Runner并绑定到CI
gitlab-ci-multi-runner register
# url和token,在Git项目的 /runners页面可获取,step by step填写
配置信息保存在/etc/gitlab-runner/config.toml
3、Git根目录配置 .gitlab-ci.yml
stages:
- deploy
cache:
paths:
- node_modules/ #部分需要重复利用又被gitignore的文件
before_script:
- npm install
- npm run static-prod
- npm run vue
deploy_test:
stage: deploy
only:
- dev
script:
- rsync -azp --delete --exclude=.git current_dir deploy_dir
- docker exec -d nodejs-xxx-test bash -c “pm2 restart xxx”
...other task
Docker安装和配置
1、安装Docker和启动
yum update
curl -fsSL https://get.docker.com/ | sh
systemctl enable docker.service
systemctl start docker
2、用阿里云镜像服务器加速
cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service
sed -i "s|ExecStart=/usr/bin/docker daemon|ExecStart=/usr/bin/docker daemon --registry-mirror=<your accelerate address>|g" /etc/systemd/system/docker.service
systemctl daemon-reload
service docker restart
加速器地址,请到容器Hub服务控制台查看
3、自定义镜像
# 拉取基础镜像
docker pull centos:latest
# 交互模式运行基础镜像
docker run -i -t centos:latest
# 安装Node环境和pm2以及app目录等
$root@xxxx: curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -
$root@xxxx: yum -y install nodejs
$root@xxxx: npm install pm2 -g
$root@xxxx: mkdir /app/nodejs/
$root@xxxx: exit
4、提交自定义镜像
docker commit xxxx(上面$root@部分,容器id) centos/node
5、后台运行镜像
docker run --name="nodejs-xxx-test" --restart=always -d -p 8081:3131 -v deploy_dir:/data/nodejs/ centos/node /usr/bin/bash -c 'cd /data/nodejs/;pm2 start ua.json --env test --no-daemon'
-- restart=always
是让容器随docker开机启动
bash里启动pm2,需要带上--no-daemon
,防止docker后台运行后,pm2退出
6、把gitlab-runner
添加到docker
权限组
usermod -aG docker gitlab-runner
Nginx域名绑定到容器的端口
server {
listen 80;
server_name xxx.xxx.com;
access_log /var/log/nginx/xxx.access.log;
error_log /var/log/nginx/xxx.error.log;
location / {
proxy_pass http://127.0.0.1:8082;
}
}
过程中可能因为内核设置,会出现502,不能反向代理,需要关闭
##如果SELinux status参数为enabled即为开启状态
/usr/sbin/sestatus -v
...
SELinux status: enabled
...
##将SELINUX=enforcing改为SELINUX=disabled
vim /etc/selinux/config
setsebool -P httpd_can_network_connect 1
## 重启机器
reboot