Git简介
Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)
Git有什么作用?
版本控制 团队协助
Git有什么特点?
简单来说就是:高端大气上档次!
那什么是版本控制系统?
如果你用Microsoft Word写过长篇大论,那你一定有这样的经历:
想删除一个段落,又怕将来想恢复找不回来怎么办?有办法,先把当前文件“另存为……”一个新的Word文件,再接着改,改到一定程度,再“另存为……”一个新文件,这样一直改下去,最后你的Word文档变成了这样:
过了一周,你想找回被删除的文字,但是已经记不清删除前保存在哪个文件里了,只好一个一个文件去找,真麻烦。
看着一堆乱七八糟的文件,想保留最新的一个,然后把其他的删掉,又怕哪天会用上,还不敢删,真郁闷。
更要命的是,有些部分需要你的财务同事帮助填写,于是你把文件Copy到U盘里给她(也可能通过Email发送一份给她),然后,你继续修改Word文件。一天后,同事再把Word文件传给你,此时,你必须想想,发给她之后到你收到她的文件期间,你作了哪些改动,得把你的改动和她的部分合并,真困难。
于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?
这个软件用起来就应该像这个样子,能记录每次文件的改动:
版本 | 文件名 | 用户 | 说明 | 日期 |
---|---|---|---|---|
1 | service.doc | 张三 | 删除了软件服务条款5 | 7/12 10:38 |
2 | service.doc | 张三 | 增加了License人数限制 | 7/12 18:09 |
3 | service.doc | 李四 | 财务部门调整了合同金额 | 7/13 9:51 |
4 | service.doc | 张三 | 延长了免费升级周期 | 7/14 15:17 |
这样,你就结束了手动管理多个“版本”的史前时代,进入到版本控制的20世纪。
Git命令
工作区 --> 暂存区 --> 本地仓库 --> 远程仓库
配置git用户信息:
git config --global user.email "devuser@if010.cn"
git config --global user.name "devuser"
生成空的本地仓库:git init
MingoMacBook:mingo-cg mingo$ git init
Initialized empty Git repository in /Users/mingo/Documents/GitHub/mingo-cg/.git/
添加文件到暂存区:git add [文件]
MingoMacBook:mingo-cg mingo$ git add index.php
提交文件到本地仓库:git commit -m "[提交描述]"
MingoMacBook:mingo-cg mingo$ git commit -m " 提交首页入口文件"
[master (root-commit) 6d9976c] 提交首页入口文件
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 index.php
添加远程仓库:git remote add [仓库名] [远程仓库Url地址]
MingoMacBook:mingo-cg mingo$ git remote add origin https://github.com/if010/mingo-cg.git
提交文件到远程仓库的指定分支:git push -u [仓库名] [分支名]
MingoMacBook:mingo-cg mingo$ git push -u origin master
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 237 bytes | 237.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/if010/mingo-cg.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
拉取远程仓库的变更文件:git fetch
MingoMacBook:mingo-cg mingo$ git fetch
warning: no common commits
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/if010/mingo-cg
* [new branch] master -> origin/master
将远程的变更合并到本地仓库的master分支:git merge [仓库名]/[分支名]
MingoMacBook:mingo-cg mingo$ git merge origin/master
Updating 797a5a5..4ba6333
Fast-forward
README.md | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 README.md
新建分支:git branch [分支名]
MingoMacBook:mingo-cg mingo$ git branch v2.0
查看所有分支:git branch
MingoMacBook:mingo-cg mingo$ git branch
* master
v2.0
删除分支:git branch -d [分支名]
MingoMacBook:mingo-cg mingo$ git branch -d v2.0
Deleted branch v2.0 (was ae950ac).
修改分支名:git branch -m [旧分支名] [新分支名]
MingoMacBook:mingo-cg mingo$ git branch -m v2.0 v1.1
切换分支:git checkout [分支名]
MingoMacBook:mingo-cg mingo$ git checkout v1.1
Switched to branch 'v1.1'
查看提交历史记录:git log
MingoMacBook:mingo-cg mingo$ git log -1
commit ae950ace9b5c3e38964cefaf2f4a5bcd232f5aba (HEAD -> v1.1, origin/master, master)
Author: mingo <devuser@if010.cn>
Date: Sat May 25 02:45:48 2019 +0800
提交站点ICO图标文件
撤回上次提交:git reset --soft HEAD^
MingoMacBook:mingo-cg mingo$ git reset --soft HEAD^
移除暂存区里的文件:git reset HEAD [文件名]
MingoMacBook:mingo-cg mingo$ git reset HEAD favicon.ico
合并分支:git merge [分支名]
MingoMacBook:mingo-cg mingo$ git merge v1.1
Merge made by the 'recursive' strategy.
index.php | 3 +++
1 file changed, 3 insertions(+)
Git的文件状态
新建文件 ---> Untracked状态
使用add命令将新建文件加入到暂存区 ---> Staged状态
使用commit命令将暂存区的文件提交到本地仓库 ---> Unmodified状态
如果对Unmodified状态的文件进行修改 ---> modified状态
如果对Unmodified状态的文件进行remove操作 ---> Untracked状态
查看Git的文件状态:git status
MingoMacBook:mingo-cg mingo$ git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
favicon.ico
nothing added to commit but untracked files present (use "git add" to track)
删除git文件:git rm [文件]
MingoMacBook:mingo-cg mingo$ git rm --cache favicon.ico
rm 'favicon.ico'
MingoMacBook:mingo-cg mingo$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: favicon.ico
Untracked files:
(use "git add <file>..." to include in what will be committed)
favicon.ico
恢复误操作文件:git checkout
MingoMacBook:mingo-cg mingo$ git checkout master favicon.ico
.gitignore文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
例如:
*.log 表示忽略项目中所有以.log 结尾的文件
123?.log 表示忽略项目中所有以123加任意字符的.log文件
/error.log 表示忽略项目中根目录的error.log文件
src/main/test/* 表示忽略/src/main/test目录下的所所有文件
**/java/ 匹配所有java目录下的所有文件
!/log/access.log 表示在之前的匹配规则下命中的文件进行否定命中
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
GitLab简介
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。
应用特点:
1.Web框架使用RubyonRails。
2.基于MIT代码发布协议。
3.需要gitolite协同工作。
GitLab安装
安装依赖项
yum install -y curl policycoreutils-python openssh-server cronie
添加GitLab包存储库
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
安装将自动配置并启动该URL的GitLa
sudo EXTERNAL_URL="https://gitlab.if010.com" yum -y install gitlab-ee
修改监听端口
vim /etc/gitlab/gitlab.rb
nginx['listen_port'] = 9110
配置邮箱信息
vim /etc/gitlab/gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.qq.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "abc@qq.com"
gitlab_rails['smtp_password'] = "123456"
gitlab_rails['smtp_domain'] = "qq.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
user['git_user_name'] = "abc@qq.com"
gitlab_rails['gitlab_email_from'] = 'abc@qq.com'
重读GitLa配置并重启
gitlab-ctl reconfigure
gitlab-ctl restart
访问GitLab
测试邮件发送
gitlab-rails console
Notify.test_email('收件人邮箱账号地址','邮件标题','邮件内容').deliver_now
敏捷持续集成
什么是持续集成?
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,每次集成都通过自动化构建(包括编译,发布,自动化测试)来验证,从而尽早的发现集成错误.
持续集成有什么好处?
- 节省人力成本
- 加快软件开发进度
- 实时交付
整体流程:
Git提交代码 ---> 持续集成引擎拉取代码使用构建工具自动构建 ---> 发布构建好的项目
重要组成:
Git 代码管理
GitLab 代码仓库
Jenkins 持续集成引擎
sonarqube 代码质量管理
junit 自动单元测试
JDK 运行环境
Tomcat 服务器
JDK和Maven的安装
解压JDK源码包:
tar -zxf jdk_1.8.0.tar.gz -C /usr/local/
配置环境变量:
vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_91
export JAVA_HOME
CLASSPATH=.:$JAVA_HOME/lib
export CLASSPATH
PATH=$PATH:$JAVA_HOME/bin:$CLASSPATH
export PATH
source /etc/profile
JDK安装包附件: jdk_1.8.0.tar.gz
解压Maven源码包:
tar -zxf maven_3.5.3.tar.gz -C /usr/local/
配置环境变量:
vim /etc/profile
MAVEN_HOME=/usr/local/apache-maven-3.5.3
export MAVEN_HOME
PATH=$PATH:$MAVEN_HOME/bin
export PATH
source /etc/profile
Maven安装包附件: maven_3.5.3.tar.gz
Nexus私服安装
解压Nexus源码包:
tar -zxf nexus_3.12.1.tar.gz -C /usr/local/
创建nexus用户并更改nexus目录的所有权
groupadd nexus
useradd -g nexus nexus -s /bin/false
chown -R nexus.nexus /usr/local/nexus-3.12.1-01/
chown -R nexus.nexus /usr/local/sonatype-work/
修改系统文件打开最大数
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
使用nexus用户启动nexus程序
su - nexus -c '/usr/local/nexus-3.12.1-01/bin/nexus start
设置开机自启动
vim /etc/rc.d/rc.local
su - nexus -c '/usr/local/nexus-3.12.1-01/bin/nexus start'
访问Nexus
Nexus安装包附件: nexus_3.12.1.tar.gz
使用yum安装MySQL数据库
yum install mysql mysql-server mysql-devel
service mysqld restart
SonarQube安装
解压SonarQube源码包:
unzip sonarqube_6.7.4.zip
mv sonarqube-6.7.4 /usr/local/
创建sonar数据库
CREATE DATABASE sonar DEFAULT CHARACTER SET utf8;
grant all on sonar.* to 'sonar'@'127.0.0.1' identified by '123456' with grant option;
flush privileges;
修改sonar配置
sonar.jdbc.username=sonar
sonar.jdbc.password=123456
sonar.jdbc.url=jdbc:mysql://127.0.0.1:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
sonar.web.context=/sonar
sonar.web.host=0.0.0.0
创建sonar用户并更改sonar目录的所有权
groupadd sonar
useradd -g sonar sonar -s /bin/false
chown -R sonar.sonar /usr/local/sonarqube-6.7.4/
启动sonar
su sonar /usr/local/sonarqube-6.7.4/bin/linux-x86-64/sonar.sh start
vim conf/sonar.properties
sonar.search.javaAdditionalOpts=-Dbootstrap.system_call_filter=false
vim conf/wrapper.conf
wrapper.java.additional.3=-Dbootstrap.system_call_filter=false
vim elasticsearch/config/elasticsearch.yml
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
设置开机自启动
vim /etc/rc.d/rc.local
su - sonar -c '/usr/local/sonarqube-6.7.4/bin/linux-x86-64/sonar.sh start'
访问sonar监听的9000端口
SonarQube安装包附件: sonarqube_6.7.4.zip
Jenkins安装
解压Tomcat源码包
tar -zxf tomcat_9.0.8.tar.gz -C /usr/local/
创建Tomcat运行用户并更改Tomcat目录的所有权
groupadd tomcat
useradd -g tomcat tomcat -s /bin/false
chown -R tomcat:tomcat /usr/local/apache-tomcat-9.0.8
上传Jenkins到Tomcat的webapp目录
mv /root/jenkins.war /usr/local/apache-tomcat-9.0.8/webapp/jenkins.war
chown tomcat:tomcat /usr/local/apache-tomcat-9.0.8/webapp/jenkins.war
启动Tomcat
cd /usr/local/apache-tomcat-9.0.8/bin/
su tomcat ./startup.sh
访问Jenkins
查看Jenkins提供的文件解锁
cat /home/tomcat/.jenkins/secrets/initialAdminPassword
解锁后会提示服务器似乎离线,这是应为https和http的关系
这时我们需要访问http://127.0.0.1:8080/jenkins/pluginManager/advanced
,修改升级站点,将https修改为http
重启Tomcat并重新访问Jenkins,并点击安装插件
安装好插件之后就会提示你创建管理用户
Tomcat安装包附件: tomcat_9.0.8.tar.gz
Jenkins安装包附件: jenkins.war
Jenkins插件
发布到远程服务器插件:Publish Over SSH
GitLab插件:GitLab
SonarQube插件:SonarQube Scanner
PipeLine流水线插件:Blue Ocean Pipeline Editor、Blue Ocean
Maven插件:Maven Integration
Jenkins配置
- 系统配置
系统管理 ---> 全局工具配置
1.配置jdk
2.配置sonar - 邮件配置
系统管理 ---> 系统设置 ---> 邮件 ---> 通知
1.smtp服务器 smtp.qq.com
2.用户默认邮件后缀 @qq.com
3.勾选ssl - 配置gitlab授权
Credentials ---> system ---> Global credentials - 配置免密登陆
执行yum -y install openssh-clients
安装ssh-keygen
执行ssh-keygen -t rsa
产生私钥 配置git登陆 将Jenkins所在机子的公钥 more
执行cat ~/.ssh/id_rsa.pub
的内容拷贝到gitlab项目上
结案陈词
Jenkins+Git+Gitlab+Sonar持续集成,这里的话还多了一个Nexus私服和一个Maven,这两个主要是Java项目构建所需使用到的,这里需要根据实际情况而进行调整架构,后面的其他使用手动集成,hook触发自动构建,PipeLine流水线构建,分布式构建等还没有记录,后面再去开新篇章补充,因为这片博客已经很长,而且需要好好消化,所以先告一段落,拜拜~