从三月面试开始拉开巨幕,到五月份结束,终于拿到欢聚时代的offer。于是,在离职期间,我开始研究了服务端渲染,从技术选型,搭建框架到实现自动化部署,踩了不少的坑,终于完成了初步框架搭建和自动化部署这两步。
由于自动化部署是最后完成的,所以印象深刻。现在趁热打铁,先把自动化部署的研发的整个过程记录在案,以方便之后自己或者各位看客能够看到我踩过的坑!
本次自动化部署是基于gitlab+docker进行自动化部署的。下面请看我娓娓道来~
众所周知,gitlab自动化部署非常方便,只要在对应服务器注册runner(或者在docker上注册runner也行),然后编写好对应的.gitlab-ci.yml文件,那么就可以实现脚本自动化部署了。下面我们来看看怎么进行gitlab的runner注册,以及如何编写.gitlab-ci.yml文件。
备注:本次使用的环境是阿里云服务器(Ubuntu18.0.4)
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
apt-get install gitlab-runner
注意:如果这里安装不成功的话,可以执行:
sudo apt-get update
升级一下apt-get这个安装命令包。
gitlab-runner register
然后正如官方文档所说,会进入如下图1-1流程:(关于下面的url和token,可以参照图1-2,1-3找到对应的url和token位置,并把它复制填写到注册选项上)
图1-1
图1-2
图1-3
图1-4
所有选项选择好后,稍等片刻,就会注册完毕!
我们看到这里的runner选项上,出现绿点,代表runner注册成功了!
这里有两个坑:
这样,我们gitlab-runner注册已经大功告成了!下面开始配置.gitlab-ci.yml文件
图2-1
图2-2
那么图2-2的script下面的脚本究竟代表什么含义呢?不急,它其实是docker的一些命令,我们下面会继续细说,现在,我们已经准备好了.gitlab-ci.yml和runner文件了,接下来我们就要在宿主机上安装好docker,以便能够让项目在docker容器中运行。
再次提醒下,本次使用的宿主机环境是Ubuntu18.0.4版本的,所以我们直接去到docker官网,找到Ubuntu的docker下载安装教程即可(附:Ubuntu的docker下载安装官网教程:https://docs.docker.com/engine/install/ubuntu/#prerequisites)
图3-1
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt-get update
sudo apt-get install \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
图3-2
如果不清楚什么类型,我们可以输入如下命令获取我们系统的内核类型:(我自己做个另外的记录,与本文无关:lsb_release -a,此命令可以查看当前Ubuntu的版本)
arch
即可看到当前内核版本是x86_64的,所以我们可以直接使用上图3-2的第一个tab的命令,去配置我们的稳定的仓库:(当然你可以配置官方给的测试的仓库,但是可能会不稳定,如下图3-3所示)
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
图3-3
sudo apt-get install docker-ce docker-ce-cli containerd.io
当然,也可以使用下面的命令去安装指定版本的docker:
# 查看当前的docker有什么版本
apt-cache madison docker-ce
# 其中填入版本号即可
sudo apt-get install docker-ce= docker-ce-cli= containerd.io
sudo docker run hello-world
如果执行上面这条命令后,打印出hello world,就代表docker安装成功了!
图4-1
# 表示该docker环境基于node的11版本
FROM node:11
# 表示NODE_ENV的值为production
ENV NODE_ENV production
# 创建目录/usr/app并且进入到/usr/app
WORKDIR /usr/app
# 把项目的package.json和package-lock.json复制到docker容器的/usr/app中
COPY package*.json ./
# 切换npm为cnpm镜像
RUN npm install cnpm -g --registry=https://registry.npm.taobao.org
# 安装项目依赖包
RUN cnpm install
把整个项目copy到/usr/app
COPY . .
# 暴露容器的8080端口
EXPOSE 8080
# 执行命令 node xxx,开启node服务
CMD ["node", "/usr/app/src/server/server.js"]
注意:这里RUN 和CMD命令,前者表示docker build(构建镜像)时执行,后者是docker run(运行镜像生成容器)时执行。
docker build命令是根据Dockerfile构建镜像ssr:${TAG},而docker run命令是根据镜像ssr:${TAG}生成容器实例并运行
注意:如果运行的时候提交代码,运行ci/cd的时候,出现如下问题:(是个坑)
我们可以直接在宿主机中执行如下命令,去释放该文件权限:
sudo chmod a+rw /var/run/docker.sock
然后重新执行提交代码,让他自动化部署即可。
那么,这次自动化部署是否已经完成呢?但是我先记录一部分的实战以及踩过的坑,以方便之后和大家不要继续踩坑了。接下来我还要继续完成并且更新这篇博客的事情是:
好了,暂时先记录在这里,如果各位看官大神经过看到此篇文章有什么改善之处,或者有什么疑虑,不妨可以在评论区留下你们的精贵之言,技术无国界,希望我们能够通过这种方式的交流,积累技术沉淀,提升自己的能力!!!