git持续集成自动化部
Git特点
分布式的版本控制系统
yum安装:
yum install git
简单配置
[root@js-212 /]# git config --global user.name "ryan.yang" [root@js-212 /]# git config --global user.email "11066986@qq.com" [root@js-212 /]# git config --global color.ui true #配置颜色 [root@js-212 /]# git config --list user.name=ryan.yang user.email=11066986@qq.com color.ui=true
版本库创建以及配合github上传代码
创建版本库:
[root@js-212 opt]# mkdir gittest [root@js-212 opt]# cd gittest/ [root@js-212 gittest]# git init Initialized empty Git repository in /opt/gittest/.git/
简单添加文件与提交:
[root@js-212 gittest]# cat readme.txt 1 hello [root@js-212 gittest]# git status # On branch master # # Initial commit # # Untracked files: # (use "git add <file>..." to include in what will be committed) # # readme.txt nothing added to commit but untracked files present (use "git add" to track) [root@js-212 gittest]# git add readme.txt #添加 [root@js-212 gittest]# git status # On branch master # # Initial commit # # Changes to be committed: # (use "git rm --cached <file>..." to unstage) # # new file: readme.txt # [root@js-212 gittest]# git commit -m "the first commit" #提交 [master (root-commit) 4cd2910] the first commit 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 readme.txt [root@js-212 gittest]# git status # On branch master nothing to commit (working directory clean)
[root@js-212 gittest]# cat deploy.sh #!/bin/bash echo hello [root@js-212 gittest]# git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # deploy.sh nothing added to commit but untracked files present (use "git add" to track) [root@js-212 gittest]# git add deploy.sh [root@js-212 gittest]# git commit -m "2th commit" [master 5a815ba] 2th commit 1 files changed, 2 insertions(+), 0 deletions(-) create mode 100644 deploy.sh [root@js-212 gittest]# ll total 8 -rw-r--r-- 1 root root 23 Jun 16 11:21 deploy.sh -rw-r--r-- 1 root root 8 Jun 16 11:09 readme.txt [root@js-212 gittest]# git log commit 5a815ba91acdaef47356e495869d7d42b2aed906 Author: ryan.yang <11066986@qq.com> Date: Fri Jun 16 11:21:58 2017 +0800 2th commit commit 4cd29106e3b127e176bc8ef27635d677bd183dc2 Author: ryan.yang <11066986@qq.com> Date: Fri Jun 16 11:12:28 2017 +0800 the first commit 修改readme.txt的内容,并查看状态,并对比。 [root@js-212 gittest]# cat readme.txt 1 hello 2 word [root@js-212 gittest]# git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: readme.txt # no changes added to commit (use "git add" and/or "git commit -a") [root@js-212 gittest]# git diff readme.txt diff --git a/readme.txt b/readme.txt index b976562..7e62c88 100644 --- a/readme.txt +++ b/readme.txt @@ -1 +1,2 @@ 1 hello +2 word [root@js-212 gittest]# git add readme.txt [root@js-212 gittest]# git commit -m "add 2word" [master af6104c] add 2word 1 files changed, 1 insertions(+), 0 deletions(-) [root@js-212 gittest]# git log commit af6104c8a8f65d08c23f4e3a16ab7fed54e58e27 Author: ryan.yang <11066986@qq.com> Date: Fri Jun 16 11:25:28 2017 +0800 add 2word commit 5a815ba91acdaef47356e495869d7d42b2aed906 Author: ryan.yang <11066986@qq.com> Date: Fri Jun 16 11:21:58 2017 +0800 2th commit commit 4cd29106e3b127e176bc8ef27635d677bd183dc2 Author: ryan.yang <11066986@qq.com> Date: Fri Jun 16 11:12:28 2017 +0800 the first commit
版本回滚
[root@js-212 gittest]# git reset --hard HEAD^ #回滚,HEAD表示前面,^ 表示回滚一个版本,^^表示回滚两个版本。 [root@js-212 gittest]# cat readme.txt 1 hello 指定版本回滚: [root@js-212 gittest]# git reflog #查看各个版本的序列号 5a815ba HEAD@{0}: HEAD^: updating HEAD af6104c HEAD@{1}: commit: add 2word 5a815ba HEAD@{2}: commit: 2th commit 4cd2910 HEAD@{3}: commit (initial): the first commit You have mail in /var/spool/mail/root [root@js-212 gittest]# git reset --hard 4cd2910 #加上版本的序列号,指定回滚到某个版本 HEAD is now at 4cd2910 the first commit [root@js-212 gittest]# ll total 4 -rw-r--r-- 1 root root 8 Jun 16 11:28 readme.txt [root@js-212 gittest]# git reflog 5a815ba HEAD@{0}: 5a815ba: updating HEAD 4cd2910 HEAD@{1}: 4cd2910: updating HEAD 5a815ba HEAD@{2}: HEAD^: updating HEAD af6104c HEAD@{3}: commit: add 2word 5a815ba HEAD@{4}: commit: 2th commit [root@js-212 gittest]# git reset --hard af6104c #回滚到之前回滚之前的的版本。 HEAD is now at af6104c add 2word [root@js-212 gittest]# ll total 8 -rw-r--r-- 1 root root 23 Jun 16 11:32 deploy.sh -rw-r--r-- 1 root root 15 Jun 16 11:34 readme.txt [root@js-212 gittest]# cat deploy.sh #!/bin/bash echo hello [root@js-212 gittest]# cat readme.txt 1 hello 2 word
注:只要add 则全部提交,如果修改了文件,如果没有add 那么则不会commit。
在修改文件,但是没有提交之前,可以通过checkout回到修改之前的文件内容:
[root@js-212 gittest]# cat readme.txt 1 hello 2 hello word [root@js-212 gittest]# vi readme.txt [root@js-212 gittest]# cat readme.txt 1 hello 2 hello word 3 every is sunday [root@js-212 gittest]# git checkout -- readme.txt [root@js-212 gittest]# cat readme.txt 1 hello 2 hello word
与github.com 连用
在github上面创建账户,然后创建项目以后;要在github上面添加一个ssh 的key
[root@js-212 gittest]# ssh-keygen -t rsa [root@js-212 gittest]# cat /root/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAxouCEuwIY0ukH8Kc7WwtZBo1uvYLHFVE9gy0YTAAj48pl+oawZ/J0QB4ap2iTqf2gprUFIm09IIdm+G+xKX5bPTxGdIihTM0Z+rCiqezSqlo66ASctPafzNij+2LrLUhXY4WOOyknDYChnyH8gy5rTUOiShpr8bePyus35HmIqZhDafnHu8dlqY1KwYy4taS24VQCpzTNS+jp+6Rl9OQrM1BFx/ojk0mmGvT9XyWVpzirpz0eotyahGgtW7Sxjo3t9k00FOQI7xCaRE0uXZXpoyLDeT+IRDud+c7ce8c+kgDaI6RFBwQcW6KxuNUghkQGvyB6hbExcd4jZL5Kl+hLQ== root@Tets-360iii 把上面的key复制到 githb的 setting的ssh key里面 [root@js-212 gittest]# git remote add origin git@github.com:ryan-yang-2049/demo.git [root@js-212 gittest]# cat deploy.sh .git/ readme.txt [root@js-212 gittest]# cat .git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = git@github.com:ryan-yang-2049/demo.git fetch = +refs/heads/*:refs/remotes/origin/*
先把github 上面的工程的内容pull下来,然后在把本地的push上去
[root@js-212 gittest]# git pull origin master From github.com:ryan-yang-2049/demo * branch master -> FETCH_HEAD Merge made by recursive. .gitignore | 101 ++++++++++++++++++++++++++++++ LICENSE | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 302 insertions(+), 0 deletions(-) create mode 100644 .gitignore create mode 100644 LICENSE [root@js-212 gittest]# ls -a . .. deploy.sh .git .gitignore LICENSE readme.txt [root@js-212 gittest]# git push -u origin master Counting objects: 12, done. Delta compression using up to 8 threads. Compressing objects: 100% (7/7), done. Writing objects: 100% (11/11), 1.07 KiB, done. Total 11 (delta 0), reused 0 (delta 0) To git@github.com:ryan-yang-2049/demo.git 3e5efce..8759869 master -> master Branch master set up to track remote branch master from origin.
红色方框就是本地写的东西。
如果在别的目录和机器没有这些文件,或者想获取别的github的代码,则可以 git cloone git的clone的地址。
安装gitlab
http://www.codegreen.cn/archives/2017/07/18/344.html(持续集成部署)
(centos6 操作步骤:https://www.gitlab.com.cn/downloads/#centos6)
yum install curl policycoreutils openssh-server openssh-clients
gitlab rpm 包地址:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/
下载gitlab 包:wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-7.12.1~omnibus.1-1.x86_64.rpm
安装依赖包:
yum install curl openssh-server openssh-clients postfix cronie
rpm安装:(gitlab默认监听80端口)
rpm -ivh gitlab-ce-7.12.1~omnibus.1-1.x86_64.rpm
yum 源安装(已搭建完成)

Gitlab 安装 安装Gitlab Gitlab的作用:作为源码管理的角色。 Gitlab实际上是整合了nginx、git等多种软件提供了一个可视化的界面。 包含git命令的基本功能,但相比于git命令更加简单易用。 1.信任 GitLab 的 GPG 公钥: [root@bc ~]# curl https://packages.gitlab.com/gpg.key 2> /dev/null | sudo apt-key add - &>/dev/null 2.配置一个清华大学的yum源 [root@bc ~]# vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] name=gitlab-ce baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 repo_gpgcheck=0 gpgcheck=0 enabled=1 gpgkey=https://packages.gitlab.com/gpg.key 3.安装gitlab和必要的依赖 [root@bc ~]# yum makecache [root@bc ~]# yum install gitlab-ce [root@bc ~]# yum install curl policycoreutils openssh-server openssh-clients [root@bc ~]# systemctl enable sshd [root@bc ~]# systemctl start sshd [root@bc ~]# yum install postfix [root@bc ~]# systemctl enable postfix [root@bc ~]# systemctl start postfix 4.初始化gitlab [root@bc ~]# gitlab-ctl reconfigure 5.找到应该访问的地址 [root@bc .ssh]# vim /etc/gitlab/gitlab.rb external_url 'http://node1.bc.com' 注意: 如果直接访问192.168.31.201,只能访问到一个空的nginx访问页面。 所以,最好能够使用域名解析来访问本地的gitlab网站。 [root@linux-node02 gitlab]# ll /etc/gitlab/gitlab.rb -rw------- 1 root root 68872 Jun 21 01:22 /etc/gitlab/gitlab.rb 这个文件里面有很多配置,例如 mysql,redis,smtp等等。
gitlab 初始密码: root 5iveL!fe
还可以修改用户的密码:
sudo gitlab-rails console production > user=User.where(name: "root").first > user.password=12345678 > user.save! > quit
启动:[root@js-212 soft]# gitlab-ctl reconfigure
查看状态:
[root@js-212 soft]# gitlab-ctl status run: logrotate: (pid 31350) 146s; run: log: (pid 31349) 146s run: nginx: (pid 31329) 148s; run: log: (pid 31328) 148s run: postgresql: (pid 31235) 176s; run: log: (pid 31234) 176s run: redis: (pid 31164) 182s; run: log: (pid 31163) 182s run: sidekiq: (pid 31312) 149s; run: log: (pid 31311) 149s run: unicorn: (pid 31291) 150s; run: log: (pid 31290) 150s
启动,关闭,重载:gitlab-ctl start/stop/reload
页面访问IP即可。因为监听80端口;
git分支的 创建 合并 冲突
[root@js-212 gittest]# ls deploy.sh LICENSE readme.txt [root@js-212 gittest]# git branch dev #创建分支 [root@js-212 gittest]# git checkout dev #切换到分支 Switched to branch 'dev' [root@js-212 gittest]# git branch #查看当前分支 * dev master [root@js-212 gittest]# ll #可以查看到当前分支以及master的文件 total 20 -rw-r--r-- 1 root root 23 Jun 16 11:32 deploy.sh -rw-r--r-- 1 root root 11357 Jun 16 14:14 LICENSE -rw-r--r-- 1 root root 21 Jun 16 13:48 readme.txt [root@js-212 gittest]# vi dev.txt #在分支创建新的文件 [root@js-212 gittest]# cat dev.txt hello word ,happy everyday [root@js-212 gittest]# git add dev.txt #添加到git [root@js-212 gittest]# git commit -m "add dev.txt"#提交 [dev 6aae669] add dev.txt 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 dev.txt [root@js-212 gittest]# ls #当前分支的所有文件 deploy.sh dev.txt LICENSE readme.txt [root@js-212 gittest]# git checkout master #切换到master(主干) Switched to branch 'master' [root@js-212 gittest]# ls #查看主干下面的文件(发现没有dev的分支结构) deploy.sh LICENSE readme.txt 如果要何必分支到主干,首先当前的环境必须是主干(master:git checkout master) [root@js-212 gittest]# git merge dev #把分支合并到主干 Updating 8759869..6aae669 Fast-forward dev.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 dev.txt [root@js-212 gittest]# ll total 24 -rw-r--r-- 1 root root 23 Jun 16 11:32 deploy.sh -rw-r--r-- 1 root root 27 Jun 16 15:28 dev.txt -rw-r--r-- 1 root root 11357 Jun 16 14:14 LICENSE -rw-r--r-- 1 root root 21 Jun 16 13:48 readme.txt [root@js-212 gittest]# git branch dev * master 删除分支: [root@js-212 gittest]# git branch -d dev 主干和分支冲突:只能手动更改配置文件。
把分支推送到github.com上面去
[root@js-212 gittest]# git branch dev * master test [root@js-212 gittest]# git push origin dev Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 285 bytes, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To git@github.com:ryan-yang-2049/demo.git * [new branch] dev -> dev [root@js-212 gittest]# git push origin test Counting objects: 5, done. Delta compression using up to 8 threads. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 287 bytes, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To git@github.com:ryan-yang-2049/demo.git * [new branch] test -> test
打标签
打标签的时候确保在主干上面 [root@js-212 gittest]# git branch dev * master test [root@js-212 gittest]# git tag v1.0 [root@js-212 gittest]# git tag v1.0 查看某个标签修改的信息,文件等等 [root@js-212 gittest]# git tag v1.0 [root@js-212 gittest]# git show v1.0 commit e11fc726d62ca415b87eed4778d98139c6a49d2f Author: ryan.yang <11066986@qq.com> Date: Fri Jun 16 15:35:38 2017 +0800 change dev.txt diff --git a/dev.txt b/dev.txt index b48eea8..da6d9e3 100644 --- a/dev.txt +++ b/dev.txt @@ -1 +1 @@ -hello word ,happy everyday +hello word ,happy everyday--yesyesyes
打标签到 github上面去
[root@js-212 gittest]# git push origin v1.0 Warning: Permanently added the RSA host key for IP address '192.30.255.113' to the list of known hosts. Total 0 (delta 0), reused 0 (delta 0) To git@github.com:ryan-yang-2049/demo.git * [new tag] v1.0 -> v1.0
github查看:
编写一个markdown
用于说明文档,可以操作,使用,安装文档等等
markdown语法:mac软件(Mou),windows软件(markdownPad)
[root@js-212 gittest]# cat Help.md # Help document ## gan sha * hello * world * hello word > 引用 #引用, [广告链接](http://www.baidu.com) #一些链接可以 []  #在github中显示一些图片 ![]
#####################下面几个都是写代码的格式,可以用tab 也可以用反引号 `` 或者一行里面使用反引号 while true: do echo "hello word" done `while true: do echo "hello,ryan" done` `yum install tree` `echo over`
在这个里面还可以设置字体的粗细: **aa** 可以变粗,*b* 可以变斜体。 *** 是分割线。 [root@js-212 gittest]# git add Help.md [root@js-212 gittest]# git commit -m "add help document" [master 3ac28ac] add help document 1 files changed, 23 insertions(+), 0 deletions(-) create mode 100644 Help.md [root@js-212 gittest]# git push origin master Counting objects: 4, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 533 bytes, done. Total 3 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), completed with 1 local object. To git@github.com:ryan-yang-2049/demo.git 8759869..3ac28ac master -> master
完成以后的github显示为:
拉取一个git仓库:
git clone git@github.com:ryan-yang-2049/demo.git
持续集成(保证代码质量)
sonar : 代码质量管理平台(代码静态检验规则)
持续集成:
简单的上线,部署,回滚等脚本(自动化)
[root@js-212 gittest]# cat prod-deploy.sh #!/bin/bash #Date/Time CDATE=$(date "+%Y-%m-%d") CTIME=$(date "+%Y-%m-%d_%H-%M") #Shell CODE_DIR="/deploy/code/demo" CONFIG_DIR="/deploy/config" TMP_DIR="/deploy/tmp" TAR_DIR="/deploy/tar" usage(){ echo $"Usage: $0 [deploy| rollback-list | rollback-pro ver]" } #获取代码 git_pro(){ echo "begin git pull" cd ${CODE_DIR} && git pull API_VERL=$(git show|grep commit|cut -d ' ' -f2) API_VER=$(echo ${API_VERL:0:6}) cp -r "${CODE_DIR}" "${TMP_DIR}" } #配置文件 config_pro(){ echo "add pro config" /bin/cp "${CONFIG_DIR}"/* "${TMP_DIR}"/demo/ TAR_VER="${API_VER}"_"$CTIME" cd ${TMP_DIR} && mv demo pro_demo_"${TAR_VER}" } #打包 tar_pro(){ echo "tar pro" cd ${TMP_DIR} && tar czf pro_demo_"${TAR_VER}".tar.gz pro_demo_"${TAR_VER}" echo "tar end pro_demo_"${TAR_VER}".tar.gz" } #拷贝到对应服务器对应目录 scp_pro(){ #模拟远程scp echo "begin copy" /bin/cp ${TMP_DIR}/pro_demo_"${TAR_VER}".tar.gz /tmp/testgit } #部署节点 deploy_pro(){ echo "begin deploy" cd /tmp/testgit && tar zxf pro_demo_"${TAR_VER}".tar.gz rm -f /var/www/html/demo ln -s /tmp/pro_demo_"${TAR_VER}" /var/www/html/demo } #测试 test_pro(){ echo "test begin" echo "test ok" } rollback_list(){ ls -l /tmp/testgit/*.tar.gz } rollback_pro(){ rm -f /var/www/html/demo ln -s /tmp/testgit/$1 /var/www/html/demo } main(){ case $1 in deploy) git_pro; config_pro; tar_pro; scp_pro; deploy_pro; test_pro; ;; rollback-list) rollback_list; ;; rollback-pro) rollback_pro $2 ;; *) usage; esac } main $1 $2
gitlab + jenkins +maven 查看文章:http://www.jianshu.com/p/3507d8b2ac87
jenkins 插件包:https://updates.jenkins-ci.org/download/plugins/