基於GitLab CI、Docker的Node.js持續集成部署方案


理論部分不贅述,一張圖說完整個流程,實操以Centos 7和root用戶為例

ci-docker

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM