CI/CD的最终实现:
一、登录gitlab-runner机器
切换runner普通用户
[root@localhost ~]# su - gitlab-runner
二、编写.gitlab-ci.yml文件
随便创建一个目录,叫什么无所谓
[gitlab-runner@localhost ~]$ mkdir git
将gitlab上想要发布的项目克隆到这个目录里
[gitlab-runner@localhost git]$ git clone git@gitlab.xxx.com:xxx/xxx.git
在项目目录里面创建一个.gitlab-ci.yml文件,如下:
[gitlab-runner@localhost ~]$ cat .gitlab-ci.yml
stages:
- test
- deploy
test_job:
stage: test
script: mvn clean package sonar:sonar -Dsonar.host.url=http://sonar.rabbit.com -Dsonar.login=5081ab49551c333d3c03565696bcd22c9ec1b7c5 -Dsonar.java.binaries=target/classes
only:
- master
tags:
- shell
deploy_job:
stage: deploy
script:
- mvn clean package -P dev -Dmaven.test.skip=true -Djacoco.skip=true
- bash -x ~/shell/build.sh "$CI_COMMIT_REF_NAME"
only:
- dev
- test
- master
tags:
另外包括传包,启动等命令都可以在yml文件里面体现(这里规划到一个脚本build.sh中),这样只要dev/test/master某一分支有commit的改变了,gitlab-ci就会自动创建job来自动发布
至此gitlab CI自动代码发布就顺利实现了
build.sh脚本文件内容:
group_name=$(pwd | awk -F '/' '{print $(NF-1)}')
if [ $group_name != "marsooo" ];then
echo $group_name" error"
exit 1
fi
project=$(pwd | awk -F '/' '{print $NF}')
branch=$1
profix=".tar.gz"
list=""
path=""
if [ $project = "rabbit-app" ];then
list=$branch"_web"
profix=".war"
path=""
elif [[ $project = rabbit-[a-z]*-price ]]; then
list=$branch"_store"
project=${project%-*}
path=$project"-service/"
else
list=$branch"_order"
path=$project"-service/"
fi
. ~/shell/server_list.properties
list=$(echo $(eval echo '$'"$list"))
port=$(echo $(eval echo '$'"$1_port"))
OLD_IFS="$IFS"
IFS=","
arr=($list)
IFS="$OLD_IFS"
for i in ${arr[@]}
do
ssh -p$port "root@$i" "bash -x /opt/marsooo/gitlab-ci/build_before.sh $project $profix"
scp -P "$port" $path"target/"*$profix "root@$i:/opt/marsooo/gitlab-ci/$project/"
ssh -p$port "root@$i" "source /etc/profile;bash -x /opt/marsooo/gitlab-ci/build.sh $project"
done