使用Fabric+docker部署前端项目

Front End Depoly

部署过程

  • 合并developmaster
  • push代码
  • 远程服务器pull代码
  • npm install(如果需要)
  • npm run test (如果需要)
  • npm run build

利用docker-compose运行node

使用docker来跑node, 则线上不需要有node环境.

  • 将本地目录映射到docker
  • docker中跑npm命令
# docker-compose.yml
version: '3'
services:
  depoly:
    container_name: project-container
    image: node:carbon
    working_dir: /project
    volumes:
      - .:/project

然后编可以通过命令docker-compose run --rm deploy yarn xxx来执行npm命令

利用makefile更好的执行命令

build:
  docker-compose run --rm deploy yarn build

install:
  docker-compose run --rm deploy yarn install --production

dev:
  docker-compose run --rm -p 8080:8080 deploy yarn dev

# 因为当前build目录和build命令冲突, 用以下关键词区分两者
.PHONY: build

Shell脚本, 更好的执行makefile

#!/bin/bash

trap "kill 0" SIGINT

# 如果带了 -i 参数, 则需要安装依赖
if [[ "$1" == "-i" ]]; then
  echo -e "\n\033[41;37m Install dependencies:\033[0m\n "
  make install
  if [[ "$?" == 1 ]]; then
    echo -e "\t\033[31m Error in npm install, pleace check your package.json\n\033[0m"
    exit 1
  fi
fi;

echo -e "\n\n\033[41;37m Build... :\033[0m\n "
make build
if [[ "$?" == 1 ]]; then
  echo -e "\t\033[31m Error in npm run build \n\033[0m"
  exit 1
else
  echo -e "\033[32mBuild Success \033[0m\n"
fi

exit $?

Fabric使用, 更快的完成部署

fabric基本介绍

fabric是一个python库, 可以通过ssh在远程服务器执行命令.

它有两个1.02.0版本, 其中1.0只支持py2, 2.0版本可以支持py2py3, 而且两个版本的api区别很大, 具体请参考官方文档.

以下所使用的是fabric2.0, 附上fabric2.x文档

用途

可以利用它来pull代码, 并执行代码编译

同时, 线上一般只拉master分支, 所以fabric也能帮助我们在本地合并到master分支后pushgit

配置文件

from fabric import Connection
from invoke import task

c = Connection(host='server_name')

# 制定task
# 可以通过fab depoly 调用
@task
def depoly(d):
    c.local('git checkout master') # 切换到master
    c.local('git rebase develop') # 合并develop分支
    c.local('git push origin master') # push到master
    with c.cd('/home/ubuntu/path/your_project'):
        c.run('git pull', pty=True) # 远程拉取代码
        c.run('./depoly.sh') # 远程执行build
    c.local('git checkout develop') # 本地切换回develop

执行fab depoly就可以完成一系列部署

结语

上述过程其实完全可以由各种CI完成

但是对于私有gitlab, 同时又没有部署gitlab-runner或者不想接入第三方的话

fabric是个不错的选择