GIT常用命令和搭建GITHUB仓库
关于git的介绍推荐 https://www.liaoxuefeng.com/ 简单通俗易懂
git的中文详细介绍 https://git-scm.com/book/zh/v2 官方权威深入
几个简单的git命令
1,命令行初始化git
[root@foundation28 ~]# mkdir demo
[root@foundation28 ~]# cd demo/
[root@foundation28 demo]# ls
[root@foundation28 demo]# git init
Initialized empty Git repository in /root/demo/.git/
[root@foundation28 demo]# ls /root/demo/.git/
branches config description HEAD hooks info objects refs
2,建立测试文件
[root@foundation28 demo]# echo westos > readme.md
[root@foundation28 demo]# git status # 每一步都有提示
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# readme.md
nothing added to commit but untracked files present (use "git add" to track)
[root@foundation28 demo]# git status -s
?? readme.md
[root@foundation28 demo]# git add readme.md # 添加
[root@foundation28 demo]# git status -s
A readme.md
[root@foundation28 demo]# git commit -m "add readme.md" # 提交
初次提交会提示是否要修改全局信息
[master (root-commit) bfc2ce5] add readme.md
Committer: root <root@foundation28.ilt.example.com>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config --global user.name "Your Name"
git config --global user.email you@example.com
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
1 file changed, 1 insertion(+)
create mode 100644 readme.md
[root@foundation28 demo]# git config --global user.name "ha_weii"
[root@foundation28 demo]# git config --global user.email "zm227926019@163.com"
[root@foundation28 ~]# cat /root/.gitconfig
[user]
name = ha_weii
email = zm227926019@163.com
[root@foundation28 ~]# cd /root/demo
3,再次建立文件
[root@foundation28 demo]# vim test.txt
[root@foundation28 demo]# git status -s
?? test.txt
[root@foundation28 demo]# vim readme.md # 修改已经在仓库的文件
[root@foundation28 demo]# git status -s
M readme.md
?? test.txt
[root@foundation28 demo]# git add readme.md # 添加之后查看状态,注意对比
[root@foundation28 demo]# git status -s
M readme.md
?? test.txt
[root@foundation28 demo]# vim readme.md # 修改在缓存区的文件
[root@foundation28 demo]# git status -s
MM readme.md
?? test.txt
[root@foundation28 demo]# git add readme.md # 添加之后查看状态,注意对比
[root@foundation28 demo]# git status -s
M readme.md
?? test.txt
[root@foundation28 demo]# git add test.txt
[root@foundation28 demo]# git status -s
M readme.md
A test.txt
4,提交文件
[root@foundation28 demo]# git commit -m "add test.txt"
[master 1771ab5] add test.txt
2 files changed, 7 insertions(+)
create mode 100644 test.txt
[root@foundation28 demo]# git status -s
5,查看日志
[root@foundation28 demo]# git log
commit 1771ab51abf62795f25230523e76ee7bd32e6b29
Author: ha_weii <zm227926019@163.com>
Date: Fri Aug 24 21:34:41 2018 +0800
add test.txt
commit 892f0c53ca5b11134ecccf2da098ee8b356835d4
Author: root <root@foundation28.example.com> # 第一次会默认用当前用户和主机名
Date: Fri Aug 24 21:18:29 2018 +0800
add readme.md
[root@foundation28 demo]# git log --pretty=oneline
1771ab51abf62795f25230523e76ee7bd32e6b29 add test.txt
892f0c53ca5b11134ecccf2da098ee8b356835d4 add readme.md
6,忽略文件,忽略隐藏文件
[root@foundation28 demo]# vim .file1 # 这是一个隐藏文件
[root@foundation28 demo]# git status -s # 可以发现
?? .file1
[root@foundation28 demo]# vim .gitignore
.* # 忽略所有隐藏文件
[root@foundation28 demo]# git status -s # 没有发现
7,版本回退
[root@foundation28 demo]# vim test.txt
[root@foundation28 demo]# git add test.txt
[root@foundation28 demo]# git commit test.txt -m "update test.txt"
[master 6c094e1] update test.txt
1 file changed, 9 insertions(+)
[root@foundation28 demo]# git log
commit 6c094e1913503dca0a5e1b421735464fd708c49e
Author: ha_weii <zm227926019@163.com>
Date: Fri Aug 24 21:50:18 2018 +0800
update test.txt
commit 1771ab51abf62795f25230523e76ee7bd32e6b29
Author: ha_weii <zm227926019@163.com>
Date: Fri Aug 24 21:34:41 2018 +0800
add test.txt
commit 892f0c53ca5b11134ecccf2da098ee8b356835d4
Author: root <root@foundation28.example.com>
Date: Fri Aug 24 21:18:29 2018 +0800
add readme.md
现在我们不想升级test.txt
[root@foundation28 demo]# cat test.txt
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
[root@foundation28 demo]# git reset --hard HEAD^ # 回到上一个版本
HEAD is now at 1771ab5 add test.txt
[root@foundation28 demo]# cat test.txt
redhat
redhat
redhat
redhat
现在我们又想回到升级后的
[root@foundation28 demo]# git reset --hard 6c094e1913 # 后面是commit id 只要有这个id就可以返回,不用全部id,只要敲几位就可以了
HEAD is now at 6c094e1 update test.txt
[root@foundation28 demo]# cat test.txt
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
redhat
8,reflog记录了所有的执行git的指令
[root@foundation28 demo]# git reflog
6c094e1 HEAD@{0}: reset: moving to 6c094e1913
1771ab5 HEAD@{1}: reset: moving to HEAD^
6c094e1 HEAD@{2}: commit: update test.txt
1771ab5 HEAD@{3}: commit: add test.txt
892f0c5 HEAD@{4}: commit (initial): add readme.md
9,其他常用指令
[root@foundation28 demo]# git checkout -- test.txt # 取消修改test.txt文件,对于还未添加的
[root@foundation28 demo]# git rm test.txt # 删除文件,如果本地存在,需要-f强行删除
error: 'test.txt' has local modifications
(use --cached to keep the file, or -f to force removal)
[root@foundation28 demo]# git rm -f test.txt
rm 'test.txt'
[root@foundation28 demo]# ls
readme.md
[root@foundation28 demo]# rm -rf readme.md # 删除本地文件,撤销操作
[root@foundation28 demo]# git checkout -- readme.md
[root@foundation28 demo]# ls
readme.md
GITHUB
1,注册用户,创建仓库,由于我们已经在本地初始化过,这里不要点击初始化仓库,已有的本地仓库名和这里的仓库名对应,如果不一样,那么github会另外建立一个
2,使用SSH keys的方法连接本地和github仓库
右上角的setting>SSH and GPG keys,添加新的ssh key
[root@foundation28 demo]# cat /root/.ssh/id_rsa.pub 把公钥上传
我们已经初始化过git,选择第三种方法
[root@foundation28 demo]# git remote add origin git@github.com:ha-weii/demo.git
[root@foundation28 demo]# git push -u origin master
The authenticity of host 'github.com (13.250.177.223)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,13.250.177.223' (RSA) to the list of known hosts.
Counting objects: 10, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (10/10), 746 bytes | 0 bytes/s, done.
Total 10 (delta 0), reused 0 (delta 0)
To git@github.com:ha-weii/demo.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
上传完毕!!!github上可以直接看到
3,本地修改文件并上传流程
[root@foundation28 demo]# vim readme.md
[root@foundation28 demo]# git add readme.md
[root@foundation28 demo]# git commit -m "update readme.md"
[master 9b5707e] update readme.md
2 files changed, 1 insertion(+), 16 deletions(-)
delete mode 100644 test.txt
[root@foundation28 demo]# git push -u origin master
Warning: Permanently added the RSA host key for IP address '52.74.223.119' to the list of known hosts.
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (1/1), done.
Writing objects: 100% (3/3), 262 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:ha-weii/demo.git
6c094e1..9b5707e master -> master
Branch master set up to track remote branch master from origin.
4,在github上直接编辑,然后pull代码(自动合并)
[root@foundation28 demo]# git pull origin master
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), done.
From github.com:ha-weii/demo
9b5707e..26524a6 master -> origin/master
Updating 9b5707e..26524a6
Fast-forward
test1.txt | 3 +++
1 file changed, 3 insertions(+)
create mode 100644 test1.txt
[root@foundation28 demo]# ls
readme.md test1.txt
GITLAB
https://about.gitlab.com/installation/ 官网安装说明
server1:172.25.28.1 与外网连通
1,安装软件,开启postfix
[root@server1 ~]# ls
gitlab-ce-11.2.0-ce.0.el7.x86_64.rpm
[root@server1 ~]# yum install -y gitlab-ce-11.2.0-ce.0.el7.x86_64.rpm
[root@server1 ~]# yum install -y net-tools
2,修改配置文件,重新加载
这里是gitlab主机的ip
[root@server1 ~]# gitlab-ctl reconfigure # 时间很长...
[root@server1 ~]# gitlab-ctl restart
3,浏览器访问上面设置的ip
修改密码之后用root登录
4,创建一个demo测试
这里需要勾选初始化
5,选择配置SSH key
右上角setttings>SSH keys
[root@foundation28 ~]# cat /root/.ssh/id_rsa.pub # 添加公钥
6,初始化,克隆git,上面选择了初始化,我们克隆下来就包含初始化,并在当前目录创建一个demo目录(由于之前我们创建了gitlhub的demo,所以github的demo目录要删除,或者克隆时换一个目录不要和github的在一个目录,最好删除,以免和后面实验混淆)
[root@foundation28 ~]# rm -rf demo/
[root@foundation28 ~]# git clone git@172.25.28.1:root/demo.git
Cloning into 'demo'...
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
be:7b:73:fb:1d:0b:06:fb:b3:c2:cf:d8:a8:2d:d1:96.
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending RSA key in /root/.ssh/known_hosts:1
RSA host key for 172.25.28.1 has changed and you have requested strict checking.
Host key verification failed.
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
[root@foundation28 ~]# rm -rf /root/.ssh/known_hosts
[root@foundation28 ~]# git clone git@172.25.28.1:root/demo.git
Cloning into 'demo'...
The authenticity of host '172.25.28.1 (172.25.28.1)' can't be established.
ECDSA key fingerprint is d5:88:51:fb:9c:6c:bd:67:27:cf:d4:dc:85:ac:63:ba.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.25.28.1' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
克隆成功!!!
[root@foundation28 ~]# ls -a demo/
. .. .git README.md
并且自动添加远程git到本地,不用像github那样手动添加
7,测试gitlab
[root@foundation28 ~]# cd /root/demo/
[root@foundation28 demo]# ls
README.md
[root@foundation28 demo]# vim README.md
[root@foundation28 demo]# git add README.md
[root@foundation28 demo]# git commit -m "update README.md"
[master 7ef14d8] update README.md
1 file changed, 2 insertions(+), 1 deletion(-)
[root@foundation28 demo]# git push origin master
Counting objects: 5, done.
Writing objects: 100% (3/3), 277 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@172.25.28.1:root/demo.git
191613e..7ef14d8 master -> master
测试成功!!!
JENKINS
server2:172.25.28.2 与外网连通
1,安装java环境jdk,jenkins软件,启动jenkins
[root@server2 ~]# ls
jdk-8u171-linux-x64.rpm jenkins-2.121.3-1.1.noarch.rpm
[root@server2 ~]# yum install -y jdk-8u171-linux-x64.rpm jenkins-2.121.3-1.1.noarch.rpm
[root@server2 ~]# yum install -y git
[root@server2 ~]# systemctl start jenkins
2,浏览器访问虚拟机ip:8080(jenkins暴露的8080端口),初始化配置密码
3,安装插件
可以根据需要(新手安装推荐)
JINKENS实验一:构建每分钟一个触发
1,新建一个任务,与gitlab连动
添加凭据
选择添加
[root@foundation28 ~]# cat /root/.ssh/id_rsa
等待报错消失
构建触发器,和crotable类似,这里我们设置每分钟触发一次
构建,采用shell,命令随意
保存之后,就开始触发了,每分钟执行一次项目,也可以手动点击立即构建
点击查看输出
2,修改本地gitlab的demo目录下的文件,查看jenkins的变化
[root@foundation28 ~]# cd /root/demo/
[root@foundation28 demo]# ls
README.md
[root@foundation28 demo]# vim README.md
[root@foundation28 demo]# echo hello jenkins > test.txt
[root@foundation28 demo]# git add test.txt
[root@foundation28 demo]# git add README.md
[root@foundation28 demo]# git commit -m "add test.txt"
[master e419c1f] add test.txt
2 files changed, 1 insertion(+), 1 deletion(-)
create mode 100644 test.txt
[root@foundation28 demo]# git push origin master
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (4/4), 317 bytes | 0 bytes/s, done.
Total 4 (delta 0), reused 0 (delta 0)
To git@172.25.28.1:root/demo.git
7ef14d8..e419c1f master -> master
3,浏览器查看,我们添加了两次,所以有两个#2 #3
JENKINS实验二:即时触发
1,在插件管理中安装gitlab和gitlab hook插件
2,修改testjob项目
去掉轮询
构建触发器
点击Generate获取,token后面备用,URL后面备用
在gitlab获取
[root@server2 ~]# curl -X PUT --header "PRIVATE-TOKEN: PEGbSu_Yg6Brg7ZPArYq" 'http://172.25.28.1/api/v4/application/settings?allow_local_requests_from_hooks_and_services=true'
在gitlab:demo>settings>integrations
点击添加(URL和TOKEN是在jenkins里面生成的)
测试:点击右下角的test,测试push event,如果出现200提示,说明成功
真机测试:
[root@foundation28 demo]# vim test.txt
[root@foundation28 demo]# git add test.txt
[root@foundation28 demo]# git commit -m "update test.txt"
[master f7b7498] update test.txt
1 file changed, 3 insertions(+)
[root@foundation28 demo]# git push origin master
Counting objects: 5, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 292 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@172.25.28.1:root/demo.git
e419c1f..f7b7498 master -> master
jenkins立即检测到
jenkins+gitlab+docker综合案例
git -> Dockerfile -> gitlab -> jenkins -> docker plugin -> build image -> push registry -> docker run
测试一:开启一个nginx容器做测试,测试是否可以通过jenkins关闭nginx容器,作为综合案例运行docker用
1,jenkins安装docker插件
注意:插件一次安装不上继续安装,有时候要两三次才可以安装成功!!!
2,安装docker软件
docker-engine-17.03.1.ce-1.el7.centos.x86_64.rpm container-selinux-2.9-4.el7.noarch.rpm
3,导入rhel7.tar,nginx.tar
docker load -i rhel7.tar
docker load -i nginx.tar
开启一个nginx容器
4,注意必须给jenkins权限执行docker
visudo
4,创建一个dockerjob
如果在控制自台出现如下报错
sudo: sorry, you must have a tty to run sudo
在visudo时注释 Default requiretty 一行
5,点击开始构建,构建成功,查看nginx的状态
[root@server2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4338fdd3e9b3 nginx "nginx -g 'daemon ..." About a minute ago Exited (0) 10 seconds ago vm1
测试二:提交Dockerfile后自动构建镜像
1,testjob在之前的测试中已经做好了即使触发,现在添加docker构建功能
2,修改/var/run/docker.sock的权限为777
3,提交Dockerfile和编译所需文件
[root@foundation28 demo]# cat Dockerfile
FROM rhel7
EXPOSE 80
COPY dvd.repo /etc/yum.repos.d/dvd.repo
RUN rpmdb --rebuilddb && yum install -y httpd && yum clean all
COPY index.html /var/www/html
CMD ["/usr/sbin/httpd","-D","FOREGROUND"]
[root@foundation28 demo]# cat dvd.repo
[dvd]
name=dvd
baseurl=http://172.25.28.250/source7.3
gpgcheck=0
[root@foundation28 demo]# cat index.html
<h1>www.westos.org</h1>
<h1>www.westos.org</h1>
(经过测试可以构建出新的镜像)
[root@foundation28 demo]# git add Dockerfile dvd.repo index.html
[root@foundation28 demo]# git commit -m "add Dockerfile&dvd.repo$index.html"
[root@foundation28 demo]# git push origin master
4,产生触发#11
JenKins构建成功
查看镜像,TAG就是我们之前定义的${BUILD_NUMBER},并且rhel7镜像的版本标记为11和lastest实际上是一样的,会自动修改标签
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 11 709915d668ec About a minute ago 169 MB
rhel7 latest 709915d668ec About a minute ago 169 MB
5,测试构建的镜像
[root@server2 ~]# docker run -d --name vm1 rhel7
5e29d5f9ec7b693f3d72bc777f924c53be599c2ec460442659f2674f69f4fa07
[root@server2 ~]# curl 172.17.0.2 (没有做端口映射)
成功!!!
测试三:整合dockerjob和testjob
1,修改dockerjob
只要testjob(即时检测)检测到提交了代码,就开始创建一个镜像,dockerjob就触发创建并且运行一个容器实例
2,测试,修改index.html,提交触发testjob和dockerjob
[root@foundation28 demo]# vim index.html
[root@foundation28 demo]# git add index.html
[root@foundation28 demo]# git commit -m "update index.html"
[master 2780ef2] update index.html
1 file changed, 2 insertions(+)
[root@foundation28 demo]# git push origin master
成功!!!
3,查看触发结果
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rhel7 13 5d363e4a028c 8 minutes ago 185 MB
rhel7 latest 5d363e4a028c 8 minutes ago 185 MB
[root@server2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f64ee098da00 rhel7 "/usr/sbin/httpd -..." 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp apache
综合案例:
1,修改dockerjob
2,修改本地代码提交触发
[root@foundation28 demo]# vim index.html
[root@foundation28 demo]# git add index.html
[root@foundation28 demo]# git commit -m "update index.html"
[master 7134c17] update index.html
1 file changed, 3 insertions(+), 3 deletions(-)
[root@foundation28 demo]# git push origin master
3,创建本地仓库,push镜像测试
[root@server2 ~]# docker load -i registry-2.3.1.tar
# 如果没有tar包,可以用pull在网上拉取
[root@server2 ~]# docker run -d --name registry -p 5000:5000 registry:2.3.1
34fc5afff47f2f38917f010496d50e640554c6403cf77a5c5da1ff49fc91df24
[root@server2 ~]# docker tag nginx:latest localhost:5000/nginx
[root@server2 ~]# docker push localhost:5000/nginx
成功!!!
3,添加仓库到testjob,开启自动push镜像功能
4,修改本地文件,提交触发
[root@foundation28 demo]# vim index.html
[root@foundation28 demo]# git add index.html
[root@foundation28 demo]# git commit -m "update index.html"
[master b19408f] update index.html
1 file changed, 4 insertions(+)
[root@foundation28 demo]# git push origin master
JenKins成功检测并触发!!!
5,查看镜像
[root@server2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost:5000/rhel7 16 56f85075bee2 4 minutes ago 208 MB
localhost:5000/rhel7 latest 56f85075bee2 4 minutes ago 208 MB
6,修改dockerjob
上传到本地仓库之后,会自动修改名字为localhost:5000/rhel7,所以在执行的shell里面也要进行修改,否则rhel7是本地镜像,而不是本地仓库的镜像。
至此,从编写Dockerfile,提交文件到gitlab上,然后gitlab被jenkins的testjob源码管理模板即时检测到,然后通过jenkins的docker插件构建已上传到gitlab的代码为为一个镜像,同时上传到本地仓库,dockerjob在testjob完成之后触发,开始执行shell,创建一个容器实例就结束啦