Docker + gitlab + jenkins持续集成springboot+gradle项目

摘自百度:持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

gitlab是一个基于 git 的仓库管理程序,也是一个方便软件开发的强大完整应用。
gitlab结合jenkins
Docker, 是一个开源的应用容器引擎, 可以轻松的部署各个应用。
GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目安装,十分方便。
Jenkins, 是一个开源的持续集成的服务器,Jenkins开源帮助我们自动构建各类项目。Jenkins强大的插件式,使得Jenkins可以集成很多软件,可能帮助我们持续集成我们的工程项目(可以结合git,svn等构建项目,在服务器上打包)。

Docker简介及其安装,可以参考本人另一篇博客-> Docker入门及centOS7下安装

gitlab官方推荐的内存为2g以上,而且cpu占有高,博主的服务器总共只有2g内存(还是1核的QAQ),需通过增加4G的swap空间来提升性能。

配置高土豪可忽略这步

因为gitlab太占资源,本人云服务为1核2g,gitlab推荐配置为2g以上

第一次启动镜像时cpu和内存使用占太高,导致服务器崩溃,,

这里通过swap把硬盘内存分配给内存(虽然读写慢但总比崩溃好)

#查看系统存储空间
df -h

#查看swap使用情况 单位m
free -m

#在根目录创建充当临时内存空间的swap文件 大小为4g 命名为swapfile
cd #
#sudo fallocate -l 4G /swapfile #这种方案在我这边报fallocate failed: Operation not supported文件系统不支持,可能因为笔者是云服务器 因此采用其他方式创建

#创建空间4g 4096个1m 可自行调整
dd if=/dev/zero of=/swapfile bs=4096 count=1M

#设置文件权限
chmod 600 /swapfile

#将/swapfile指定为交换文件
mkswap /swapfile

#启用
swapon /swapfile

#永久生效,这步如果不设置重启服务器就没了 可能会导致宕机
vi /etc/fstab #在这个文件最后一行添加  /swapfile swap swap sw 0 0

#创建完可以 ls -lh /swapfile 检查文件大小
ls -lh /swapfile

#查看使用情况
swapon -s

#停用
swapoff /swapfile

 #搜索docker镜像
docker search gitlab

#拉取dockerhub上第一个
docker pull gitlab/gitlab-ce
 
#运行镜像 配置低启动后刚开始502 三五分钟后才能正常进入页面。。。(hostname这边填写自己的ip或者域名)
docker run -d \
    --hostname 111.230.47.36 \
    --publish 543:443 --publish 81:80 --publish 222:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce
    
 #其中 --name=gitlab 指定容器名称 -d 后台运行容器并返回容器id -p:指定映射端口号,本文是将ssh的22端口映射为222端口,web访问的80端口映射为81端口 --volume为挂载容器的数据文件到本地(用来指定挂载目录,将config配置目录、data数据目录、logs日志目录挂载到宿主机上、数据持久化防止容器停止后数据丢失)
#查看容器启用情况 health代表健康启动 starting代表还在启动中 如果出现unhealthly 可docker logs xxx查看日志 
首次进入需设置root用户密码
配置gitlab服务器访问信息

上述方式启动容器没有问题并能够成功访问,但在gitlab上创建项目时,生成项目url的访问地址是按容器的hostname生成,即容器id,这边配置一个固定的url访问地址

/etc/gitlab/:配置文件所在的目录

/var/log/gitlab:日志所在目录

/var/opt/gitlab:数据所在目录

# 详细参考 https://blog.csdn.net/michael_base/article/details/77966647
# 配置http协议所使用的访问地址 这边可以进入容器修改 docker exec -it gitlab /bin/bash
# 但因为启动容器的时候已将容器内的配置文件/etc/gitlab挂在到本地/srv/gitlab/config 直接在本地做配置
# 修改gitlab.rb 默认全为注释
# 调整unicorn进程数,减少内存占用 默认为1调为2
unicorn['worker_processes'] = 2
unicorn['worker_timeout'] = 120

# 调整时区为上海
gitlab_rails['time_zone'] = 'Asia/Shanghai'

#配置http协议时使用访问地址 (内网ip) 
external_url 'http://111.230.47.36:81'  

# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '111.230.47.36'
gitlab_rails['gitlab_shell_ssh_port'] = 222

#默认情况下 nginx监听端口为external_url中定义的,或者默认的80/443 docker run时暴露容器80端口
#修改nginx的监听端口
# nginx['listen_port'] = nil #默认
nginx['listen_port'] = 80

#最后重启容器让配置生效docker restart gitlab或者在容器内执行 gitlab-ctl reconfigure 让配置生效 此过程还需几分钟
修改配置
#这边本人删掉容器出现个问题 网络被占用  /usr/bin/docker-current: Error response from daemon: service endpoint with name gitlab already exists.
#解决方案
#强制删除
docker rm -f xxx 
#清理网络占有
docker network disconnect --force bridge gitlab
#查看是否有同名容器占用
docker network inspect gitlab
取消注册功能

由于gitlab一般用于小团队,本人又是用于公网和团队共同使用,取消注册步骤如下

登陆root用户 -> settings -> Sign-in Restrictions -> Sign-up enbaled是否开启注册功能取消

取消注册功能
默认root用户为管理者,可以添加编辑删除用户等权限操作。

两种方式提交到gitlab

1.先在gitlab创建一个空项目(可以Add README.md文件做测试),然后本地拉取后再做提交
1.创建用户linjw 并新建一个项目,public:都能看 private:私有 自己和小组成员可看
2.用idea拉取到本地(如网络需代理的话需给git设置代理,可以用http或者ssh免密)
#查看当前git代理
git config --get --global http.proxy

#设置全局代理
git config --global http.proxy 代理ip:port

#查看当前信息
git config --list

#全局修改当前邮箱密码 idea查看git历史记录的用户名采用这边的配置
git config --global user.name 用户名  (当前项目: git config -- user.name 用户名 )
git config --global user.email 邮箱

3.拉取后修改README.md文件然后提交,会提示输入密码,输入一次后即可提交,在gitlab项目可以看到提交记录
2.本地发布完整项目到gitlab(客户端和gitlab需建立ssh通信)
#mac下创建ssh密钥(已有的话忽略) 想同时存在github和gitlab配置第二个密钥  参考     https://www.w3ctech.com/topic/2040 https://blog.csdn.net/zengshunyao/article/details/50212987 

#查询命令
cat ~/.ssh/id_rsa.pub

#创建密钥
ssh-keygen -t rsa -C "xxx@xxx.com" #账号邮件地址

#验证github 出现用户名success说明成功
ssh -T git@github.com 

#验证gitlab 后面跟自己gitlab服务器地址 如果出现Could not read from remote repository.说明ssh互信没成功
ssh -T git@gitlab #gitlab为别名 默认为HostName

#或者git clone ssh的方式判断是否能够拉取下来
git clone ssh://git@111.230.47.36:222/linjw/ssh.git  
同时配置保留github和gitlab的ssh key
1.在idea新建一个项目(这边我新建springboot项目,都一样撒),建立本地git仓库
2.vcs->import into version control->create git repository,open要提交的文件后,变色git化,这时项目右键可以使用Git,选择add把准备要提交的文件加到索引库。
3.右键git commit directory -> commit and push(取消perform code analysis检查代码选项可以变快) 第一次提交需指定远程仓库地址
pull/commit 可能出现的问题问题及解决方案:
Push failed: Failed with error: fatal: Could not read from remote repository (提交时没有认到git仓库)
#查看当前使用仓库地址
git remote -v 
#删除旧的
git remote remove origin
#添加新的(后面地址填自己的)
git remote add origin http://111.230.47.36:81/linjw/gitlab.git #也可以选择ssh
you are not allowed to push code to protected branches on this project(分支被保护)
#详细参考 https://stackoverflow.com/questions/32246503/how-to-fix-you-are-not-allowed-to-push-code-to-protected-branches-on-this-proje
Push rejected: Push master to origin/master was rejected by remote(拒绝提交到master分支)
一:通过master提交
#默认master分支为protected状态,除了master权限的人员不可push、delete等操作
1.进入gitlab要提交的项目主页 Settings➔Repository➔Protected Branches 
2.第一次提交到master,将状态改为unprotected或者允许提交和合并里选择developer+Masters,然后再做提交。
#仍然报这个错,原因可能是建立仓库的时候,生成了个readme文件,导致不同步,所以无法push,也无法pull  解决方案
#1.先从master分支pull下来 然后再push
git pull origin master --allow-unrelated-histories
#2.在Terminal终端中填写提交命令
git push -u origin master
#强制推送
git push -u origin master -f
#这边不知道为什么刚开始设置为unprotected才可以提交,提交过后再protected又可以。。

二:通过develop提交
设置保护分支的时候 一般模式为:
1.master分支(原始分支) 允许推送和合并 只有master分支可以
2.创建develop分支 设置developer+Masters(开发人员+主持人(master(default))) 允许推送和合并
#gitlab页面 项目➔Repository➔Branches新建develop分支 新建切换为develop分支且developer+Masters
3.idea vcs➔update project显示刚刚创建的分支 并checkout,在develop上提交会变得容易很多

提交命令
配置分支保护
设置unprotect
使用develop提交

Docker安装jenkins

jenkins是一个用Java编写的开源的持续集成工具,可以于GitLab等代码管理工具联动,触发一定条件之后,实现自动进行测试、编译、部署等一系列动作。
#jenkins的特性
1.易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。
2.易于配置-所有配置都是通过其提供的web界面实现。
3.集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。
4.生成JUnit/TestNG测试报告。
5.分布式构建支持Jenkins能够让多台计算机一起构建/测试。
6.文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
7.插件支持:支持扩展插件,您可以开发适合自己团队使用的工具。
 #拉取官方jenkisn镜像 这个镜像里自带jdk
 sudo docker pull jenkins
 
 #初次安装jenkins 文件夹归属必须是1000 参考  https://blog.csdn.net/mmd0308/article/details/77206563?locationNum=6&fps=1 不然会报权限错误
 cd /home
 mkdir jenkins_home
 #更改文件夹归属者
 sudo chown -R 1000:1000 jenkins_home
 #查看
 ls -nd jenkins_home  
 
 #启动镜像 -d后台运行  --privileged=true 添加一些权限 -p端口映射 -v挂载/var/jenkins_home到本地
 docker run -d \
   --name jenkins \
   --privileged=true \
   -p 9090:8080 \
   -p 50000:50000 \
   -v /home/jenkins_home:/var/jenkins_home jenkins
 
 #在挂载的目录查看初始密码
 cat /home/jenkins_home/secrets/initialAdminPassword
 
 #进入 ip:9090页面 输入初始密码 并安装需要的插件 安装的插件会存在挂载目录中

jenkins结合gitlab持续集成

jenins默认用户可以做所有事,为了安全应当设置安全矩阵或者登陆用户可以做任何事
系统管理 -> Configure Global Security ->授权策略-> 登陆用户可以做任何事
1.确保已安装有GitLab 插件 如果没有安装在 系统管理 -> 插件管理里安装
2.系统管理 -> 配置 
安装插件
安装插件

构建步骤

创建一个新任务 -> 构建一个自由风格的软件项目 -> 源码管理选择git -> 添加ssh或token认证 -> 在jenkins容器内创建ssh,添加到gitlab里项目创建人的ssh中

Credentials -> Add Credentials 添加证书存放私钥

进入项目点击立即构建

这边要注意,因为jenkins是Docker安装 所以gitlab与jenkins关联 要用到容器的
# jenkins容器内生成ssh密钥
# 进入jenkins容器 创建密钥
docker exec -it jenkins /bin/bash
# 进入容器后建立.ssh目录,创建密钥文件私钥id_rsa,公钥id_rsa.pub
mkdir ~/.ssh && cd ~/.ssh
ssh-keygen -t rsa
# 一直回车即可获取

#查看jenkins容器内的公钥
cat ~/.ssh/id_rsa.pub
#之后将ssh公钥加在gitlab 在容器内git clone测试是否能拉取下来 如果可以说明ssh互信成功

jenkins配置证书
#从宿主机进入容器
docker exec -it jenkins /bin/bash 

#查看jenkins容器内私钥
cat ~/.ssh/id_rsa 
#在jenkins里配置私钥到证书里
容器内创建ssh
构建项目
添加私钥
添加gitlab项目
构建后

修改要构建项目的配置,将其构建为jar包

参考 https://blog.csdn.net/u011904605/article/details/54604851

1.需确保安装有gradle plugin插件
2.jenkins项目 -> 配置 -> 构建 -> 增加构建步骤 -> Involk gradle script -> 更多 -> use gradle wrapper 
3.之后按下面操作
如果构建的时候出现问题 点击构建任务查看控制台输出
选择gradle构建方式
选择构建后保存文件

成功构建为jar包

自定义命名jar包构建

build.gradle添加以下配置

#archivesBaseName为自定义jar包名 不写的话默认为项目名
archivesBaseName = "gitlab-jenkins_${releaseTime()}"

#jar包版本
version = '1.0-FINAL'

#获取当前时间 
def releaseTime() {
    //return new Date().format("yyyy-MM-dd-hh-mm-ss", TimeZone.getTimeZone("UTC")) //UTC为国际时间
    return new Date().format("yyyy-MM-dd-HH-mm-ss")
}
提交到gitlab 构建项目效果
根据时间和自定义版本命名jar

代码一提交到gitlab就触发jenkins构建项目(我认为大型项目不推荐。。因为构建很花时间,除非很少有提交事件,比如很少改动的master分支)

这边主要利用到gitlab的webhook功能
webhock:webhook是个在特定情况下触发的一种api. 越来越多在web上的操作被描述为事件
gitlab中解释为: web 钩子用于在项目发生相关事件时通知外部服务器。(在这边的项目事件为项目的更改,外部服务器为jenkins)

实现步骤

1.jenkins安装Gitlab Hook Plugin还有Build Authorization Token Root Plugin插件,两个插件安装完成后,项目配置 -> 构建触发器(将多出Build when a change is pushed to GitLab. GitLab webhook URL: xxx选项,勾选并复制这个url),
2.登陆gitlab进入要配置的项目,添加webhock 项目主页 -> Settings -> Integrations -> 添加上面的url并创建webhock,创建成功后test查看是否成功(在jenkins查看是否在构建,test好像默认是测试master分支的?)
gitlab添加webhock,jenkins构建触发器
gitlab上测试webhock
这边我在gitlab测试的时候出现403,view detail报了Error 403 anonymous is missing the Job/Build permission的错
解决方案:
jenkins -> 系统管理 -> Configure Global Security -> 取消防止跨站点请求伪造的勾选
jenkins - 系统管理 -> 系统设置 -> 取消 Enable authentication for '/project' end-point的勾选
之后在idea上提交了代码把develop,jenkins也正常的进行构建develop分支上的项目。

总结

1.有钱真好QAQ,刚开始博主因为配置低饶了点弯路,在这提供了一种解决方案,老实说1核2g的配置运行gitlab挺卡的,
2.由于博主也是一边学习一边写笔记,记录着一些踩过的坑,写得不好的地方见谅
3.微服务,docker是这几年十分火热的技术,也算是个趋势,还是得多学学~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,802评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,109评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,683评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,458评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,452评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,505评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,901评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,550评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,763评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,556评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,629评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,330评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,898评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,897评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,140评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,807评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,339评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,579评论 18 139
  • 前言 前段时间的工作中有接触到接口测试,测试代码以maven工程的形式编写,使用testNG测试框架。工作中,每次...
    Ivanlfli阅读 3,874评论 7 24
  • 写在前面: 这两天把公司的gitlab服务从老版本(7.12.0,源码版本)升级到了最新版(8.14.3,dock...
    mr_franklin阅读 6,522评论 2 9
  • 如果你跟我一样,性格极端,容易迷失自我,那么你很适合看这部片子,并且你会跟我一样的感同身受。但同时我也需要提醒你,...
    50f3072dcf85阅读 665评论 0 1
  • 伫立的铁塔凝眸着斜阳 我在阳台守望着远方。 山那头占据了多少光芒 我才会冷的如此凄凉。 折纸的飞机要飞向何方 想要...
    三月烟霞阅读 307评论 0 2