[后端] gitlab-ci 实现自动部署项目到服务器上
gitlab有webhook和gitlab-ci实现自动部署,我这边选择了gitlab-ci搭建自动部署(能过通过shell的运行实现更多的运维等操作), 因为是刚开始接触这个自动部署的实现 所以暂时通过 宝塔中的gitlab来实现,后期会再发布一篇关于 oneinstack环境下实现的高版本gitlab实现自动部署的文章,尽情期待!
步骤:
1、因为我是使用宝塔安装的gitlab8.8.5版本 所以安装gitlab这一部分 大家在简书中搜索,有很多.(注意!, gitlab-runner 有对应的版本的,请选择对应版本,否则安装会失败),我这里安装的是 gitlab-runner 1.11.2 centos7.3下部署
2、下载gitlab-ci-multi-runner 1.11.2
$ sudo wget https://gitlab-ci-multi-runner-downloads.s3.amazonaws.com/v1.11.2/binaries/gitlab-ci-multi-runner-linux-amd64
给这个文件权限
$ sudo chmod +x ./gitlab-ci-multi-runner-linux-amd64
3、创建一个centos用户
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
4、注册一个ci (在 gitlab-ci-multi-runner-linux-amd64 文件所在目录下执行如下命令)
sudo ./gitlab-ci-multi-runner-linux-amd64 register
按照如下配置:
配置过程中的选项参数选择 url和token是在要部署的项目中获取,不同项目获取不同的token但url则相同5、安装并作为服务启动
sudo gitlab-ci-multi-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner (加黑部分为指定build文件夹目录存放位置)
sudo gitlab-ci-multi-runner start
6、开放对应项目目录权限给 gitlab-runner用户(我这里是php项目组 所以统一将所有php相关项目放到了php目录,这里修改为你们自己的项目总目录或者单独目录都可以)
sudo chown -hR gitlab-runner:gitlab-runner /www/wwwroot/php
7、接下来就是重点了!
在centos中 进入到gitlab-runner用户 生成ssh 实现免登陆 克隆或者拉取项目代码,命令如下:
$ su gitlab-runner
$ mkdir ~/.ssh
$cd~/.ssh
$ ssh-keygen
# 提示输入一直按回车默认就可以了
$ cat id_rsa.pub 然后将 ssh内容复制下来, 粘贴到 gitlab编辑中的部署密钥,如下图
部署密钥图8、在gitlab 注册一个gitlab-runner用户 然后将该用户 加入到需要自动部署的项目中(加入项目成员中)
9、接下来就是自动部署时 执行的shell脚本的编写了,命令如下
su gitlab-runner
cd ~
mkdir bin
cd bin/
vim deployscript
内容如下图:
简易自动部署shell脚本上图是 代码自动拉取的 shell代码,$1 $2 $3 $4 分别代表:
$1 : php(项目所属群组, 比如说公司有php和java 那么php放在php群组 java则放在java群组 这样的话项目管理就很方便了)
$2: 项目名称,
$3: git分支名称 推荐 develop分支
$4: 当前job名称 这里为 job1
10、给予 deployscript文件执行权限 (4 2 1 中的1 也就是 x)
chmod +x deployscript
11、接下来就是 配置(/home/gitlab-runner/bin)环境变量了,用于不用每次执行 bin下的脚本时 都指定 /home/gitlab-runner/bin 这个目录 也考虑到安全吧(这一块不是很懂哈,萌新在此!) 如下图:
命令如下:
gitlab-runner用户下
su gitlab-runner
cd ~
vim .bash_profile
PATH修改为如下:
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/gitlab-runner/bin (加黑加粗部分为修改内容)
保存退出 执行 source .bash_profile (环境变量即为生效)
root用户下:
vim /etc/profile
在底部修改 PATH为:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/git/bin:/home/gitlab-runner/bin
保存退出 执行 source /etc/profile
环境变量添加## 注意! ##
所有的项目 都是在 php群组 中创建 如果没有php群组 创建一个即可
之后的项目都在php群组下 创建!!!
12、针对于tp或者laravel 拉取代码后 composer install 之后 vendor目录 此时的拥有者为 root 需要修改为 gitlab-runner否者后期想实现自动composer install /update时 会因为没有权限执行不了
chown -R gitlab-runner:gitlab-runner vendor/ (root用户下执行)
13、接下来就是 gitlab-ci.yml文件的编写了,如下:
# Author:xuweitao 2019-05-07 01:22:00
# php项目:GitLab-CI自动执行脚本
#
# https://www.jianshu.com/p/c566265d39de
# /home/gitlab-runner/bin
variables:
G_LARAVEL_INIT: 'true'
stages:
- deploy
- laravel-init
- composer-install
job1:
# 代码自动更新部署 运行shell脚本
stage: deploy
only:
- develop
script:
- deployscript php $CI_PROJECT_NAME $CI_COMMIT_REF_NAME $CI_JOB_NAME1
job2:
# 队列开启 & 项目初始化(vender目录跟 storage以及软连接等的执行和授权,注意: 项目初始化之前 请确保先执行了 composer install操作!!!) 运行shell脚本
stage: laravel-init
only:
- develop
variables:
B_LARAVEL_init: 'false'
B_LARAVEL_QUEUE: 'false'
script:
- laravel-init php $CI_PROJECT_NAME $B_LARAVEL_init $B_LARAVEL_QUEUE $CI_JOB_NAME2
job3:
# composer install 运行shell脚本
stage: composer-install
only:
- develop
variables:
B_COMPOSER_INSTALL: 'false'
script:
- composer-install php $CI_PROJECT_NAME $B_COMPOSER_INSTALL $CI_JOB_NAME3
step13 参数介绍:
php 表示 gitlab 群组名称,也就是所有的php项目 都放在php群组方便管理 我代码也是基于这个群组实现!
$CI_PROJECT_NAME 表示当前项目名称 (需要在对应的项目 变量里面添加)
$CI_COMMIT_REF_NAME 表示当前代码默认推送到git那个分支 默认为develop分支 (需要在对应的项目 变量里面添加)
$CI_JOB_NAME1 、$CI_JOB_NAME2 、$CI_JOB_NAME3 手动添加job1、job2、job3名称 (需要在对应的项目 变量里面添加)
(由于是gitlab 8.8.5 版本太低 不会自动给我们添加 job1~3 等变量 所以需要自己在对应的项目添加一边!)
yml变量参考链接: https://www.jianshu.com/p/b1e098cdb46b
参考链接: https://www.jianshu.com/p/df433633816b
参考链接: https://www.cnblogs.com/whoamme/p/4039998.html
最后再说一句: 新建一个项目的时候, 只需要在 对应的群组(我这里是 php群组) 中创建新的项目操作步骤:
(1)、点击新项目设置 -> runner ->然后按照上面的 第4点 执行
(2)、将gitlab-ci.yml原封不动复制一封放到新项目根目录即可
总结: 过程总会遇到坑的,这时候就得看你解决问题的能力了。先通过报错去尝试修改 实在不行再进行百度/谷歌。 关于shell脚本 我就不全部贴出来了 毕竟该走的坑还是要走一边。 通过这个实例 也了解了shell的一些基础语法和使用 收获还是满大的。