☰
Git 与 GitLab、Jenkins 自动化部署实战指南
2026/10/17 7:29:59 网站建设 项目流程

git使用

[root@server1 ~]# yum install -y git

[root@server1 ~]# mkdir demo
[root@server1 ~]# cd demo/
[root@server1 demo]# git init
hint: Using 'master' as the name for the initial branch. This default branch name
hint: will change to "main" in Git 3.0. To configure the initial branch name
hint: to use in all of your new repositories, which will suppress this warning,
hint: call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
hint:
hint: Disable this message with "git config set advice.defaultBranchName false"
Initialized empty Git repository in /root/demo/.git/
[root@server1 demo]# git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)
[root@server1 demo]# git status -s
[root@server1 demo]# echo test > README.md
[root@server1 demo]#
[root@server1 demo]# ls
README.md
[root@server1 demo]# git status -s
?? README.md
[root@server1 demo]# git add README.md
[root@server1 demo]# git status -s
A README.md
[root@server1 demo]# git config --global user.email "user_uu@westos.org"
[root@server1 demo]# git config --global user.name "user_uu"
[root@server1 demo]# git commit -m "add README.md"
[master (root-commit) fc209da] add README.md
1 file changed, 1 insertion(+)
create mode 100644 README.md
[root@server1 demo]# echo hello >> README.md
[root@server1 demo]# git status -s
M README.md
[root@server1 demo]# git add README.md
[root@server1 demo]# git status -s
M README.md
[root@server1 demo]# echo world >> README.md
[root@server1 demo]# git status -s
MM README.md
[root@server1 demo]# git commit -m "v1"
[master 6c356af] v1
1 file changed, 1 insertion(+)
[root@server1 demo]# git status -s
M README.md
[root@server1 demo]# git add .
[root@server1 demo]# git status -s
M README.md
[root@server1 demo]# git commit -m "v2"
[master 31e4e11] v2
1 file changed, 1 insertion(+)
[root@server1 demo]# git status -s

查看日志
[root@server1 demo]# git reflog
31e4e11 (HEAD -> master) HEAD@{0}: commit: v2
6c356af HEAD@{1}: commit: v1
fc209da HEAD@{2}: commit (initial): add README.md

更详细地查看
[root@server1 demo]# git log --oneline

忽略隐藏文件

[root@server1 demo]# touch .a
[root@server1 demo]#
[root@server1 demo]# git status -s
?? .a
[root@server1 demo]# vim .gitignore

[root@server1 demo]# cat .gitignore
.*
[root@server1 demo]# git status -s
[root@server1 demo]# echo helloworld > test.txt
[root@server1 demo]# git add test.txt
[root@server1 demo]# git commit -m "add test.txt"
[master ac4b79d] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt

撤销文件修改

[root@server1 demo]# rm -f test.txt
[root@server1 demo]# git status -s
D test.txt
[root@server1 demo]# git checkout -- test.txt

取消暂存区文件

[root@server1 demo]# git rm test.txt
rm 'test.txt'
[root@server1 demo]# git status -s
D test.txt
[root@server1 demo]# git reset HEAD test.txt
Unstaged changes after reset:
D test.txt
[root@server1 demo]# git status -s
D test.txt
[root@server1 demo]# git checkout -- test.txt

版本回退

[root@server1 demo]# git rm test.txt
rm 'test.txt'
[root@server1 demo]# git commit -m "delete test.txt"
[master 7b3bb7e] delete test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
[root@server1 demo]# git reflog
7b3bb7e (HEAD -> master) HEAD@{0}: commit: delete test.txt
ac4b79d HEAD@{1}: commit: add test.txt
31e4e11 HEAD@{2}: commit: v2
6c356af HEAD@{3}: commit: v1
fc209da HEAD@{4}: commit (initial): add README.md
[root@server1 demo]# git reset --hard ac4b79d
HEAD is now at ac4b79d add test.txt

注意log不能查看,而reflog中保存有记录

[root@server1 demo]# git log --oneline
ac4b79d (HEAD -> master) add test.txt
31e4e11 v2
6c356af v1
fc209da add README.md

gitee远程代码仓库

上传公钥

[root@server1 ~]# ssh-keygen

[root@server1 ~]# cd .ssh
[root@server1 .ssh]# ls
id_rsa id_rsa.pub
[root@server1 .ssh]# cat id_rsa.pub

测试连通性(Rocky 虚拟机执行)

首次连接会提示主机指纹,输入yes,出现欢迎文字代表 ssh 认证成功

[root@server1 ~]# ssh -T git@gitee.com

新建仓库

按照gitee建议设置git全局

[root@server1 ~]# cd demo

[root@server1 demo]# git config --global user.name "uu"
[root@server1 demo]# git config --global user.email "17456376+uu_2026@user.noreply.gitee.com"

删除旧# origin git remote remove origin

添加gitee远程# git remote add origin git@gitee.com:uu_2026/demo.git

查看远程确认# git remote -v

推送master分支# git push -u origin "master"

测试克隆仓库

[root@server1 demo]# cd
[root@server1 ~]# rm -fr demo
[root@server1 ~]# git clone git@gitee.com:uu_2026/demo.git
Cloning 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.
[root@server1 ~]# cd demo
[root@server1 demo]# ls
README.md test.txt

gitlab部署

rocky9虚拟机最小需求:8G内存

Index of /gitlab-ce/yum/el9/Packages/g/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

安装依赖

[root@server1 ~]# dnf install -y curl policycoreutils-python-utils openssh-server perl

安装本地 gitlab rpm 包

[root@server1 ~]# dnf install -y gitlab-ce-18.11.12-ce.0.el9.x86_64.rpm

修改 GitLab 配置文件 gitlab.rb

[root@server1 ~]# vim /etc/gitlab/gitlab.rb

external_url 'http://192.168.164.171

重新配置并初始化 gitLab

[root@server1 ~]# gitlab-ctl reconfigure

查看初始 root 密码:密码文件24 小时后自动删除

[root@server1 ~]# cat /etc/gitlab/initial_root_password

查看 GitLab 所有组件状态,所有服务全部显示run代表正常。

[root@server1 ~]# gitlab-ctl status

浏览器访问 + 登录

浏览器打开:http://192.168.164.171,登录后立刻修改 root 密码,初始密码 24h 过期,改成简体中文

新建项目

添加密钥

测试连通性

[root@server1 ~]# ssh -T git@192.168.164.171

克隆项目

[root@server1 ~]# git clone git@192.168.164.171:root/demo.git
Cloning 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.
[root@server1 ~]# ls
demo
[root@server1 ~]# cd demo/
[root@server1 demo]# echo www.westos.org > index.html
[root@server1 demo]# ls
README.md index.html
[root@server1 demo]# git add index.html
[root@server1 demo]# git commit -m "add index.html"
[main eeb0cd4] add index.html
1 file changed, 1 insertion(+)
create mode 100644 index.html

[root@server1 demo]# git push -u origin main
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 4 threads
Compressing 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.git
8785cab..eeb0cd4 main -> main
branch 'main' set up to track 'origin/main'.

jenkins部署

官网:Linux

注意另开一台虚拟机

[root@server1 ~]# dnf install java-21-openjdk-devel -y

[root@server1 ~]# yum install -y fontconfig

[root@server1 ~]# ls
jenkins-2.580.1-1.noarch.rpm
[root@server1 ~]# rpm -ivh jenkins-2.580.1-1.noarch.rpm
warning: jenkins-2.580.1-1.noarch.rpm: Header V4 RSA/SHA512 Signature, key ID 14abfc68: NOKEY
Verifying... ################################# [100%]
Preparing... ################################# [100%]
Updating / installing...
1:jenkins-2.580.1-1 ################################# [100%]

启动服务

[root@server2 ~]# systemctl enable --now jenkins.service
Created symlink /etc/systemd/system/multi-user.target.wants/jenkins.service → /usr/lib/systemd/system/jenkins.service.
[root@server2 ~]# netstat -antlp|grep :8080
tcp6 0 0 :::8080 :::* LISTEN 12904/java

登录192.168.164.172:8080

[root@server2 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
e5e158591df04549adbefb247a3243e7

替换国内插件源

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

[root@server2 ~]# cat /etc/password

[root@server2 ~]# usermod -s /bin/bash jenkins
[root@server2 ~]# su - jenkins

[jenkins@server2 ~]$ pwd
/var/lib/jenkins
[jenkins@server2 ~]$ ssh-keygen

[jenkins@server2 ~]$ cd .ssh/
[jenkins@server2 .ssh]$ ls
id_rsa id_rsa.pub
[jenkins@server2 .ssh]$ cat id_rsa.pub

将公钥上传到gitlab

私钥上传到jenkins

[root@server2 ~]# vim /etc/ssh/ssh_config

Include /etc/ssh/ssh_config.d/*.conf
Host *
StrictHostKeyChecking no

查看控制台输出

安装插件Gitlab

设置项目Triggers,注意URL用于gitlab中的URL

生成Secret token,用于gitlab中的secret令牌

设置项目中的webhooks

打开webhooks出站请求

测试推送,返回绿色200通信成功

触发自动构建

自动化构建docker镜像

在server2上安装docker-ce

[root@server2 ~]# cd /etc/yum.repos.d/

[root@server2 yum.repos.d]# vim /etc/yum.repos.d/docker.repo

[docker]
name=docker-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0

[root@server2 yum.repos.d]# dnf install -y docker-ce

修改内核参数

[root@server2 ~]# vim /etc/sysctl.d/docker.conf

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
[root@server2 ~]# sysctl --system

[root@server2 ~]# systemctl enable --now docker

配置docker默认仓库

[root@server2 ~]# vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://reg.westos.org"]
}

[root@server2 ~]# systemctl restart docker

拷贝仓库证书

[root@docker1 ~]# cd docker
[root@docker1 docker]# scp -r certs.d/ 192.168.164.172:/etc/docker/

[root@server2 ~]# ls /etc/docker/certs.d/reg.westos.org/ca.crt
/etc/docker/certs.d/reg.westos.org/ca.crt

注意添加解析

登录私有harbor仓库

[root@server2]# docker login reg.westos.org

测试

[root@server2 ~]# docker pull reg.westos.org/nginx/nginx:1.29

安装CloudBees Docker Build and Publish插件

配置项目构建

注意取消勾选Force Pull

在server1上提交Dockerfile

[root@server1 ~]# cd demo
[root@server1 demo]# vim Dockerfile

FROM nginx
COPY index.html /usr/share/nginx/html
[root@server1 demo]# git status -s
?? Dockerfile
[root@server1 demo]# git add Dockerfile
[root@server1 demo]# git commit -m "add Dockerfile"
[main a1d22b2] add Dockerfile
1 file changed, 3 insertions(+)
create mode 100644 Dockerfile
[root@server1 demo]# git push -u origin main

此时gitlab会主动触发jenkins构建任务,观察jenkins的任务输出,注意这是报错权限不足

将jenkins系统用户加入docker组即可

[root@server2 ~]# usermod -aG docker jenkins
[root@server2 ~]# systemctl restart jenkins
[root@server2 ~]# id jenkins
uid=993(jenkins) gid=993(jenkins) groups=993(jenkins),992(docker)

通过ssh插件交付任务

在server3上安装docker-ce

[root@server3 ~]# cd /etc/yum.repos.d/

[root@server3 yum.repos.d]# vim /etc/yum.repos.d/docker.repo

[docker]
name=docker-ce
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0

[root@server3 yum.repos.d]# dnf install -y docker-ce

修改内核参数

[root@server3 ~]# vim /etc/sysctl.d/docker.conf

net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
[root@server3 ~]# sysctl --system

[root@server3 ~]# systemctl enable --now docker

配置docker默认仓库

[root@server3 ~]# vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://reg.westos.org"]
}

[root@server3 ~]# systemctl restart docker

拷贝仓库证书

[root@docker1 ~]# cd docker
[root@docker1 docker]# scp -r certs.d/ 192.168.164.173:/etc/docker/

[root@server3 ~]# ls /etc/docker/certs.d/reg.westos.org/ca.crt
/etc/docker/certs.d/reg.westos.org/ca.crt

jenkins安装ssh插件

进入系统配置,添加ssh主机

新建docker_test项目

构建后控制台查看输出

安装RABC插件

基于角色的访问控制,Jenkins 这个插件名字就叫Role-based Authorization Strategy

不直接给用户分配权限,先定义角色、给角色分配权限,再把用户加入角色。

修改默认授权策略

新建测试用户

新建角色

管理用户

登入用户uu,测试只有read权限

jenkins结合ansible参数化构建

server2上安装ansible

新建gitlab项目

克隆项目

[root@server1 ~]# git clone git@192.168.164.171:root/playbook.git
Cloning 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.
[root@server1 ~]# cd playbook/
[root@server1 playbook]# vim ansible.cfg

[defaults]
command_warnings=False
remote_user=devops

[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False

[root@server1 inventory]# vim test

[test]
192.168.164.173 http_port=8000

[root@server1 inventory]# vim prod

[prod]
192.168.164.174 http_port=8080

[root@server1 inventory]# cd ..
[root@server1 playbook]# vim playbook.yaml

---
- hosts: all
tasks:
- name: install the latest version of Apache
yum:
name: httpd
state: latest

- name: configure apache
template:
src: httpd.conf.j2
dest: /etc/httpd/conf/httpd.conf
notify: restart apache

- name: Start service httpd, if not started
service:
name: httpd
state: started
enabled: yes

handlers:
- name: restart apache
service:
name: httpd
state: restarted

[root@server1 playbook]# yum install -y httpd

[root@server1 playbook]# cp /etc/httpd/conf/httpd.conf .
[root@server1 playbook]# mv httpd.conf httpd.conf.j2
[root@server1 playbook]# vim httpd.conf.j2

Listen {{ http_port }}

推送项目

[root@server1 playbook]# git add .
[root@server1 playbook]# git status -s
A ansible.cfg
A httpd.conf.j2
A inventory/prod
A inventory/test
A playbook.yaml
[root@server1 playbook]# git commit -m "add playbook.yaml"
[main 8060206] add playbook.yaml
5 files changed, 400 insertions(+)
create mode 100644 ansible.cfg
create mode 100644 httpd.conf.j2
create mode 100644 inventory/prod
create mode 100644 inventory/test
create mode 100644 playbook.yaml
[root@server1 playbook]# git push -u origin main
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 4 threads
Compressing 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.git
1449385..8060206 main -> main
branch 'main' set up to track 'origin/main'.

jenkins新建项目playbook

General

源码管理

Build Steps

选择参数构建

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询