为什么要搭建这个gitlab私有仓库中小型公司其实3套业务3套系统需要部署1个运维 10台阿里云 shell脚本发布 就能够实现git 远程代码仓库 shell 脚本 实现发布更新git 远程仓库gitee国内的代码仓库github一样代码上传开发 上传 公司使用的远程代码仓库githubgitee代码运行启动运维 shell脚本ssh 进入目标部署的服务器git clone 代码仓库下载解压缩进入制定目录设置项目运行环境phppython代码更新重启运维 shell脚本ssh 进入目标服务器进入已存在的代码仓库 /www/my_site/# 下载新代码更新本地仓库源码git pull -u origin master干掉旧的进程重启新进程即可中大型的公司买自己的服务器搭建自己的代码仓库企业内部所有资料全部是私有的。运维去部署gitlab这样的私有代码仓库githubgitee都是一样的gitlab部署实践yum install curl policycoreutils-python openssh-server postfix wget -y 获取gitlab源码包 选择各种yum源去安装 https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.3-ce.0.el7.x86_64.rpm 我已经准备好了 准备好源码 #这是社区办的gtilab rpm -ivh gitlab-ce-12.0.3-ce.0.el7.x86_64.rpm yum localinstall gitlab-ce-12.0.3-ce.0.el7.x86_64.rpmgitlab基础设置配置gitlab服务修改域名和邮箱 设置参数如下 [rootgitlab-99 ~]#grep -E ^[a-Z] /etc/gitlab/gitlab.rb external_url http://10.0.0.99 gitlab_rails[gitlab_email_enabled] true gitlab_rails[gitlab_email_from] 877348180qq.com gitlab_rails[gitlab_email_display_name] linux0224 gitlab_rails[smtp_enable] true gitlab_rails[smtp_address] smtp.qq.com gitlab_rails[smtp_port] 465 gitlab_rails[smtp_user_name] 877348180qq.com gitlab_rails[smtp_password] pvthquniqpjvbbch gitlab_rails[smtp_domain] smtp.qq.com gitlab_rails[smtp_authentication] login gitlab_rails[smtp_enable_starttls_auto] true gitlab_rails[smtp_tls] true 修改了gitlab的配置务必要重新加载gitlab配置 #重新配置gitlab首次执行会很慢 gitlab-ctl reconfigure 执行命令测试是否可以发邮件 gitlab-rails console 执行如下命令测试发邮件即可 Notify.test_email(yc_uuu163.com,美好的一天,hello linux0224).deliver_now确认可以发邮件之后可以使用gitlab图形化配置了。gitlab命令行管理gitlab-ctl start 启动所有服务 gitlab-ctl stop 停止 gitlab-ctl stop postgresql 停止某个服务 gitlab-ctl restart gitlab-ctl status gitlab-ctl reconfigure 重新读取gitlab配置 gitlab-ctl tail 查看gitlab的运行状态所有服务状态 gitlab-ctl tail redis 只看某个服务的状态检测gitlab的nginx状态[rootgitlab-99 ~]# [rootgitlab-99 ~]#netstat -tunlp|grep nginx tcp 0 0 0.0.0.0:8060 0.0.0.0:* LISTEN 3303/nginx: master tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3303/nginx: master [rootgitlab-99 ~]# [rootgitlab-99 ~]# [rootgitlab-99 ~]# [rootgitlab-99 ~]#gitlab-ctl tail nginx /var/log/gitlab/nginx/current /var/log/gitlab/nginx/error.log /var/log/gitlab/nginx/gitlab_access.log /var/log/gitlab/nginx/gitlab_error.log /var/log/gitlab/nginx/access.log 访问gitlab查看日志[rootgitlab-99 ~]# [rootgitlab-99 ~]## 问题拍错的步骤 1.访问具体url查看日志都加载了哪些资源提取日志的 资源路径状态码判断网页的运行状态 [rootgitlab-99 ~]# [rootgitlab-99 ~]# [rootgitlab-99 ~]# [rootgitlab-99 ~]#awk -F \ {print $2 } /var/log/gitlab/nginx/gitlab_access.log GET / HTTP/1.1 GET /users/sign_in HTTP/1.1 GET /users/password/edit?reset_password_tokenuj5yPdU_M3xxYmW2xeV9 HTTP/1.1 GET /assets/application-77566acc818458515231d0a82c131a42890d771ea998b9f578dc38e0eb7e517f.css HTTP/1.1 GET /assets/highlight/themes/white-a165d47ce52cf24c29686366976ae691bd9addb9641a6abeb3ba6d1823b89aa8.css HTTP/1.1 GET /assets/webpack/runtime.ee1acb18.bundle.js HTTP/1.1 GET /assets/webpack/default.22a634a6.chunk.js HTTP/1.1 GET /assets/print-74c3df10dad473d66660c828e3aa54ca3bfeac6d8bb708643331403fe7211e60.css HTTP/1.1 GET /assets/webpack/main.0a630f76.chunk.js HTTP/1.1 GET /assets/favicon-7901bd695fb93edb07975966062049829afb56cf11511236e61bcf425070e36e.png HTTP/1.1 [rootgitlab-99 ~]# [rootgitlab-99 ~]#默认先改密码然后登录rootlinux0224gitlab关闭注册功能gitlab发邮件功能需要发送验证邮件即可确认 给root添加 163邮箱gitlab用户管理1. 先创建个组创建小组Gitlab是通过组group的概念来统一管理仓库(project)和用户(user)通过创建组在组下创建仓库再将用户加入组从而实现用户和仓库的权限管理。创建halo项目私有组内项目创建用户操作chaoge用户管理员wenjie 开发者创建普通用户用户名要唯一用户绑定的邮箱再用户列表中该邮箱唯一root用户yc_uuu163.comchaoge用户 877348180qq.com不能创建组身份设置为 admin管理员角色创建项目后关联用户身份设置目前 chaogewenjie用户都还是单个的用户没加入组呢让wenjie chaoge 都能看到 my_halo的项目加入linux0224部门就行测试分别用chaogewenjie登录系统查看项目wj335598163.com李文杰同志再他自己的电脑上登录邮箱能充值密码吗能 1 不能 2说出为什么不在一个网络环境因为重置密码的链接是gitlab平台提供的你得访问gitlabgitlab是内网地址external_url http://10.0.0.99拿到重置链接http://10.0.0.99 能方访问吗10.0.0.xwenjie用户试试wenjiewenjie666gitlab仓库代码管理实践配置ssh-key准备机器来模拟开发运维部署的全流程开发运维下载上传代码都得和gitlab进行身份验证发布halo博客源码实战部署实战架构图halo源码下载再第一个环境确保远程仓库 linux0224/my_halo 项目中有源码数据 模拟是halo这个项目的维护者 基于halo博客的源码去配置 my_halo gitlab仓库 模拟开发者再自己的笔记本上推代码到gitlab仓库 1.下载源码 git clone https://github.com/halo-dev/halo.git github访问不了 - 买个个人梯子爬楼梯即可 - 公司都会默认提供梯子请放心随便下载互联网的资源 转战码云的地址 https://gitee.com/halo-dev/halo git clone https://gitee.com/halo-dev/halo.git halo下载到本地就叫做本地仓库 SylarDESKTOP-G6C412R MINGW64 ~/Desktop $ ls -dl halo drwxr-xr-x 1 Sylar 197121 0 Jul 18 14:23 halo/ 2. 关联你自己的gitlab仓库 my_halo 默认下载的远程仓库远程地址还是默认的 $ git remote add origin git10.0.0.99:linux0224/my_halo.git SylarDESKTOP-G6C412R MINGW64 ~/Desktop/halo (master) $ git remote -v SylarDESKTOP-G6C412R MINGW64 ~/Desktop/halo (master) $ SylarDESKTOP-G6C412R MINGW64 ~/Desktop/halo (master) $ git remote add origin git10.0.0.99:linux0224/my_halo.git SylarDESKTOP-G6C412R MINGW64 ~/Desktop/halo (master) $ SylarDESKTOP-G6C412R MINGW64 ~/Desktop/halo (master) $ SylarDESKTOP-G6C412R MINGW64 ~/Desktop/halo (master) $ git remote -v origin git10.0.0.99:linux0224/my_halo.git (fetch) origin git10.0.0.99:linux0224/my_halo.git (push) 3. 推送代码 SylarDESKTOP-G6C412R MINGW64 ~/Desktop/halo (master) $ git push -u origin master Enumerating objects: 40865, done. Counting objects: 100% (40865/40865), done. Delta compression using up to 20 threads Compressing objects: 100% (13450/13450), done. Writing objects: 100% (40865/40865), 43.39 MiB | 48.24 MiB/s, done. Total 40865 (delta 21360), reused 40812 (delta 21323), pack-reused 0 remote: Resolving deltas: 100% (21360/21360), done. To 10.0.0.99:linux0224/my_halo.git * [new branch] master - master branch master set up to track origin/master.配置本地机器的ssh-key到远程仓库关联远程仓库的ssh-key登录的gitlab用户是谁gitlab创建小组\用户目前已经有了linux0224小组linux0224/chaogelinux0224/wenjiegitlab项目创建git10.0.0.99:linux0224/my_halo.git http://10.0.0.99/linux0224/my_halo.git 自建的私有仓库地址运维推送代码到gitlabchaoge账号保护master分支不允许开发者提交# 目前还没保护的状态试试wenjie推代码直接推送到master分支 准备一个文杰的机器 文杰windows开发macoslinux系统 模拟文杰使用linux机器开发推送代码到远程仓库master linux 10.0.0.51 1.先设置公钥到wenjie账户 2. 先克隆远程的代码下载一份到本地 继续写新代码 [rootdb-51 /home/wenjie]#yum install git -y git clone git10.0.0.99:linux0224/my_halo.git 想下载远程仓库的私有代码 准备好一个机器的公钥添加到有访问改项目的用户设置中添加ssh-key db-51 机器作为客户端ssh-key添加到了 wenjie账号里的 settings设置 wenjie用户属于 linux0224组的成员 my_halo这个项目属于linux0224组的项目 因此可以下载源码了 目前开发者wenjie再 db-51机器上拉取了最新的代码 [rootdb-51 /home/wenjie]#git clone git10.0.0.99:linux0224/my_halo.git Cloning into my_halo... remote: Enumerating objects: 40865, done. remote: Counting objects: 100% (40865/40865), done. remote: Compressing objects: 100% (13413/13413), done. remote: Total 40865 (delta 21360), reused 40865 (delta 21360) Receiving objects: 100% (40865/40865), 43.39 MiB | 53.67 MiB/s, done. Resolving deltas: 100% (21360/21360), done. # 不够严重的玩法 # 小公司master分支一把梭 # 大公司由于业务多安全性高人员多需要做好权限控制 # 小公司人员少项目不太复杂权限部署架构一切从简 # 直接用master写代码推代码 还得身份设置 [rootdb-51 /home/wenjie/my_halo]#git config --global user.email wj335598163.com [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]#git config --global user.name wenjie [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]#git config --list user.emailwj335598163.com user.namewenjie core.repositoryformatversion0 core.filemodetrue core.barefalse core.logallrefupdatestrue remote.origin.urlgit10.0.0.99:linux0224/my_halo.git remote.origin.fetchrefs/heads/*:refs/remotes/origin/* branch.master.remoteorigin branch.master.mergerefs/heads/master [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]#git commit -m 文杰提交了一版代码直接用的master [master ad423b7] 文杰提交了一版代码直接用的master 1 file changed, 1 insertion() create mode 100644 wenjie66.py [rootdb-51 /home/wenjie/my_halo]#git log -2 commit ad423b759e41652f82fac5f1abe87203ffed43e7 Author: wenjie wj335598163.com Date: Mon Jul 18 23:04:24 2022 0800 文杰提交了一版代码直接用的master commit 7eef3b700653cecb666ec4509871234b5922eaf6 Author: John Niang johnniangfastmail.com Date: Mon Jul 11 16:46:12 2022 0800 Change optimization into improvement (#2235) We only have the kind/improvement label. [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]## 因此发现gitlab默认对my_halo项目做了master分支保护 wenjie该用户无法推送数据到master 只能用chaoge用户 root用户可以推保护分支功能是针对项目而言的正确的玩法模拟开发者创建分支写代码推送到自己的分支上用管理员去合并开发wenjie开始写代码1. 克隆代码 git clone git10.0.0.99:linux0224/my_halo.git 2. 本地创建分支 wenjie [rootdb-51 /home/wenjie/my_halo]##笔试题如何创建切切换分支 [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]#git checkout -b wenjie Switched to a new branch wenjie [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]#git branch master * wenjie 3. 提交本地版本 [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]#git add . [rootdb-51 /home/wenjie/my_halo]# [rootdb-51 /home/wenjie/my_halo]#git commit -m 分支wenjie 提交了haha.py [wenjie f84fc07] 分支wenjie 提交了haha.py 1 file changed, 1 insertion() create mode 100644 haha.py 4. 推送到gitlab推送wenjie分支的代码 1. 自动帮你创建远程分支了 2. 自动生成merge合并的请求urlwenjiemaster [rootdb-51 /home/wenjie/my_halo]#git push -u origin wenjie Counting objects: 4, done. Delta compression using up to 4 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 327 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: remote: To create a merge request for wenjie, visit: remote: http://10.0.0.99/linux0224/my_halo/merge_requests/new?merge_request%5Bsource_branch%5Dwenjie remote: To git10.0.0.99:linux0224/my_halo.git * [new branch] wenjie - wenjie Branch wenjie set up to track remote branch wenjie from origin. 访问改url向管理员发出合并wenjie分支到master的请求 http://10.0.0.99/linux0224/my_halo/merge_requests/new?merge_request%5Bsource_branch%5Dwenjie 5. 运维去合并laoliu分支3.试试能推送代码到master上吗肯定不能因为laoliu普通用户无法推到master分支设置了分支保护无法推送4.你只能新建分支然后写代码推送以及推送到了wenjie分支查看远程my_halo仓库的分支代码创建合并请求提交PR(pull requests)发一个url请求git自动帮你生成了 PR请求 http://10.0.0.99/linux0224/my_halo/merge_requests/new?merge_request%5Bsource_branch%5Dwenjiechaoge管理员合并了wenjie的请求删除文杰分支检查分支是否被删除检查master是否看到了最新的代码以及提交记录管理员chaoge去合并代码此时下载最新代码试试master分支的windows chaoge用户的 pub key 可以下载 db-51 wenjie 的pub key 可以下载 其他机器不行 [rootdb-51 /tmp]#git clone git10.0.0.99:linux0224/my_halo.git Cloning into my_halo... remote: Enumerating objects: 40869, done. remote: Counting objects: 100% (40869/40869), done. remote: Compressing objects: 100% (13416/13416), done. remote: Total 40869 (delta 21361), reused 40864 (delta 21360) Receiving objects: 100% (40869/40869), 43.39 MiB | 44.83 MiB/s, done. Resolving deltas: 100% (21361/21361), done. [rootdb-51 /tmp]# [rootdb-51 /tmp]# [rootdb-51 /tmp]#ls [rootdb-51 /tmp/my_halo]# [rootdb-51 /tmp/my_halo]#git log -2 commit 8e1d023cfd48a2c010ff9dadf5577d6c93601ab3 Merge: 7eef3b7 f84fc07 Author: chaoge 877348180qq.com Date: Mon Jul 18 23:26:24 2022 0800 Merge branch wenjie into master 分支wenjie 提交了haha.py See merge request linux0224/my_halo!1 commit f84fc0719e0d6d9bf6c6882874b8183c7f964849 Author: wenjie wj335598163.com Date: Mon Jul 18 23:15:34 2022 0800 分支wenjie 提交了haha.py [rootdb-51 /tmp/my_halo]# [rootdb-51 /tmp/my_halo]# [rootdb-51 /tmp/my_halo]## 最新克隆的代码1 包含 haha.py 2 也看到了提交版本记录 完全理解 222222 [rootdb-51 /tmp/my_halo]# [rootdb-51 /tmp/my_halo]#git pull 拉取最新更新代码实践运维再线上更新代码的操作1. 克隆一个最新代码2. 此时远程仓库可能会发生更新的动作3. 此时本地可以拉去最新的代码中小型公司的手工部署再来一个更完成的部署全流程讲解halo博客java项目部署python项目java项目php项目和你的git gitab的流程 无关都一样区别就在于具体的再目标机器如何设置环境运行源码的区别1. 首次启动- 下载代码到目标服务器- 设置运行环境shell脚本- 启动即可2. 下次的更新- 进入该项目目录- 更新源代码- 重启上述是部署逻辑具体部署的源码是什么 javapython没区别了php-fpmpython3部署python项目全流程gitlab阶段git10.0.0.99:linux0224/my_flask.git SylarDESKTOP-G6C412R MINGW64 ~/Desktop/my_flask (master) $ git remote -v origin git10.0.0.99:linux0224/my_flask.git (fetch) origin git10.0.0.99:linux0224/my_flask.git (push)部署阶段web7首次启动下载代码 [rootweb-7 /www]#git clone git10.0.0.99:linux0224/my_flask.git 准备项目运行环境 # 首次发布脚本 cat deploy_flask.sh EOF #!/bin/bash cd /www/my_flask # yum install python3 python3-devel python3-pip -y /dev/null # 安装python项目模块 pip3 install flask -i https://pypi.douban.com/simple /dev/null #后台启动项目即可 # 重启进程 kill -9 $(ps -ef|grep my_app |grep -v grep |awk {print $2}) nohup python3 my_app.py nohup.log 21 # 检查运行结果 echo 最新的flask项目进程号 $(ps -ef|grep my_app |grep -v grep |awk {print $2}) EOF #启动就好 访问项目下次的更新1.模拟开发修改了源码python开发修改代码了推送到线上的master分支 2. 下载更新代码重启程序确保可访问 更新代码重启程序 cat restart_flask.sh EOF #!/bin/bash cd /www/my_flask # 更新代码 git pull -u origin master #后台启动项目即可 # 重启进程 kill -9 $(ps -ef|grep my_app |grep -v grep |awk {print $2}) nohup python3 my_app.py nohup.log 21 # 检查运行结果 echo 最新的flask项目进程号 $(ps -ef|grep my_app |grep -v grep |awk {print $2}) # 等几秒就好了 # 睡眠2秒 sleep 2; echo 本地测试访问结果 $(curl -s 127.0.0.1:5000) EOF 3.运行脚本查看手工更新网站的结果 [rootweb-7 /www]# [rootweb-7 /www]#bash restart_flask.sh中大型公司的jenkins自动化部署业务太多了重启的服务也太多了实现更新流水线gitlab备份、恢复修改备份配置1.修改配置文件 [rootgitlab-99 /etc/gitlab]#grep -E ^[a-Z] /etc/gitlab/gitlab.rb gitlab_rails[backup_path] /gitlab_backup/ gitlab_rails[backup_keep_time] 604800 external_url http://10.0.0.99 gitlab_rails[gitlab_email_enabled] true gitlab_rails[gitlab_email_from] 877348180qq.com gitlab_rails[gitlab_email_display_name] linux0224 gitlab_rails[smtp_enable] true gitlab_rails[smtp_address] smtp.qq.com gitlab_rails[smtp_port] 465 gitlab_rails[smtp_user_name] 877348180qq.com gitlab_rails[smtp_password] pvthquniqpjvbbch gitlab_rails[smtp_domain] smtp.qq.com gitlab_rails[smtp_authentication] login gitlab_rails[smtp_enable_starttls_auto] true gitlab_rails[smtp_tls] true 2. 重读gitlab配置即可 [rootgitlab-99 /etc/gitlab]#gitlab-ctl reconfigure 准备备份数据的目录和配置一致 mkdir -p /gitlab_backup/ chown -R git.git /gitlab_backup/ 3.执行如下备份命令 gitlab-rake gitlab:backup:create 4.查看备份的数据 [rootgitlab-99 /etc/gitlab]#ls /gitlab_backup/ 1658161288_2022_07_19_12.0.3_gitlab_backup.tar [rootgitlab-99 /etc/gitlab]#ls /gitlab_backup/ -lh total 44M -rw------- 1 git git 44M Jul 19 00:21 1658161288_2022_07_19_12.0.3_gitlab_backup.tar数据恢复Gitlab的恢复只能恢复到与原本备份文件相同的gitlab版本中恢复时需要停止数据库的写入操作但是保持gitlab是运行的。 暂停数据库写入停止会连接数据库的几个服务 # 停止如下仨服务然后执行恢复gitlab的数据命令即可 gitlab-ctl stop unicorn gitlab-ctl stop sidekiq gitlab-ctl stop nginx # 恢复数据需要制定你自己的备份数据包 # 备份细节填入文件的名字就好不要后缀 [rootgitlab-99 /etc/gitlab]#ls /gitlab_backup/ 1658161288_2022_07_19_12.0.3_gitlab_backup.tar gitlab-rake gitlab:backup:restore BACKUP1658161288_2022_07_19_12.0.3 恢复操作就是删除 所有原有数据然后恢复该最新的数据 看到如下结果就是正确的 Restore task is done. 最后一步重新读取配置确认你的gitlab可以访问 gitlab-ctl reconfigure gitlab-ctl restart gitlab-ctl status |grep run [rootgitlab-99 /etc/gitlab]#gitlab-ctl status|grep run run: alertmanager: (pid 60821) 41s; run: log: (pid 3595) 20530s run: gitaly: (pid 60836) 40s; run: log: (pid 3079) 20596s run: gitlab-monitor: (pid 60856) 40s; run: log: (pid 3497) 20546s run: gitlab-workhorse: (pid 60872) 40s; run: log: (pid 3305) 20561s run: grafana: (pid 60881) 39s; run: log: (pid 3721) 20508s run: logrotate: (pid 60979) 39s; run: log: (pid 3422) 20556s run: nginx: (pid 60985) 38s; run: log: (pid 3325) 20560s run: node-exporter: (pid 60994) 38s; run: log: (pid 3475) 20550s run: postgres-exporter: (pid 61000) 38s; run: log: (pid 3642) 20524s run: postgresql: (pid 61010) 37s; run: log: (pid 3163) 20590s run: prometheus: (pid 61019) 37s; run: log: (pid 3555) 20536s run: redis: (pid 61034) 36s; run: log: (pid 2960) 20597s run: redis-exporter: (pid 61038) 36s; run: log: (pid 3522) 20542s run: sidekiq: (pid 61045) 35s; run: log: (pid 3280) 20565s run: unicorn: (pid 61051) 35s; run: log: (pid 3259) 20569s验证gitlab是否正常