Git 与 GitLab、Jenkins 自动化部署实战指南

发布时间:2026/10/17 7:30:02

Git 与 GitLab、Jenkins 自动化部署实战指南 git使用[rootserver1 ~]# yum install -y git[rootserver1 ~]# mkdir demo[rootserver1 ~]# cd demo/[rootserver1 demo]# git inithint: Using master as the name for the initial branch. This default branch namehint: will change to main in Git 3.0. To configure the initial branch namehint: to use in all of your new repositories, which will suppress this warning,hint: call:hint:hint: git config --global init.defaultBranch namehint:hint: Names commonly chosen instead of master are main, trunk andhint: development. The just-created branch can be renamed via this command:hint:hint: git branch -m namehint:hint: Disable this message with git config set advice.defaultBranchName falseInitialized empty Git repository in /root/demo/.git/[rootserver1 demo]# git statusOn branch masterNo commits yetnothing to commit (create/copy files and use git add to track)[rootserver1 demo]# git status -s[rootserver1 demo]# echo test README.md[rootserver1 demo]#[rootserver1 demo]# lsREADME.md[rootserver1 demo]# git status -s?? README.md[rootserver1 demo]# git add README.md[rootserver1 demo]# git status -sA README.md[rootserver1 demo]# git config --global user.email user_uuwestos.org[rootserver1 demo]# git config --global user.name user_uu[rootserver1 demo]# git commit -m add README.md[master (root-commit) fc209da] add README.md1 file changed, 1 insertion()create mode 100644 README.md[rootserver1 demo]# echo hello README.md[rootserver1 demo]# git status -sM README.md[rootserver1 demo]# git add README.md[rootserver1 demo]# git status -sM README.md[rootserver1 demo]# echo world README.md[rootserver1 demo]# git status -sMM README.md[rootserver1 demo]# git commit -m v1[master 6c356af] v11 file changed, 1 insertion()[rootserver1 demo]# git status -sM README.md[rootserver1 demo]# git add .[rootserver1 demo]# git status -sM README.md[rootserver1 demo]# git commit -m v2[master 31e4e11] v21 file changed, 1 insertion()[rootserver1 demo]# git status -s查看日志[rootserver1 demo]# git reflog31e4e11 (HEAD - master) HEAD{0}: commit: v26c356af HEAD{1}: commit: v1fc209da HEAD{2}: commit (initial): add README.md更详细地查看[rootserver1 demo]# git log --oneline忽略隐藏文件[rootserver1 demo]# touch .a[rootserver1 demo]#[rootserver1 demo]# git status -s?? .a[rootserver1 demo]# vim .gitignore[rootserver1 demo]# cat .gitignore.*[rootserver1 demo]# git status -s[rootserver1 demo]# echo helloworld test.txt[rootserver1 demo]# git add test.txt[rootserver1 demo]# git commit -m add test.txt[master ac4b79d] add test.txt1 file changed, 1 insertion()create mode 100644 test.txt撤销文件修改[rootserver1 demo]# rm -f test.txt[rootserver1 demo]# git status -sD test.txt[rootserver1 demo]# git checkout -- test.txt取消暂存区文件[rootserver1 demo]# git rm test.txtrm test.txt[rootserver1 demo]# git status -sD test.txt[rootserver1 demo]# git reset HEAD test.txtUnstaged changes after reset:D test.txt[rootserver1 demo]# git status -sD test.txt[rootserver1 demo]# git checkout -- test.txt版本回退[rootserver1 demo]# git rm test.txtrm test.txt[rootserver1 demo]# git commit -m delete test.txt[master 7b3bb7e] delete test.txt1 file changed, 1 deletion(-)delete mode 100644 test.txt[rootserver1 demo]# git reflog7b3bb7e (HEAD - master) HEAD{0}: commit: delete test.txtac4b79d HEAD{1}: commit: add test.txt31e4e11 HEAD{2}: commit: v26c356af HEAD{3}: commit: v1fc209da HEAD{4}: commit (initial): add README.md[rootserver1 demo]# git reset --hard ac4b79dHEAD is now at ac4b79d add test.txt注意log不能查看而reflog中保存有记录[rootserver1 demo]# git log --onelineac4b79d (HEAD - master) add test.txt31e4e11 v26c356af v1fc209da add README.mdgitee远程代码仓库上传公钥[rootserver1 ~]# ssh-keygen[rootserver1 ~]# cd .ssh[rootserver1 .ssh]# lsid_rsa id_rsa.pub[rootserver1 .ssh]# cat id_rsa.pub测试连通性Rocky 虚拟机执行首次连接会提示主机指纹输入yes出现欢迎文字代表 ssh 认证成功[rootserver1 ~]# ssh -T gitgitee.com新建仓库按照gitee建议设置git全局[rootserver1 ~]# cd demo[rootserver1 demo]# git config --global user.name uu[rootserver1 demo]# git config --global user.email 17456376uu_2026user.noreply.gitee.com删除旧# origin git remote remove origin添加gitee远程# git remote add origin gitgitee.com:uu_2026/demo.git查看远程确认# git remote -v推送master分支# git push -u origin master测试克隆仓库[rootserver1 demo]# cd[rootserver1 ~]# rm -fr demo[rootserver1 ~]# git clone gitgitee.com:uu_2026/demo.gitCloning into demo...remote: Enumerating objects: 12, done.remote: Counting objects: 100% (12/12), done.remote: Compressing objects: 100% (5/5), done.remote: Total 12 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)Receiving objects: 100% (12/12), done.[rootserver1 ~]# cd demo[rootserver1 demo]# lsREADME.md test.txtgitlab部署rocky9虚拟机最小需求8G内存Index of /gitlab-ce/yum/el9/Packages/g/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror安装依赖[rootserver1 ~]# dnf install -y curl policycoreutils-python-utils openssh-server perl安装本地 gitlab rpm 包[rootserver1 ~]# dnf install -y gitlab-ce-18.11.12-ce.0.el9.x86_64.rpm修改 GitLab 配置文件 gitlab.rb[rootserver1 ~]# vim /etc/gitlab/gitlab.rbexternal_url http://192.168.164.171重新配置并初始化 gitLab[rootserver1 ~]# gitlab-ctl reconfigure查看初始 root 密码密码文件24 小时后自动删除[rootserver1 ~]# cat /etc/gitlab/initial_root_password查看 GitLab 所有组件状态所有服务全部显示run代表正常。[rootserver1 ~]# gitlab-ctl status浏览器访问 登录浏览器打开http://192.168.164.171登录后立刻修改 root 密码初始密码 24h 过期改成简体中文新建项目添加密钥测试连通性[rootserver1 ~]# ssh -T git192.168.164.171克隆项目[rootserver1 ~]# git clone git192.168.164.171:root/demo.gitCloning into demo...remote: Enumerating objects: 3, done.remote: Counting objects: 100% (3/3), done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)Receiving objects: 100% (3/3), done.[rootserver1 ~]# lsdemo[rootserver1 ~]# cd demo/[rootserver1 demo]# echo www.westos.org index.html[rootserver1 demo]# lsREADME.md index.html[rootserver1 demo]# git add index.html[rootserver1 demo]# git commit -m add index.html[main eeb0cd4] add index.html1 file changed, 1 insertion()create mode 100644 index.html[rootserver1 demo]# git push -u origin mainEnumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 4 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 305 bytes | 305.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)To 192.168.164.171:root/demo.git8785cab..eeb0cd4 main - mainbranch main set up to track origin/main.jenkins部署官网Linux注意另开一台虚拟机[rootserver1 ~]# dnf install java-21-openjdk-devel -y[rootserver1 ~]# yum install -y fontconfig[rootserver1 ~]# lsjenkins-2.580.1-1.noarch.rpm[rootserver1 ~]# rpm -ivh jenkins-2.580.1-1.noarch.rpmwarning: jenkins-2.580.1-1.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 14abfc68: NOKEYVerifying... ################################# [100%]Preparing... ################################# [100%]Updating / installing...1:jenkins-2.580.1-1 ################################# [100%]启动服务[rootserver2 ~]# systemctl enable --now jenkins.serviceCreated symlink /etc/systemd/system/multi-user.target.wants/jenkins.service → /usr/lib/systemd/system/jenkins.service.[rootserver2 ~]# netstat -antlp|grep :8080tcp6 0 0 :::8080 :::* LISTEN 12904/java登录192.168.164.172:8080[rootserver2 ~]# cat /var/lib/jenkins/secrets/initialAdminPassworde5e158591df04549adbefb247a3243e7替换国内插件源cd /var/lib/jenkins# 全局替换下载地址把国外地址换成清华镜像sed -i s|https://updates.jenkins.io/download|https://mirrors.tuna.tsinghua.edu.cn/jenkins|g updates/default.json# 重启jenkins生效systemctl restart jenkins安装推荐插件无需新建用户直接使用admin账户配置修改密码新建项目# dnf install git -y# ssh-keygen[rootserver2 ~]# cat /etc/password[rootserver2 ~]# usermod -s /bin/bash jenkins[rootserver2 ~]# su - jenkins[jenkinsserver2 ~]$ pwd/var/lib/jenkins[jenkinsserver2 ~]$ ssh-keygen[jenkinsserver2 ~]$ cd .ssh/[jenkinsserver2 .ssh]$ lsid_rsa id_rsa.pub[jenkinsserver2 .ssh]$ cat id_rsa.pub将公钥上传到gitlab私钥上传到jenkins[rootserver2 ~]# vim /etc/ssh/ssh_configInclude /etc/ssh/ssh_config.d/*.confHost *StrictHostKeyChecking no查看控制台输出安装插件Gitlab设置项目Triggers注意URL用于gitlab中的URL生成Secret token用于gitlab中的secret令牌设置项目中的webhooks打开webhooks出站请求测试推送返回绿色200通信成功触发自动构建自动化构建docker镜像在server2上安装docker-ce[rootserver2 ~]# cd /etc/yum.repos.d/[rootserver2 yum.repos.d]# vim /etc/yum.repos.d/docker.repo[docker]namedocker-cebaseurlhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/gpgcheck0[rootserver2 yum.repos.d]# dnf install -y docker-ce修改内核参数[rootserver2 ~]# vim /etc/sysctl.d/docker.confnet.bridge.bridge-nf-call-iptables 1net.bridge.bridge-nf-call-ip6tables 1net.ipv4.ip_forward 1[rootserver2 ~]# sysctl --system[rootserver2 ~]# systemctl enable --now docker配置docker默认仓库[rootserver2 ~]# vim /etc/docker/daemon.json{registry-mirrors: [https://reg.westos.org]}[rootserver2 ~]# systemctl restart docker拷贝仓库证书[rootdocker1 ~]# cd docker[rootdocker1 docker]# scp -r certs.d/ 192.168.164.172:/etc/docker/[rootserver2 ~]# ls /etc/docker/certs.d/reg.westos.org/ca.crt/etc/docker/certs.d/reg.westos.org/ca.crt注意添加解析登录私有harbor仓库[rootserver2]# docker login reg.westos.org测试[rootserver2 ~]# docker pull reg.westos.org/nginx/nginx:1.29安装CloudBees Docker Build and Publish插件配置项目构建注意取消勾选Force Pull在server1上提交Dockerfile[rootserver1 ~]# cd demo[rootserver1 demo]# vim DockerfileFROM nginxCOPY index.html /usr/share/nginx/html[rootserver1 demo]# git status -s?? Dockerfile[rootserver1 demo]# git add Dockerfile[rootserver1 demo]# git commit -m add Dockerfile[main a1d22b2] add Dockerfile1 file changed, 3 insertions()create mode 100644 Dockerfile[rootserver1 demo]# git push -u origin main此时gitlab会主动触发jenkins构建任务观察jenkins的任务输出注意这是报错权限不足将jenkins系统用户加入docker组即可[rootserver2 ~]# usermod -aG docker jenkins[rootserver2 ~]# systemctl restart jenkins[rootserver2 ~]# id jenkinsuid993(jenkins) gid993(jenkins) groups993(jenkins),992(docker)通过ssh插件交付任务在server3上安装docker-ce[rootserver3 ~]# cd /etc/yum.repos.d/[rootserver3 yum.repos.d]# vim /etc/yum.repos.d/docker.repo[docker]namedocker-cebaseurlhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/gpgcheck0[rootserver3 yum.repos.d]# dnf install -y docker-ce修改内核参数[rootserver3 ~]# vim /etc/sysctl.d/docker.confnet.bridge.bridge-nf-call-iptables 1net.bridge.bridge-nf-call-ip6tables 1net.ipv4.ip_forward 1[rootserver3 ~]# sysctl --system[rootserver3 ~]# systemctl enable --now docker配置docker默认仓库[rootserver3 ~]# vim /etc/docker/daemon.json{registry-mirrors: [https://reg.westos.org]}[rootserver3 ~]# systemctl restart docker拷贝仓库证书[rootdocker1 ~]# cd docker[rootdocker1 docker]# scp -r certs.d/ 192.168.164.173:/etc/docker/[rootserver3 ~]# ls /etc/docker/certs.d/reg.westos.org/ca.crt/etc/docker/certs.d/reg.westos.org/ca.crtjenkins安装ssh插件进入系统配置添加ssh主机新建docker_test项目构建后控制台查看输出安装RABC插件基于角色的访问控制Jenkins 这个插件名字就叫Role-based Authorization Strategy不直接给用户分配权限先定义角色、给角色分配权限再把用户加入角色。修改默认授权策略新建测试用户新建角色管理用户登入用户uu测试只有read权限jenkins结合ansible参数化构建server2上安装ansible新建gitlab项目克隆项目[rootserver1 ~]# git clone git192.168.164.171:root/playbook.gitCloning into playbook...remote: Enumerating objects: 3, done.remote: Counting objects: 100% (3/3), done.remote: Compressing objects: 100% (2/2), done.remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)Receiving objects: 100% (3/3), done.[rootserver1 ~]# cd playbook/[rootserver1 playbook]# vim ansible.cfg[defaults]command_warningsFalseremote_userdevops[privilege_escalation]becomeTruebecome_methodsudobecome_userrootbecome_ask_passFalse[rootserver1 inventory]# vim test[test]192.168.164.173 http_port8000[rootserver1 inventory]# vim prod[prod]192.168.164.174 http_port8080[rootserver1 inventory]# cd ..[rootserver1 playbook]# vim playbook.yaml---- hosts: alltasks:- name: install the latest version of Apacheyum:name: httpdstate: latest- name: configure apachetemplate:src: httpd.conf.j2dest: /etc/httpd/conf/httpd.confnotify: restart apache- name: Start service httpd, if not startedservice:name: httpdstate: startedenabled: yeshandlers:- name: restart apacheservice:name: httpdstate: restarted[rootserver1 playbook]# yum install -y httpd[rootserver1 playbook]# cp /etc/httpd/conf/httpd.conf .[rootserver1 playbook]# mv httpd.conf httpd.conf.j2[rootserver1 playbook]# vim httpd.conf.j2Listen {{ http_port }}推送项目[rootserver1 playbook]# git add .[rootserver1 playbook]# git status -sA ansible.cfgA httpd.conf.j2A inventory/prodA inventory/testA playbook.yaml[rootserver1 playbook]# git commit -m add playbook.yaml[main 8060206] add playbook.yaml5 files changed, 400 insertions()create mode 100644 ansible.cfgcreate mode 100644 httpd.conf.j2create mode 100644 inventory/prodcreate mode 100644 inventory/testcreate mode 100644 playbook.yaml[rootserver1 playbook]# git push -u origin mainEnumerating objects: 9, done.Counting objects: 100% (9/9), done.Delta compression using up to 4 threadsCompressing objects: 100% (6/6), done.Writing objects: 100% (8/8), 5.38 KiB | 5.38 MiB/s, done.Total 8 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)To 192.168.164.171:root/playbook.git1449385..8060206 main - mainbranch main set up to track origin/main.jenkins新建项目playbookGeneral源码管理Build Steps选择参数构建
延伸阅读

更多相关文章

2026/10/17 7:25:02

AI辅助学术写作:9款工具提升开题报告效率与质量

学术写作效率提升方案:9款人工智能工具与开题报告模板修改技巧解析每年到开题季,总能看到一批同学抱着电脑在图书馆熬到凌晨,对着屏幕上的开题报告删删改改。选题方向换来换去,文献综述写得像读书笔记流水账,研究内容拆…

2026/10/17 7:25:02

rm报错Device or resource busy?三步排查Docker目录删除占用问题

1. 为什么rm会提示“设备或资源忙”先说结论:rm在删除Docker相关目录时提示Device or resource busy,本质上是目标目录正在被某个进程或内核对象使用,而删除操作需要一个目录完全“空闲”的状态才能完成。这个报错我在实际运维中遇到过不下十…

2026/10/17 7:25:02

Jev模型:不生成文字的System One决策系统解析

1. 为什么“不生成文字”成了Jev模型最反直觉却最关键的标签?最近在几个决策系统开发群和算法产品讨论区里,反复看到有人发问:“Jev模型官网打不开?”“xcom2 commanders choice不生效是不是jev没接对?”“jev密钥怎么…

2026/10/17 11:15:17

RIS-PiDiNet替换YOLOv11主干:遥感小目标检测实战

刚把一个换上了RIS-PiDiNet主干的YOLOv11在遥感小目标数据集上完整跑完,先给结论:这套改动没有让我失望。标题里写着“CVPR 2026”“全网首发创新”,我不太想去纠结这些标签的真假,单看把像素差分卷积(Pixel Differenc…

2026/10/17 11:15:17

GLM-4.6V 9B到106B MoE迁移:vLLM推理优化与H100显存配置实战

1. 为什么"9B到106B"会让整套推理方案推倒重来 先说一个常识:很多人以为模型变大,无非是多插几张卡、把显存堆够就行。真正动手把 GLM-4.6V 从 9B 稠密版迁到 106B MoE 版之后,我发现事情完全不是这么回事。模型参数量从 9B 涨到 1…

2026/10/17 11:15:17

D3QN网络结构详解与参数量计算避坑指南

最近调一个深度强化学习模型,打印完参数量总觉得哪里不对,对着公式和数据手册核了半天,才发现是双流网络结构里优势层的输出维度写岔了。这个经历让我意识到,很多跑过D3QN的同行,其实对它的网络结构理解只停留在"…

2026/10/17 11:15:17

CSP进程代数基础:用通信顺序进程建模并发系统

我最早认真啃进程代数CSP,并不是在课堂上学得津津有味,而是在调一个并发消息组件调到怀疑人生的时候。线程、锁、条件变量堆了一整套,死锁排查靠猜,活锁靠重启,数据竞争靠同行评审。直到我把那套系统用CSP的视角重新描…

2026/10/17 11:15:17

Sora系列视频生成深度解析:提示词、镜头控制与实操避坑指南

Sora系列大概是这一两年里,视频生成赛道中被讨论最多的名字之一。它最让我感到兴奋的点,并不是单纯能靠一句话生成几十秒的视频,而是它把“视频生成”这件事从实验演示推到了可以被创作者反复打磨的工作流里。过去我们看AI视频,一…

2026/10/17 11:10:17

C#仓库管理系统完整源码解析:从架构到部署实战

简介:这是一套基于C#与.NET开发的仓库管理系统完整源代码,适用于高校毕业设计、课程设计及.NET初学者进阶练习。系统覆盖销售管理、库存管理、统计报表、日常管理、系统设置等核心业务模块,并加入换班管理、单据查询、销售分析等实用功能&…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑