gitlab项目上传和CI/CD
参考: https://www.cnblogs.com/ligao/p/9590892.html
一.创建工程,上传本地项目到gitlab
Repository name: 仓库名称
Description(可选): 仓库描述介绍
Public, Private : 仓库权限(公开共享,私有或指定合作者)
Initialize this repository with a README: 添加一个README.md
gitignore: 不需要进行版本管理的仓库类型,对应生成文件.gitignore
license: 证书类型,对应生成文件LICENSE
1.创建项目![在这里插入图片描述](https://img-blog.csdnimg.cn/20201006144627585.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyMDYyMjIx,size_16,color_FFFFFF,t_70#pic_center)
2.复制项目的url![C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1601798713394.png](https://img-blog.csdnimg.cn/20201006144012125.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyMDYyMjIx,size_16,color_FFFFFF,t_70#pic_center)
3,在windows安装git工具,接下来就到本地操作了,首先右键你的项目,如果你之前安装git成功的话,右键会出现两个新选项,分别为Git Gui Here,Git Bash Here,这里我们选择Git Bash Here,进入如下界面,基础库即为我的项目名
4.接下来输入如下代码(关键步骤),把github上面的仓库克隆到本地
git clone http://localhost:8888/root/chen-coding.git
5.此时把你得项目“基础库”复制到chen-coding的文件夹 ![1601799092842.png](https://img-blog.csdnimg.cn/20201006144150262.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMyMDYyMjIx,size_16,color_FFFFFF,t_70#pic_center)
6.上传项目到gitlab
接下来依次输入以下代码即可完成其他剩余操作:
git init 初始化(如何已经初始化过了,则不用重复操作)
git add . (注:别忘记后面的.,此操作是把chen-coding文件夹下面的文件都添加进来)
git commit -m "提交信息" (注:“提交信息”里面换成你需要,如“first commit”)
git push -u origin master (注:此操作目的是把本地仓库push到github上面,此步骤需要你输入帐号和密码)
如果push代码到gitlab时用户和账号输入错误,则
git config --system --unset credential.helper
二.gitlab的CICD,安装runner
1.添加yum源
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
-
安装runner
yum install gitlab-ci-multi-runner
-
向GitLab-CI注册runner
gitlab-ci-multi-runner register 下图为参考
说明:
- gitlab-ci-multi-runner register:执行注册命令
- Please enter the gitlab-ci coordinator URL:输入 ci 地址
- Please enter the gitlab-ci token for this runner:输入 ci token
- Please enter the gitlab-ci description for this runner:输入 runner 名称
- Please enter the gitlab-ci tags for this runner:设置 tag
- Whether to run untagged builds:这里选择 true ,代码上传后会能够直接执行
- Whether to lock Runner to current project:直接回车,不用输入任何口令
- Please enter the executor:选择 runner 类型,这里我们选择的是 shell
到此,runner就注册完毕了。可以到gitlab上看下,刚刚注册的runner是否存在
4.查看gitlab-runner状态和启动
systemctl status gitlab-runner
systemctl start gitlab-runner
5.gitlab关闭启动查看命令
关闭:gitlab-ctl stop
开启:gitlab-ctl start
查看状态:gitlab-ctl status
6.mvn环境配置要求
mvn环境需要在/usr/local/下,并且记得配置阿里云镜像
7.在shell记得设置shell可读,放开git需要忽略的*.sh的文件
8.gitlab-ci.yml和shell脚本案例参考
①.为旭辉地产案例
gitlab-ci.yml
stages:
- build
- deploy
code_build:
stage: build
tags:
- dev-build
script:
- set
- bash ./ci_script/build-scripts/gobuild.sh
artifacts:
name: "publish"
untracked: false
paths:
- publish/
variables:
GIT_STRATEGY: fetch
only:
- web
pkg_deploy:
stage: deploy
tags:
- dev-deploy
script:
- bash ./ci_script/deploy-scripts/godeploy.sh
dependencies:
- code_build
variables:
GIT_STRATEGY: fetch
#表示手动发布
only:
- web
shell脚本路径ci_script\build-scripts
gobuild.sh
#!/bin/bash
source /etc/profile
echo $CI_PROJECT_PATH_SLUG
echo "分支名称 $CI_BUILD_REF_NAME "
if [[ $env == 'dev' || $env == '' ]]; then
export env='dev'
elif [[ $env == 'uat' ]]; then
export env='uat'
elif [[ $env == 'prod' ]]; then
export env='prod'
else
echo "Please enter env parameter 【dev|uat|prod】"
fi
sc-server.sh
#!/bin/bash
echo $CI_PROJECT_PATH_SLUG
#编译后将包拷贝至新建的publish目录下,gitlab上可以在对应节点下载包。
#mvn clean deploy -Dmaven.test.skip=true || exit 1
mvn clean package -Dmaven.test.skip=true || exit 1 && \
serverjarpath=$(find . -name "salesfee-server*.jar") && \
apijarpath=$(find . -name "salesfee-api*.jar") && \
mkdir -p publish && \
mv $serverjarpath publish/salesfee-server.jar && \
mv $apijarpath publish/salesfee-api.jar && \
echo 'build successful!'
shell脚本路径ci_script\deploy-scripts
godeploy.sh
#!/bin/bash
source /etc/profile
echo $CI_PROJECT_PATH_SLUG
if [[ $env == 'dev' || $env == '' ]]; then
export env='dev'
elif [[ $env == 'uat' ]]; then
export env='uat'
elif [[ $env == 'prod' ]]; then
export env='prod'
else
echo "Please enter env parameter 【dev|uat|prod】"
fi
SCRIPTS_DIR=$(dirname "$0")
sh $SCRIPTS_DIR/sc-server.sh || exit 1
sc-server.sh
#!/bin/bash
#根据环境区分部署的IP数组值。环境区分是传入的env参数及选取的分支决定。
#替换argv值即可。
if [[ $env == 'test' && $CI_BUILD_REF_NAME == 'develop' ]]; then
argv=(10.129.38.176 10.129.38.177)
elif [[ $env == 'prod' ]] && [[ $CI_BUILD_REF_NAME == 'master' || $CI_BUILD_REF_NAME =~ [v|V][0-9]+\.[0-9]+\.[0-9]+$ ]]; then
argv=(生产IP数组)
else
echo 'Please enter environment parameters test or prod !'
exit 1
fi
echo ${argv[@]}
#遍历IP并部署:部署先将gitlab编译的包放到机器的/tmp目录下,然后登陆目标机器将包放到部署目录,并删除/tmp下内容。
#部署server
for i in "${argv[@]}";do
scp -o stricthostkeychecking=no $CI_PROJECT_DIR/publish/salesfee-* cifiadmin@$i:/tmp/ && \
ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no cifiadmin@$i "
source /etc/profile ;
ps aux |grep 'java'|grep 'salesfee-server'|grep -v 'grep' ;
\cp /tmp/salesfee-server.jar /app/salesfee/ ;
/app/salesfee/stop.sh || exit 1 ;
/app/salesfee/start.sh || exit 1 ;
rm -f /tmp/salesfee-server.jar ;
ps aux |grep 'java'|grep 'salesfee-server'| grep -v 'grep' ;
ps aux |grep 'java'|grep 'salesfee-api'|grep -v 'grep' ;
\cp /tmp/salesfee-api.jar /app/salesfeeApi/ ;
/app/salesfeeApi/stop.sh || exit 1 ;
/app/salesfeeApi/start.sh || exit 1 ;
rm -f /tmp/salesfee-api.jar ;
ps aux |grep 'java'|grep 'salesfee-api'| grep -v 'grep' ;
exit 0 ;" || exit 1
echo "operate $i "
sleep 40
done
echo 'deploy successful!'
stop.sh
echo "shutdown..."
pidlist=`ps -aux | grep salesfee-server-0.0.1-SNAPSHOT | grep -v bash |grep -v grep | awk '{print $2}'`
echo "进程号:"
echo $pidlist
kill -9 $pidlist
echo " salesfee-server has shutdown already"
start.sh
#!/bin/bash
echo "startUp..."
nohup java -Xms1024m -Xmx1024m -Dspring.profiles.active=test -jar /app/salesfee/salesfee-server.jar > /app/salesfee/nohup.out 2>&1 &
echo 'starting......'
echo "salesfee-server startUp already "
直接执行脚本 sh start.sh 是没有问题的
但是在另一个服务器上,执行这个服务器上的脚本,就会出现
nohup: 无法运行命令"java": 没有那个文件或目录
解决办法
无法识别java命令,填写全路径就可以
nohup /usr/java/jdk1.8.0_131/bin/java -jar test.jar >> ./nohup.out 2>&1 &
②.网上找的比较好的案例
shell脚本–打包
#!/bin/bash
DEPLOY_PATH="/home/micro-pool/"
APP_NAME="micro-pool"
LOG_NAME="nohup.log"
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Stop Process...'
kill -15 $tpid
fi
sleep 5
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'Kill Process!'
kill -9 $tpid
else
echo 'Stop Success!'
fi
sleep 2
rm -rf ${APP_NAME}.jar
rm -rf ${LOG_NAME}
git clone http://6666%40qq.com:1111@192.168.3.22:8099/bfs/${APP_NAME}.git
cd $APP_NAME
mvn clean package -Dmaven.test.skip=true
cd target
mv ${APP_NAME}.jar ${DEPLOY_PATH}
cd $DEPLOY_PATH
rm -rf ${APP_NAME}
nohup java -jar ${DEPLOY_PATH}${APP_NAME}.jar >${DEPLOY_PATH}${LOG_NAME} &
echo 'starting......'
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
echo 'start success!'
else
echo 'start failed!'
fi
旭辉的redme.txt解释:
确保看懂readme,不懂的可以联系找SCM。
说明:
- 按如下配置,将附件.gitlab-ci.yml原样放到代码根目录,按如下目录结构建目录,在对应目录下编写构建及部署脚本,提交到代码仓库即可调试。
- 调试好后将.gitlab-ci.yml中注释的两行代码的“#”去掉。否则会提交代码自动触发构建。去掉后表示只能通过web端手动出发。
- 在对应测试或生产的应用服务器上跑附件脚本configkey.sh,用作部署时免密登录部署机器。
- 脚本里的CI_PROJECT_PATH_SLUG及CI_BUILD_REF_NAME参数时项目的缺省环境参数名,不要变动,将参数值替换自己项目的参数值即可。
举例:
若项目仓库地址是CI_PROJECT_URL=http://gitlab.cifi.com.cn/ark/backend/service
则CI_PROJECT_PATH_SLUG=ark-backend-service。
项目必须先自建develop分支,脚本里用变量CI_BUILD_REF_NAME可取到值“develop”。
步骤:
1.将附件配置文件.gitlab-ci.yml放到项目的代码根目录下,此文件定义构建及部署的pipelines流程。
2.创建CI目录及编写脚本。
a.)在项目根目录下新建ci_script目录。
b.)在ci_script目录下分别建“build-scripts”与“deploy-scripts”目录。
c.)在“build-scripts”目录下写gobuild.sh作为构建索引脚本。索引脚本只需替换if else的判断参数值及具体调用脚本即可,其他地方不要动。
d.)在“deploy-scripts”目录下写godeploy.sh作为构建索引脚本。索引脚本只需替换if else的判断参数值及具体调用脚本即可,其他地方不要动。
e.)构建脚本替换自己项目的构建命令。
f.)部署脚本替换argv的测试及生产环境的IP信息,及修改ssh登录到应用服务器的执行部署过程即可,如停服务、启动服务等。
注意部署时都必须先将包拷贝到/tmp,然后登录机器将包cp到发布目录,再将/tmp下包删除。
3.按照模板编写脚本比较简单。模板只是建议,可以结合项目实际情况将参数剥离出来加以改造。