🔧一个例子学会使用 gitlab runner 实现自动部署 附踩坑记录

7,367 阅读4分钟

前言

自动部署是指代码合并到某个分支后自动部署到服务器,这能够大幅提高开发效率🚀,也是符合敏捷开发的

通过这篇文章,能够学习到如何把自动部署搭建起来,并且文章末尾附上了踩坑记录,希望能让大伙少走弯路,如果遇到报错可先查看下文踩坑记录中是否有相关解决方法。

概念

首先大概了解下两个概念📜:

gitlab-runner:是 gitlab-ci(持续集成) 的载体,用与执行 .gitlab-ci.yml 并把结果返回到 gitlab 上,gitlab-runner 需要用 token 将项目关联起来,可关联多个或一个项目

.gitlab-ci.yml:放在项目根目录的文件,在 push 后,gitlab 会解析这个文件,并用 gitlab-runner 执行

流程

搭建自动部署的流程其实很简单

  1. 在服务器安装 gitlab-runner 并关联仓库。
  2. 实现免密登录到部署项目的服务器,并更新 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

实现免密登录

在安装 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 查看结果

踩坑记录

  1. 使用 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/ 中

  1. 安装 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
  1. install 阶段报错 git fetch-pack: expected shallow list 升级 git 即可, 参考:sysadmin.cyklodev.com/fatal-git-f…

参考

安装 gitlab-runner Gitlab自动部署博客 安装 yarn 升级 git