介绍GitLab和安装git
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。
docker镜像官网
https://registry.hub.docker.com/r/gitlab/gitlab-ce
docker 中文版地址(会比官网版本稍微低)
https://registry.hub.docker.com/r/beginor/gitlab-ce
在安装gitLab前 最好先安装git
yum install -y git
如果不确定 自己电脑安装了git可以通过 查看
git version
创建git账户
git config --global user.name "huanmin"
git config --global user.email "3426154361@qq.com"
创建ssh密钥 秘钥位置默认保存在当前位置下 的 .ssh文件里 生成一个私钥 id_rsa和一个公钥id_rsa.pub
ssh-keygen -t rsa -C "3426154361@qq.com"
创建秘钥一直回车就行
查询公秘钥
cat /root/.ssh/id_rsa.pub
查询私秘钥
cat /root/.ssh/id_rsa
初始化Git仓库
有了秘钥就能进行远程git服务了
1.安装gitLab镜像
docker pull beginor/gitlab-ce
2.创建挂载目录
mkdir -p /usr/local/gitlab/etc
mkdir -p /usr/local/gitlab/log
mkdir -p /usr/local/gitlab/data
3.修改目录权限
chmod 777 /usr/local/gitlab/etc
chmod 777 /usr/local/gitlab/log
chmod 777 /usr/local/gitlab/data
4.容器创建
先检测本地正在使用的端口 8443 8888 8222 有没有重复的
netstat -tnl
查询占用端口的进程
netstat -nap | grep 端口
杀死对应进程
kill -9 id
然后在创建
docker run --detach --publish 8443:443 --publish 8881:8881 --publish 8222:22 --name gitlab --restart unless-stopped \
--volume /usr/local/gitlab/etc:/etc/gitlab \
--volume /usr/local/gitlab/log:/var/log/gitlab \
--volume /usr/local/gitlab/data:/var/opt/gitlab \
--hostname 192.168.66.71 \
--privileged=true \
beginor/gitlab-ce
–publish 8443:443:将http:443映射到外部端口8443
–publish 8881:8881:将web:8881映射到外部端口8881 gitlab默认是80 等会我们修改成8881(自定义)
–publish 8222:22:将ssh:22映射到外部端口8222
–name gitlab 运行容器名
–restart unless-stopped 重启策略
–volume /usr/local/gitlab/etc:/etc/gitlab 挂载目录
–volume /usr/local/gitlab/log:/var/log/gitlab 挂载目录
–volume /usr/local/gitlab/data:/var/opt/gitlab 挂载目录–hostname xxx.xxx.xxx.xxx # 填自己的ip地址, 如果是公网主机可以写域名/公网ip
–privileged=true 使得容器内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限
如果你没有吧防火墙关闭的话 需要你开放 8443 8881 8222 这些端口 (百度上一大堆)
修改gitlab.rb配置文件
-
按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb
(宿主机路径:vi /usr/local/gitlab/etc/gitlab.rb)配置有三个参数如:
把对应的#给取消掉 然后修改如下
external_url 'http://192.168.66.71:8881'
gitlab_rails['gitlab_ssh_host'] = '192.168.66.71'
gitlab_rails['gitlab_shell_ssh_port'] = 8222
nginx['listen_port'] =8881
注意事项:external_url 和gitlab_rails
这两个ip参数建议固定操作系统的静态不变的IP或说是域名进行配置,假设IP变得的话在GitLab新建项目的时候,生成的IP还是原来的IP,此时就无法推送代码在Gitlab里面
注意: 8888端口号要和我们创建容器指定的端口号一致
进gitlab容器重启配置服务
docker exec -it gitlab /bin/bash #进去gitlab容器的命令
gitlab-ctl reconfigure #重置gitlab客户端的命令
docker exec -it gitlab-runner /bin/bash
由于我们运行是使用数据卷参数进行运行的,宿主机的gitlab.rb文件修改了,gitlab的文件会跟着改,但是容器的文件不会跟着生效,必须要进去容器里面进行命令执行,重置配置文件比较耗费时间,需要耐心等待,如果时间比较短说明成功率不高,而且进去容器之后就退出啦。
备注:如上信息如果出现了,然后等了将近一分钟的话,恭喜你在docker安装Gitlab成功通过了.
然后退出容器 exit
gitlab容器命令
- docker start gitlab 启动命令
- docker restart gitlab 重启命令
- docker stop gitlab 停止命
docker restart gitlab #这里重启容器也需要耐心等待.
检测启动信息
docker ps
查看本机端口状态
netstat -tnl
进入容器内 GitLab常用命令
gitlab-ctl reconfigure # 重新应用gitlab的配置
gitlab-ctl restart # 重启gitlab服务
gitlab-ctl status # 查看gitlab运行状态
gitlab-ctl stop # 停止gitlab服务
gitlab-ctl tail # 查看gitlab运行日志
http://192.168.66.71:8888
5.访问gitLab:
稍等片刻,初始化完毕,再打开浏览器:ip地址:8888 (http://你的ip:8888/) ip可以换成域名
以上安装完成了 不要立即访问 会502 需要加载一段时间的 等5分钟左右 在访问就可以了
进入页面后会先让你修改密码:
修改密码为:123456789(任意),
修改完成:使用 用户名root,密码为123456789进行登陆。
6.创建一个项目
gitlab页面
下面我们就可以新建一个项目了,点击 创建一个项目 后面的就和GitHub上一样操作了 自己慢慢摸索就行
注意创建项目时候下面后有一个 让你选择是否创建自述文件 (用来描述项目的) 是Markdown 格式的
所以在使用的时候需要加上 8881端口号 否则是访问不到的 请求被拒绝
使用的时候是 http://192.168.66.71:8881/root/myweb.git
7.添加SSH秘钥
如果不添加秘钥是无法使用 git 拉取 和 上传的
Git是一个分布式版本控制系统,这意味着您可以在本地工作 但您也可以将更改共享或“推送”到其他服务器。 在将更改推送到GitLab服务器之前 您需要安全的通讯渠道来共享信息。 SSH协议提供了这种安全性,并允许您向
GitLab远程服务器,无需每次都提供您的用户名或密码。
8. git 拉取项目
接下来我在/root/test目录下操作 没有自己创建 来完成 git配合 Gitlab 的使用流程
这就是我之前创建的项目 也是我们下面演示的目的地
先初始化本地git仓库 生成的仓库是.git后缀的 (里面都是项目的配置信息 第一次创建的时候是空的 commit 的时候 自动补充 默认分支是 master )
git init
初始化空的 Git 版本库于 /root/test/.git/
克隆远程Gitlab仓库 到本地 (必须在你初始化git仓库那个目录里和.get在同层 如果项目已经有了那么就不能在克隆了)
git clone ssh://git@192.168.66.71:8222/root/myweb.git
git clone http://192.168.66.71:8881/root/myweb.git
以上2种方式都行 建议使用 ssh 如果中途断开 会导致下次在Clone失败 需要删除index.lock锁文件
rm -rf /root/test.git/index.lock 才能再次克隆
他还有一个 -b <name> 表示克隆指定分支 比如 : git clone -b master2 xxxx
提示: 基本上第一次拉取项目的时候使用克隆(clone) 以后都不用了 都使用pull 对克隆下来的项目进行更新
我们对拉取下来的myweb 内容进行操作 (将test目录删除) 使用git命令才行 否则无效
cd myweb
git rm -rf test
将指定文件或者当前目录下所有文件提交到 git缓存中 作用就是将我们需要提交的代码从工作区添加到暂存区,就是告诉git系统,我们要提交哪些文件,之后就可以使用git commit命令进行提交了。
可以吧 . 换成指定目录或者文件 一般都是 . 毕竟是项目很多文件的 . 作用是将当前文件下所有文件提交到暂存区
git add -A .
-A 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。
将缓存中修改提交到git本地库
git commit -a -m "版本描述"
“版本描述” 就是下图的位置
关联远程仓库 使用SSH 免登录 (关联一次就行了 记住名称) 这部很重要
git remote add gitLab-test ssh://git@192.168.66.71:8222/root/myweb.git
gitLab-test 就是我们远程仓库的别名 也可以说是 远程主机名
如果存在 可以使用 git remote remove <name> 删除存在的
将本地库的commit推送到远程服务器
git push -u gitLab-test master
可以看到成功吧test文件夹给删除了
git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。
什么意思呢? 简单来说就是 你本地的项目现在是1.0 你同事发布了1.1 那么你拉取项目的时候会将1.1和你本地代码进行合并 我们简单来测试下 你在本地 README.md和GitLab里 README.md 都添加点不同的内容
执行下面代码
git pull gitLab-test master
可以发现本地的也更新内容了
还有就是 如果你修改了本地代码 而你同事修改了Gitlab上的代码 那么你拉取的时候将会出现这样的错误
error: Your local changes to the following files would be overwritten by merge:
解决办法:
只保留服务器端代码,则直接回退到上一个版本,再进行pull (这样是最省事的 注意自己要进行备份)
git reset --hard && git pull origin master
不止上面这点错误 pull 会有一大堆的错误 一般都是在团体开发的时候出现的
最简单的办法就是删除原来的 然后在重新拉取 (注意备份)
你和同事一起开发一个项目的时候 每次拉取前 先将本地的项目备份到其他地方 然后在删除 之后从新拉取项目
这样的好处就是 既保证了是最新的项目 也保证了如果新的项不行那么 还有后悔的余地
9.安装gitlab-runner
docker pull gitlab/gitlab-runner:latest
启动 gitlab-runner容器
docker run -d --name gitlab-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
gitlab/gitlab-runner:latest
注册runner
进入Gitlab创建一个新的项目 ->进入到项目的设置里面找到CI/CD 点击后在页面找到Runners
展开 这里面的信息我们一会注册runner的时候需要用到。
好,我们在命令行中执行如下命令:
docker exec -it gitlab-runner gitlab-ci-multi-runner register
出现Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
你输入 (对应上图的 url)
http://192.168.66.71:8888/
然后回车
出现gitlab-ci token for this runner:
你输入 (对应上图的 令牌)
1MtJahDYedgrYenwHin7
然后回车
出现类似 [cb7d680e0af0]:
描述
你输入
gitlab runner demo
然后回车
出现Enter tags for the runner (comma-separated):
在项目构建流程yaml文件里面指定tag,就是匹配使用哪个tag的runner,这里我定义了demo,回头再配置文件里面就指定这个tag。
你输入
demo
然后回车
出现类似Enter an executor: docker, virtualbox, docker+machine, kubernetes, custom, docker-ssh, parallels, shell, ssh, docker-ssh+machine:
执行者可以有很多种,这里我们使用docker,方便构建执行。
你输入
docker
然后回车
出现类似Enter the default Docker image (for example, ruby:2.6):
构建Docker image时填写的image名称,根据项目代码语言不同,指定不同的镜像。我这里项目是java语言的,所以我使用docker官方maven:3-jdk-8镜像。
你输入
maven:3-jdk-8
然后回车
然后我们就注册完毕了。 过一会 runners 页面就会出现: 刷新页面
这里注意: 如果你重启 gitlab 那么发现找不到 Runner了 那么需要重新配置
配置 就算job没有tag也可以运行
在你项目根目录下创建文件:.gitlab-ci.yml
写个小demo 测试文件
stages:
- build
- test
- deploy
build_maven:
stage: build
script:
- echo "build maven....."
- echo "mvn clean"
- echo "done"
test_springboot:
stage: test
script:
- echo "run java test....."
- echo "java -test"
- echo "done"
deploy_springboot:
stage: deploy
script:
- echo "deploy springboot...."
- echo "run mvn install"
- echo "done"
当你项目push到gitlab中之后: 在CI/CD ——> pipelines 中即可看到效果
git remote add gitLab-test ssh://git@192.168.66.71:8222/root/myweb.git
git pull gitLab-test master
git add xxx要提交的文件
git commit -m "描述"
git push gitLab-test master
我们可以进入看看 到底执行了什么东西 点击 绿色的已通过
然后看到效果如下 分别依次点击这些 bulid Test Deploy 看看内容
先看第一个Bulid
第一个红框 内容就是 我们之前创建runner的时候指定的环境 我一般都是java Maven 相关的项目
而echo 都不陌生把 这 类似ava的print打印信息
至于test 和 deploy 都差不多 这里就不截图了自己看你自己的
至于.gitlab-ci.yml说明 这里不过多说了,下面这个博客将的很明白
https://blog.csdn.net/miss1181248983/article/details/102885253
如果执行shell命令都是在当前项目的根目录下执行的
我们来演示一个案例 :
用户推送项目的时候自动发送http请求到远程服务 ,远程服务接收到消息后进行拉取gitlab上的项目
主要就是关注 script 这个节点 (由Runner执行的shell脚本或命令)
在做案例前我们先看一个内容
最简单的.gitlab-ci.yml
stages:
- test
job1
stage:test
script:
- pwd
- echo "ls -a"
注意观察结果看看命令到底是在哪里执行了,可以发现就是在gitlab项目的根目录既然这样我们是不是可以写一个shell脚本在项目的根目录, 然后发送http请求呢 ?
stages表示任务构建的阶段。一次pipeline中允许定义多个stages,这些stages 会有以下特点:
- 所有 stages 会按照顺序运行,即当一个 stage 完成后,下一个 stage 才会开始
- 只有当所有 stages 完成后,该构建任务 (pipeline) 才会成功
- 如果任何一个 stage 失败,那么后面的 stages 不会执行,该构建任务 (pipeline) 失败
jobs表示构建工作,表示某个stage里面执行的工作,我们可以在stages里面定义多个jobs,这些jobs会有以下特点:
- 相同stage中的jobs会并行执行
- 相同stage中的jobs都执行成功时,该stage才会成功
- 如果任何一个job失败,那么该stage失败,即该构建任务 (pipeline) 失败
jobs的定义:
- 定义了在什么条件下执行它们的条件
- 具有任意名称的顶级元素,并且必须至少包含script
- 不受定义数量的限制
掌握了这些 我们就可以做案例了
10.自动化部署项目
必须完成gitLab-runner
有了 GitLab-runner ,只需要三步就可以实现以上描述的效果了。
第一步 在项目的根目录添加 .gitlab-ci.yml
stages:
- deploy
deploy_springboot:
stage: deploy
script:
- chmod +x shell
- ./shell
第二部在项目的根目录添加shell文件
#!/bin/bash
echo "开始"
curl -i -k -H "Content-type: application/json" -X POST -d '{"ip":"192.168.66.71","user":"root","pass":"root","shell":"cd /root/test/testpo && rm -rf myweb && git clone ssh://git@192.168.66.71:8222/root/myweb.git"}' http://192.168.66.1:2110/shell
echo "结束"
效果图:
然后就是搭建远程的java服务了 当推送项目到gitLab里然后通过gitLab里的runner调用 .gitlab-ci.yml 文件执行里面的代码 发送http请求到Java服务里(Java服务是放在代码服务器上), java服务接收到请求后执行 git clone 来拉取gitlab上的最新项目到服务的指定位置 比如: Tomcat 下的 weapp里,然后在运行脚本重启Tomcat
下代码就是用java写的用来拉取git代码的
然后你查询 一下你远程代码服务里的项目是不是最新的
如果你还不理解 我最简化的说下过程
a b c
这三个服务器 :
- a 是本地
- b是阿里云服务器(gitLab服务器)
- c是腾讯云服务器(代码服务器)
当本地使用命令 ,推送新项目到gitLab服务器,就会触发runner 然后通知java服务
git push -u gitLab-test master
然后Java服务克隆代码到指定目录,之后启动项目的启动脚本
git clone ssh://git@192.168.66.71:8222/root/myweb.git
除了以上方法还有什么方法没? 当然有了在大量需要上线的项目进行推送最好还是需要一个统一管理的服务
git+ gitLab等 + jenkins 而 jenkins安装到代码服务器上 jenkins 我们可以到使用docker安装
当Git 推送代码到 GitLab上 然后GitLab通知 jenkins 而 jenkins 拉取 GitLab仓库里的代码到本地指定目录 ,之后运行在jenkins 上设置的脚本进行部署运行项目