CI/CD
- CI:持续集成
- CD:持续交付(部署)
git
- 基本配置
[root@localhost ~] yum install -y git
[root@localhost ~] git config --global user.name "xxx"
[root@localhost ~] git config --global user.email "xxx@tedu.cn"
[root@localhost ~] git config --global core.editor vim
[root@localhost ~] git config --list
[root@localhost ~] cat ~/.gitconfig
- git重要的工作区域
- 工作区:软件项目目录
- 暂存区:.git目录下的index,它是工作区和版本库的缓冲地带
- 版本库:工作区下面的.git目录
- 创建仓库
# 方法一:没有项目目录之前创建
[root@localhost ~] mkdir myprojects
[root@localhost ~] cd myprojects/
[root@localhost myprojects] git init mytest
初始化空的 Git 版本库于 /root/myprojects/mytest/.git/
[root@localhost myprojects] ls
mytest
[root@localhost myprojects] ls -A mytest/
.git
# 方法二:在已有项目目录中创建版本库
[root@localhost myprojects] mkdir myweb
[root@localhost myprojects] cd myweb/
[root@localhost myweb] echo '<h1>My Test Web Site</h1>' > index.html
[root@localhost myweb] cat index.html
<h1>My Test Web Site</h1>
[root@localhost myweb] git init
初始化空的 Git 版本库于 /root/myprojects/myweb/.git/
[root@localhost myweb] ls -A
.git index.html
- 文件的状态
- 未跟踪:工作区中的文件,但是既不在暂存区,也不在版本库
- 已跟踪:
- 未修改:确认至版本库后,没有改动过
- 已修改:确认至版本库后,修改过,但尚未暂存
- 已暂存:确认至版本库后,修改过,已加入暂存区
- git操作
[root@localhost myweb] cp /etc/passwd .
[root@localhost myweb] git status
# 位于分支 master
#
# 初始提交
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# index.html
# passwd
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@localhost myweb] git add index.html
[root@localhost myweb] git status
# 位于分支 master
#
# 初始提交
#
# 要提交的变更:
# (使用 "git rm --cached <file>..." 撤出暂存区)
#
# 新文件: index.html
#
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# passwd
[root@localhost myweb] git commit -m "pro init"
分支 master
# 未跟踪的文件:
# (使用 "git add <file>..." 以包含要提交的内容)
#
# passwd
提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
# 如果希望永远不要把某些文件确认至版本库,可以用.gitignore文件记录
[root@localhost myweb] echo passwd > .gitignore
[root@localhost myweb] echo '.gitignore' >> .gitignore
[root@localhost myweb] cat .gitignore
.gitignore
passwd
[root@localhost myweb] git status
# 位于分支 master
无文件要提交,干净的工作区
# 查看版本库内的文件
[root@localhost myweb] git ls-files
index.html
# 修改文件
[root@localhost myweb] echo '<h2>headline 2</h2>' >> index.html
[root@localhost myweb] git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: index.html
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
# 将工作区所有文件都暂存
[root@localhost myweb] git add .
[root@localhost myweb] git status
# 位于分支 master
# 要提交的变更:
# (使用 "git reset HEAD <file>..." 撤出暂存区)
#
# 修改: index.html
#
# 将文件撤出暂存区
[root@localhost myweb] git reset HEAD index.html
重置后撤出暂存区的变更:
M index.html
[root@localhost myweb] git status
# 位于分支 master
# 尚未暂存以备提交的变更:
# (使用 "git add <file>..." 更新要提交的内容)
# (使用 "git checkout -- <file>..." 丢弃工作区的改动)
#
# 修改: index.html
#
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
# 使用版本库中的文件覆盖工作区中的文件
[root@localhost myweb] cat index.html
<h1>My Test Web Site</h1>
<h2>headline 2</h2>
[root@localhost myweb] git checkout -- index.html
[root@localhost myweb] cat index.html
<h1>My Test Web Site</h1>
# 改名
[root@localhost myweb] cp /etc/hosts .
[root@localhost myweb] git add .
[root@localhost myweb] git commit -m "add hosts"
[root@localhost myweb] git mv hosts hosts.txt
[root@localhost myweb] git add .
[root@localhost myweb] git commit -m "mv hosts hosts.txt"
[root@localhost myweb] ls
hosts.txt index.html passwd
[root@localhost myweb] git status
# 位于分支 master
无文件要提交,干净的工作区
# 删除
[root@localhost myweb] git rm hosts.txt
rm 'hosts.txt'
[root@localhost myweb] git commit -m "rm hosts.txt"
[root@localhost myweb] ls # 工作区中没有hosts.txt
index.html passwd
[root@localhost myweb] git ls-files # 在版本库中也删除了
index.html
# 切换到以前的某个状态,找到删除的hosts.txt
[root@localhost myweb] git log
commit 83d0189faaa2d9d03d9cd787ae1a84d64cfb5fc3
Author: MrZhangzhg <zhangzhg@tedu.cn>
Date: Sat Mar 28 10:57:19 2020 +0800
rm hosts.txt
commit 3398af986b160cb245a6803330d4fafe15819c32
Author: MrZhangzhg <zhangzhg@tedu.cn>
Date: Sat Mar 28 10:56:32 2020 +0800
mv hosts hosts.txt
... ...
[root@localhost myweb] git checkout 3398af986b160cb245a6803330d4fafe15819c32
[root@localhost myweb] ls
hosts.txt index.html passwd
# 返回到最新状态
[root@localhost myweb] git checkout master
之前的 HEAD 位置是 3398af9... mv hosts hosts.txt
切换到分支 'master'
[root@localhost myweb] ls
index.html passwd
分支管理
- git有一个默认的分支叫master
- master其实就是一个指针,总是指向最新的一个提交
- 有一个名为HEAD的指针,指向某个节点
- checkout时,其实就是移动了HEAD指针
[root@localhost myweb] git checkout 3398af986b160cb245a6803330d4fafe15819c32
... ...
HEAD 目前位于 3398af9... mv hosts hosts.txt
[root@localhost myweb] git checkout master
之前的 HEAD 位置是 3398af9... mv hosts hosts.txt
切换到分支 'master'
- 创建分支
# 创建名为b1的分支
[root@localhost myweb] git branch b1
[root@localhost myweb] git branch
b1
* master # *表示当前所处分支
# 在master分支上提交代码
[root@localhost myweb] cp /etc/login.defs .
[root@localhost myweb] git add .
[root@localhost myweb] git commit -m "add login file"
[root@localhost myweb] ls
index.html login.defs passwd
# 切换到b1分支提交代码
[root@localhost myweb] git checkout b1
切换到分支 'b1'
[root@localhost myweb] git branch
* b1
master
[root@localhost myweb] ls # b1分支没有login.defs
index.html passwd
[root@localhost myweb] cp /etc/issue .
[root@localhost myweb] git add .
[root@localhost myweb] git commit -m "add issue file"
[root@localhost myweb] ls
index.html issue passwd
# b1分支的功能实现完毕后,可以回到master,将b1汇入到master
[root@localhost myweb] git checkout master
[root@localhost myweb] git merge b1 -m "merge b1 to master"
[root@localhost myweb] ls
index.html issue login.defs passwd
# 当分支完成它的功能后,可以删除它
[root@localhost myweb] git branch -d b1
已删除分支 b1(曾为 b36c6fd)。
tag管理
- tag就是标记
- 一般来说,在有重大更新时,可以为某一个提交打个标记
- 经常用于版本标记
[root@localhost myweb] git tag 1.0
[root@localhost myweb] git tag # 查看tag
1.0
[root@localhost myweb] echo '<h2>my site 2.0</h2>' >> index.html
[root@localhost myweb] git add .
[root@localhost myweb] git commit -m "my site 2.0"
[root@localhost myweb] git tag 2.0
[root@localhost myweb] git tag
1.0
2.0
gitlab服务器
-
配置要求:内存4GB以上,否则无法运行
-
安装
[root@localhost docker] rpm -ihv docker_pkgs/*
[root@localhost docker] systemctl start docker
[root@localhost docker] systemctl enable docker
- 导入镜像
[root@localhost docker] docker load -i images/gitlab_zh.tar
# 修改宿主机ssh端口号
[root@localhost docker] vim /etc/ssh/sshd_config
Port 2022
[root@localhost docker] systemctl restart sshd
# 退出再连接
[root@localhost ~] ssh -p2022 192.168.113.135
# 启动gitlab容器
[root@localhost ~] docker run -d -h gitlab --name gitlab -p 443:443 -p 22:22 -p 80:80 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab_zh:latest
[root@localhost ~] docker ps # 直到状态出现healty才可用
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
80b789ebdf6e gitlab_zh:latest "/assets/wrapper" 8 seconds ago Up 7 seconds (health: starting) 0.0.0.0:22->22/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp gitlab
gitlab应用
- 访问http://192.168.113.135
- 第一次登陆,需要为root用户创建密码。密码必须8位以上,并且符合复杂度要求。
- 登陆后,点击页面顶部的扳手图标 -> 左边栏外观 ->设置公司logo,登陆页的内容
- 在gitlab中重要的概念有:
- 用户:对应着使用gitlab服务器的用户
- 组:对应开发团队
- 项目:对应软件项目
- 创建名为devops的组,可见等级为公开
- 创建普通用户。在创建用户时不能设置密码。用户创建完成后,编辑用户可以修改其密码。
- 将用户加入到devops组中,成为主程序员。点击群组后,将用户加入组中。
- 创建名为myweb的项目,隶属于devops组,类型公开
切换用户,上传代码
- 用户首次登陆时,需要修改密码
# 切换到项目目录
[root@localhost myprojects] cd myweb/
# 查看远程仓库,没有仓库
[root@localhost myweb] git remote -v
# 添加名为origin的远程仓库,将远程url起名为origin,作为代码仓库
[root@localhost myweb] git remote add origin \
http://192.168.113.135/devops/myweb.git
# 推送本地所有分支到origin仓库
[root@localhost myweb] git push -u origin --all
Username for 'http://192.168.113.135': zzg
Password for 'http://zzg@192.168.113.135': 1234.com
# 推送tag到origin仓库
[root@localhost myweb] git push -u origin --tags
Username for 'http://192.168.113.135': zzg
Password for 'http://zzg@192.168.113.135': 1234.com
ssh免密推送代码
# 生成密钥
[root@localhost myweb] ssh-keygen
# 拷贝公钥
[root@localhost myweb] cat ~/.ssh/id_rsa.pub
# 在web页面中点击右上角的用户 -> 设置 -> 左边栏 ssh 密钥 -> 将公钥粘贴到密钥栏中。
# 修改代码上传方式为ssh免密上传
[root@localhost myweb] git remote -v
origin http://192.168.113.135/devops/myweb.git (fetch)
origin http://192.168.113.135/devops/myweb.git (push)
[root@localhost myweb] git remote remove origin
[root@localhost myweb] git remote -v # origin已删除
[root@localhost myweb] git remote add origin \
git@192.168.113.135:devops/myweb.git
[root@localhost myweb] git remote -v
origin git@192.168.113.135:devops/myweb.git (fetch)
origin git@192.168.113.135:devops/myweb.git (push)
# 上传代码测试
[root@localhost myweb] vim README.md
# gitlab server test
```python
print('Hello World!')
```
[root@localhost myweb] vim README.md
[root@localhost myweb] git add .
[root@localhost myweb] git commit -m "add readme"
[root@localhost myweb] git push