Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

云计算百科 xtyly 1个月前 (09-27) 6次浏览 已收录 0个评论

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

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

阿里云最新优惠1折抢购,2核4G云服务器仅799元/3年,新老用户同享,立即抢购>>>

gitlab是一个基于 git 的仓库管理程序,也是一个方便软件开发的强大完整应用。
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

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用户密码
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

配置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 让配置生效 此过程还需几分钟 
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

修改配置

#这边本人删掉容器出现个问题 网络被占用  /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是否开启注册功能取消

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

取消注册功能

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

默认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项目可以看到提交记录 
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

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   
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

同时配置保留github和gitlab的ssh key

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

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要提交的项目主页 SettingsRepositoryProtected 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页面 项目RepositoryBranches新建develop分支 新建切换为develop分支且developer+Masters 3.idea vcsupdate project显示刚刚创建的分支 并checkout,在develop上提交会变得容易很多 
 
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

提交命令

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

配置分支保护

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

设置unprotect

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

使用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页面 输入初始密码 并安装需要的插件 安装的插件会存在挂载目录中 
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

jenkins结合gitlab持续集成

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

安装插件

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

安装插件

构建步骤

创建一个新任务 -> 构建一个自由风格的软件项目 -> 源码管理选择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里配置私钥到证书里 
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

容器内创建ssh

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

构建项目

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

添加私钥

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

添加gitlab项目

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

构建后


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

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

1.需确保安装有gradle plugin插件 2.jenkins项目 -> 配置 -> 构建 -> 增加构建步骤 -> Involk gradle script -> 更多 -> use gradle wrapper  3.之后按下面操作 如果构建的时候出现问题 点击构建任务查看控制台输出 
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

选择gradle构建方式

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

选择构建后保存文件

Docker + gitlab + jenkins持续集成springboot+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 构建项目效果
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

根据时间和自定义版本命名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分支的?) 
Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

gitlab添加webhock,jenkins构建触发器

Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云

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是这几年十分火热的技术,也算是个趋势,还是得多学学~


阿里云百科网 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Docker + gitlab + jenkins持续集成springboot+gradle项目-阿里云
喜欢 (0)
[sp91@qq.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址