目前接触持续集成环境,主要是为了方便开发测试环境,提交代码的时候,自动测试、编译、打包、部署到开发/测试环境,省去了很多开发测试环境调试部署的时间。另外也可以直接打成线上使用的war包,直接扔给运维即可。
两台vmware虚拟机,系统为centos 7.5
,ip分布如下:
192.168.0.114 /*gitlab-runner所在机器*/
192.168.0.115 /*gitlab所在机器*/
192.168.0.114
环境: maven-3.5.4
,jdk-1.8
gitlab-runner
192.168.0.115
安装的gitlab版本是:企业版11.2.1-ee 免费使用版本
本机和192.168.0.114配置hosts:
192.168.0.115 gitlab.example.com
后续都通过gitlab.example.com
访问gitlab
192.168.0.115
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
这里如果你可以直接把防火墙关闭,就无需执行firewall相关配置了。
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ee
其中http://gitlab.example.com
就是安装完毕之后,访问gitlab的地址,根据需要设置。
本机打开浏览器访问http://gitlab.example.com
,[注意要配置hosts]
初次打开502错误,而且异常卡慢,有几个可能的原因:
1. 端口被占用,8080端口是否被占用
2. 内存太小
3. 超时时间太短
于是把虚拟机内存调到5G
并且修改配置vim /etc/gitlab/gitlab.rb
:
unicorn['worker_timeout'] = 150
unicorn['worker_processes'] = 2
unicorn['port'] = 8081
调整完之后执行命令:sudo gitlab-ctl reconfigure
重新访问,一切正常,初次会跳转到修改密码页面,用户名默认为root
跟创建github仓库一样,待会写的代码全部提交到gitlab中。在项目页面点击下图中的EnableAuto DevOps:
然后:
会看下如下界面:
这里的token
我们待会要用到
192.168.0.114
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
sudo yum install gitlab-runner
更多安装信息访问:gitlab-runner安装
sudo gitlab-runner register
/*Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )*/
http://gitlab.example.com /*记得这台机器也要配置hosts*/
/*Please enter the gitlab-ci token for this runner*/
Pnm2DEVTzo7__yCkdBwH /*token的获取在上面有提到*/
/*Please enter the gitlab-ci description for this runner*/
test
/*Please enter the gitlab-ci tags for this runner (comma separated):*/
test
/*Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:*/
shell /*这里根据需要选择,我目前选择的是shell*/
/*如果选择docker,才会有下面这一步*/
Please enter the Docker image (eg. ruby:2.1):
xxx:latest
有关docker的安装与使用这里不再赘述
我这里用到的是我自己封装好的一个镜像:lchpersonal/tomcat8-jdk8:v1
这个镜像在docker hub仓库上。此镜像定制了数据卷的映射,把宿主机器的/home/site
映射到容器中的/usr/local/tomcat/webapps/ROOT
,以便tomcat启动的时候加载我们的项目。
本文以一个简单的web项目为例,代码会在下文给出github地址,其实随便一个能跑通的web项目都行。主要是讲解根目录中的.gitlab.yml
文件:
/*定义的一些变量,以便下文使用*/
variables:
siteName: "citest"
imagesName: "lchpersonal/tomcat8-jdk8:v1"
containerName: "gitlabtest_container"
siteLocation: "/home/site"
containerSiteLocation: "/usr/local/tomcat/webapps/ROOT"
host_port: "8082"
container_port: "8080"
#之前的版本,这个cache放到devDeploy最后面也是生效的。此版本用的是11.2.1-ee,却不行
/*此yml分为两个阶段,一个是编译,一个是打包,所以这里是将编译的文件缓存,以便下一个阶段使用,否则会被删除,部署的时候就会提示找不到文件*/
cache:
key: "CI_BUILD_STAGE"
paths:
- target/
/*在所有脚本执行之前执行,就是简单的命令*/
before_script:
# 关闭docker容器,删除容器
- if [ "$(docker ps | grep $containerName)" ]; then
- docker stop $containerName
- docker rm -f $containerName
- fi
# 清理项目目录
- if [ -d "$siteLocation/$siteName" ]; then
- sudo rm -rf $siteLocation/$siteName
- fi
- sudo mkdir -p $siteLocation/$siteName
devBuild:
stage: build
script:
- mvn clean package -DskipTests -U
/*下面两个命令是为了调试而用*/
- pwd
- ls
only:
- master
tags:
- test
devDeploy:
stage: deploy
script:
- pwd
- sudo cp target/$siteName.war $siteLocation/
- unzip -qo $siteLocation/$siteName.war -d $siteLocation/$siteName/
- docker run -d -p $host_port:$container_port --name $containerName -v $siteLocation/$siteName:$containerSiteLocation $imagesName catalina.sh run
# - sudo rm $siteLocation/$siteName.war
only:
- master
tags:
- test
加入此文件之后,将项目推送至gitlab,此时gitlab就会通知在这个项目上注册的gitlab-runner,由gitlab-runner来执行此yml脚本。
在pipleline界面会看到项目编译运行的信息以及结果:
可以看出在Stages确实分为两个阶段运行,√
的表示通过,×
的表示为失败,点击进去能看到具体报错信息:
部署成功会显示:
访问:http://192.168.0.114:8082/ 测试项目是否部署成功
源码地址:https://github.com/lchpersonal/gitlab-ci