前言
自动部署是指代码合并到某个分支后自动部署到服务器,这能够大幅提高开发效率🚀,也是符合敏捷开发的
通过这篇文章,能够学习到如何把自动部署搭建起来,并且文章末尾附上了踩坑记录,希望能让大伙少走弯路,如果遇到报错可先查看下文踩坑记录中是否有相关解决方法。
概念
首先大概了解下两个概念📜:
gitlab-runner:是 gitlab-ci(持续集成) 的载体,用与执行 .gitlab-ci.yml 并把结果返回到 gitlab 上,gitlab-runner 需要用 token 将项目关联起来,可关联多个或一个项目
.gitlab-ci.yml:放在项目根目录的文件,在 push 后,gitlab 会解析这个文件,并用 gitlab-runner 执行
流程
搭建自动部署的流程其实很简单
- 在服务器安装 gitlab-runner 并关联仓库。
- 实现免密登录到部署项目的服务器,并更新 build 后的文件
说起来其实很简单,但是做起来可能会遇到很多坑,善用搜索引擎一个个排除即可!文章会附上踩坑记录哦
实现
首先随便初始化一个项目,托管到 gitlab 上(托管在自己部署的私有 gitlab 也可以),并且手动部署到服务器上,关于部署的就不多说了咯
我们要实现的是 push 代码到 master 后,自动将新的代码部署到服务器,我们刷新页面就能看到最新结果
如下图,我随便写了页面,并且部署在了自己的服务器上,由于没有域名,直接通过 ip 访问
安装 gitlab-runner
登录 另外 一个服务器,安装 gitlab-runner
- 根据你的服务器系统安装下载对应的安装包,我的是 64 位 centos7 的系统,所以安装第一个
# Linux x86-64
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# Linux x86
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-386
# Linux arm
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-arm
- 给 gitlab-runner 分配权限
sudo chmod +x /usr/local/bin/gitlab-runner
- 创建一个名为 gitlab-runner 的用户,后续配置免密登录时需要在此用户上进行
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
- 安装
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
-
输入 gitlab url,如果你的代码是托管在私有gitlab,那么填上你的私有 gitlab 的地址
-
输入 token
token 分为两种
一种是 Shared Runner ,所有项目都可以使用该 runner
另一种是 Specific Runner 只能给特定的项目使用该 runner 。进入某个项目》找到设置》ci/cd》展开 Runners 查看
- 输入 runner 描述
- 输入 runner 标签
- 输入执行器 shell
如果顺利安装,那么你将会看到如下描述
- 安装 git
gitlab-runner 需要使用到 git, 安装一下
# 安装 git (-y 是所有问题自动选 yes 的意思)
yum -y install git
# 查看git版本,确认是否安装成功
git --version
- 安装 yarn 参考:linuxize.com/post/how-to…
实现免密登录
在安装 gitlab-runner 时,我们创建了一个 gitlab-runner 的用户
- 现在确保我们是在 gitlab-runner 用户下
# 查看当前用户
whoami
# 如果不是在 gitlab-runner 下, 切换一下
su gitlab-runner
- 生成密钥
ssh-keygen
- 查看生成的内容
# ~ 指向用户的 home 目录
cd ~/.ssh
ls -a
- 将公钥到安装到部署项目的服务器
ssh-copy-id root@xx.xx.xxx.xx # 部署项目的服务器的公网IP
-
输入服务器密码
-
完成后会提示尝试登录,登录看是否成功
ssh root@xx.xx.xxx.xx
如果能够登录成功,那么我们服务器部署部分算是成功了。
编写 .gitlab-ci.yml
cache:
paths:
- node_modules # 缓存 node_modules
stages:
- install
- build
- deploy
install:
stage: install
only:
- master # 只对 master 的改动做处理
script:
- echo '安装依赖阶段'
# - yarn config set registry https://registry.npm.taobao.org
# - yarn config set sass-binary-site https://npm.taobao.org/mirrors/node-sass
- yarn
tags:
- test # 安装 gitlab-runner 时加的 tag
build:
stage: build
script:
- echo '构建阶段'
- yarn build
artifacts:
paths:
- dist
tags:
- test
deploy:
stage: deploy
script:
- echo '替换文件阶段'
- cd dist
- pwd
- whoami
- ssh root@xxx.xxx.xx.xxx
# 列出所有文件
- ssh root@xxx.xxx.xx.xxx "ls -a"
# 删项目文件夹下所有内容
- ssh root@xxx.xxx.xx.xxx "rm -rf ./home/myapp/test/*"
# 使用 scp 命令远程拷贝文件
- scp -r -P 22 ./* root@132.232.88.202:/home/myapp/test
tags:
- test
至此自动部署已搭建成功,修改代码,push 查看结果
踩坑记录
- 使用 curl 下载 gitlab-runner 安装包很慢
# 如下载 Linux 64位版
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
解决:在浏览器打开下载地址,下载后重命名为 gitlab-runner 再传到服务器 /usr/local/bin/ 中
- 安装 gitlab-runner 时报错 sudo: 修改/etc/sudoers文件,找到类似下面的一行: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin 将要执行的命令所在的目录添加到后面,即可,如: Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
修改 /etc/sudoers 文件,找到类似下面的一行:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
将要执行的命令所在的目录添加到后面,即可,如:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
- install 阶段报错 git fetch-pack: expected shallow list 升级 git 即可, 参考:sysadmin.cyklodev.com/fatal-git-f…