前端工程化

Centos

Centos 是一个基于 Linux 的开源免费操作系统,常用于服务端的系统。

# 本地拷贝文件到远程服务器:
# output.txt:本地文件
# root:登录远程服务器的账号
# 47.93.242.155:远程服务器的 IP
# /data/:远程服务器的目录
scp output.txt root@47.93.242.155:/data/

# ssh -p 端口 用户名@服务器IP
# 本地链接远程 Centos 服务器
ssh -p  22  root@47.93.242.155

# 检查端口被哪个进程占用
netstat -lnp|grep 88   #88请换为你需要的端口,如:80

# 杀掉编号为1777的进程(请根据实际情况输入)
kill -9 1777

Nginx

Nginx 是一个高性能的 HTTP 和反向代理 web 服务器。

安装

# Centos 下安装 Nginx 服务器
yum install -y nginx

# 启动nginx,访问 http://<您的域名或IP>,若无法访问 nginx -s reload 命令重启 Nginx
nginx

配置静态服务器访问路径

外网用户访问服务器的 Web 服务由 Nginx 提供,Nginx 需要配置静态资源的路径信息才能通过 url 正确访问到服务器上的静态资源。

// 修改默认配置文件:将默认的 `/usr/share/nginx/html;` 修改为: `/data/www`
vi /etc/nginx/nginx.conf

配置 SSL 泛域名证书

创建 /data/cert 目录用来存放证书文件,使用 scp 命令上传文件到远程服务器:scp D:/https/* root@47.93.242.155:/data/cert。Nginx 启动后默认只监听 80 端口,把全局配置文件 /etc/nginx/nginx.conf 开启监听 443。

配置反向代理

客户端对代理服务器是无感知的,用户只请求反向代理服务器,反向代理服务器选择目标服务器,获取数据后再返回给客户端。

反向代理服务器和目标服务器对外而言就是一个服务器,只是暴露的是代理服务器地址,而隐藏了真实服务器的 IP 地址。

; 实际 index.html 的存放地址 /data/www/index.html
; 修改 location 处,访问 http://127.0.0.1:8080/api/index.htmlhttp://127.0.0.1:8080/index.html 是一致的
server {
  listen       80;
  server_name  www.123.com;

  location /api/ {
    proxy_pass http://127.0.0.1:8080/;
  }
}

Node.js

# 查看当前系统自带了哪些nodejs的版本
sudo dnf module list nodejs

# 切换默认安装的版本
sudo dnf module enable nodejs:14

# 安装 Node
sudo dnf install nodejs

nvm 方便的在同一台设备上进行多个node版本之间切换,可能不同项目依赖的 node 版本不一致。

Docker

安装配置

安装 docker 之前,先安装以下两个依赖:

yum install -y yum-utils device-mapper-persistent-data lvm2
# 设置 docker 镜像源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 社区版(ce)企业版(ee)
yum install docker-ce -y
# 使用 systemctl 启动 Docker。systemctl 是 linux 的进程管理服务命令
systemctl start docker
# 设置开机启动
systemctl enable docker

安装 docker-compose

# 安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# d对二进制文件应用可执行权限
sudo chmod +x /usr/local/bin/docker-compose
# 查看版本号
docker-compose -v

CI/CD

一个版本的发布过程,经历以下步骤:

GitLab 监控

当代码合并到生产环境后,GitLab 自动完成打包和部署两个步骤。

代码托管平台提供了 Webhooks 用于监控类似于 Push/Merge 事件。

Pipeline 是CI/CD的最上层组件,它翻译过来是管道,其实你可以将之理解为流水线,每一个符合.gitlab-ci.yml触发规则的 CI/CD 任务都会产生一个 Pipeline

有了流水线,还必须有辛勤的工人进行生产作业,Runner在 Gitlab Pipeline 中就扮演着工人角色,根据我们下达的指令进行作业。在 Gitlab 中,Runner 有很多种,分为Shared Runner, Group Runner, Specific Runner。Shared Runner 可以服务于各个 Project。Group Runner 服务指定的 Group。Specific Runner 只服务于指定的项目。

.gitlab-ci.yml 用于配置 CI/CD 流程与步骤

workflow:
  rules:
    - if: '$CI_COMMIT_REF_NAME == "master"' # 仅限于 master 分支执行
states:
  - build # 构建阶段
  - deploy # 部署阶段
build_prod: # 定义 job:构建
  state: build
  cache:
    key: build_prod
    paths:
      - node_modules/
    script:
      - yarn install
      - yarn build:prod
    artifacts: # 打包后文件存放位置
      paths:
        - dist
deploy_prod: # 定义 job:部署
  state: deploy
  script:
    - scp -r $CI_PROJECT_DIR username@host:/usr/share/nginx/html # 通过scp命令向 linux 服务器上的 nginx 目录下传输文件

Gitlab 通过 Variables 为 CI/CD 提供了更多配置化的能力,方便我们快速取得一些关键信息,用来做流程决策。上述示例中的 $CI_COMMIT_REF_NAME$CI_PROJECT_DIR 就是 Gitlab 的预定义变量。除了预定义变量,我们也可以自行定义一些环境变量,比如服务器 ip,用户名等等,这样就免去了在配置文件中明文列出私密信息的风险;另一方面也方便后期快速调整配置,避免直接修改.gitlab-ci.yml。

自动部署

写脚本 (改用 .ssh/config 文件,可以简化 scp 命令)

#!/bin/bash
git checkout develop
git pull
npm run build:test

# ~/.ssh目录下创建密钥对
ssh-keygen -t rsa
# 把公钥传输到服务器上,使用 ssh 认证,不用每次输密码
scp ~/.ssh/id_rsa.pub username@123.123.123.1:/home/username/.ssh/authorized_keys

# i 参数指定传输时使用的密钥文件, r 参数递归复制整个目录
scp -i ~/.ssh/id_rsa -r ./dist/. username@123.123.123.1:/usr/share/nginx/html/projectname/

修改 package.json

"scripts": {
  "deploy:test": "deploy-test.sh"
}

Jenkins

# 进入名为 docker-jenkins 容器,获取 jenkins 登录密码
docker exec -it docker-jenkins bash
cat /var/jenkins_home/secrets/initialAdminPassword
# 重启 jenkins
http://localhost:8008/restart/

# 生成 ssh key (公钥 Github)
ssh-keygen -t rsa -C chen_natalie@outlook.com
cat ~/.ssh/id_rsa.pub

# 生成私钥 jenkins 凭证