Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

馨房 DEV LOG 之部署 #23

Open
yeojongki opened this issue Oct 11, 2019 · 0 comments
Open

馨房 DEV LOG 之部署 #23

yeojongki opened this issue Oct 11, 2019 · 0 comments

Comments

@yeojongki
Copy link
Owner

yeojongki commented Oct 11, 2019

一. 项目背景

目前馨房这个项目完成了一部分功能,代码放在了 GitHub 的私有仓,是一个 monorepo,用了 lerna 管理。现由于一直是在 dev 环境下开发,没有考虑到生产环境,怕拖到后面很麻烦,于是决定把部署这块搞好再继续开发剩下的内容。需要部署的内容如下:

  1. 服务端的NestJS (NodeJS)
  2. 后台管理系统 React + UmiJS
  3. 数据库 MySQL

项目并没有写单测,部署为 Nginx + PM2本次部署大前提:除了自身服务器,不另外花钱😁

二. 方案选择

  1. 加入自动化集成方案,如 Circle CI, Travis CIJenkins
  2. 开发构建后 pushGitHub ,服务器写个监听脚本,利用 Webhook 触发更新
  3. 开发构建不推送 dist (打包) 后的内容,将打包后的内容扔到远程服务器中触发脚本更新

我的考虑:

  • 不想把构建 yarn build 这一过程放在服务器上运行,因为要装一堆 node_modules
  • 不想另外写一个服务去监听 webhook

于是,我开始了第一个构想 Circle CI,因为看到 Vue 也是用它,而且支持私有仓免费。不用 Travis 的原因是我记得私有仓是要收费的,而 Jenkins 占的内存实在太大了,3、400 M,开着感觉有些浪费了。

三. 接入 Circle CI

需要 Circle CI 做的事情

  1. 监听代码提交,触发本次构建
  2. 根据本次提交的代码决定本次构建哪个 package,前端?后端 ?还是两个都需要?
  3. 怎么将构建完成后的内容放到我的服务器上?

开始解决:

  • 第一个问题很容易解决,按 Circle CI 的接入方法,就可以实现了

  • 第二个问题比较复杂,怎么知道本次修改的是那个端的内容呢?于是陷入了沉思,就各种查 Circle CI + lernaCircle CI + monorepo。 后来在 GitHub 上的一个 Go 项目 上找到了答案:可以在 Circle CI 上获取到上次构建成功的 commit ID 和本次提交的 commit ID,然后 git diff 获取到修改的内容,决定本次构建,顿时恍然大悟(其实是自己运用不够深刻,知道 git diff 却不知道可以拿两次提交的 comit ID 做比较,同时也跟着学了一番 Shell 命令 😂)

  • 第三个问题,一开始也不清楚怎么弄,于是又开始查。然后发现了这个

    image

    然后按上面的操作步骤,添加完成 SSH Key 后,配置 config.yml

        steps:
          - add_ssh_keys:
              fingerprints:
                - "21:57:a1:48:6e:b4:92:8c:df:bd:66:1c:6e:8b:15:69"
          - checkout
          # - run: sudo apt install -y rsync
          - run: ssh $SSH_USER@$SSH_HOST -o "StrictHostKeyChecking no"

    接着可以在 CI 上看到

      The authenticity of host 'host (xxx.xxx.xx.x)' can't be established.
    
      RSA key fingerprint is xx:xx:xx:...(省略).
    
      Are you sure you want to continue connecting (yes/no)?

    意思是无法确认host主机的真实性,只知道它的公钥指纹,问你还想继续连接吗?我们需要输入 yes 才可以进行下一步。但是我们在 CI 上是不可以输入的,那怎么办呢?这时后就要考虑公钥登录的方式了。

    具体就不展开了,我最终没有选择这种方式。因为我尝试了 N 次构建后,CI 提示我用量达到了 59%,我才知道这不是永久免费的 😏

四. 目前方案

  • 本地修改完代码后,run build 后执行一段 Node 脚本
  • 利用 Node-SSH 登录远程服务器,并更新相对应的打包的内容
  • 由于我们是知道自己打包了哪个端,也就不存在说不知道本次修改该更新哪个端
  • 同时是在本地构建,不会在远程服务器增加其他依赖

五. 其他补充

  • 推荐学习 SSH 相关基础知识

  • 数据库这方面在阿里云的 centOS 上安装 MySQL8.0 也是坑,推荐安装文章

    • 同时需要注意给用户授予远程访问的权限

      mysql -u root -p
      use mysql
      update user set host ='%' where user ='root' and host='127.0.0.1';
      flush privileges;
    • 同时记得在阿里云开放对应的数据库端口

  • 学到的 shell 命令:

     # 过滤 + 剪切 + 去重
     echo -e 'pkgs/Admin \npkgs/Server \nother' | grep pkgs | cut -d / -f 2 | sort -u
     
     # if else + for 循环
    for project in `cat projects`; do
      if [[ ${project} =~ "common" ]]; then
     	... 省略
      fi
    done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant