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
选择参数构建