Centos 安装 GitLab 8.5.1 版本管理 & Gitlab 服务器端 custom hook 配置(骚)
GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。在线DEMO
社区版基于MIT license开源完全免费
无用户,协作和仓库限制
保护你的源码安全
管理仓库,用户与访问权限
更多功能请看这儿
依赖组件:ruby 1.9.3+,MySQL,git,redis, Sidekiq。最低配置CPU 1G,RAM 1G+swap可以支持100用户。
安装
官方有安装包与脚本下载,官方安装指南。同样GITHUB上有个社区非官方的安装指南。
但这儿里推荐bitnami下载打包安装版本 https://bitnami.com/stack/gitlab/installer ,省去很多时间。他们也提供相关WIKI以ubuntu为演示环境,来安装这个包
1 . 服务端 安装Gitlab
chmod 744 bitnami-gitlab-8.5.1-0-linux-x64-installer.run --修改执行权限 ./bitnami-gitlab-8.5.1-0-linux-x64-installer.run --运行安装文件
会提示一些基本的设置,例如:用户名,邮箱,密码,存放位置
2 . 服务端 启动Gitlab
./ctlscript.sh start
3 . 服务端 停止Gitlab
./ctlscript.sh stop
修改默认安装路径到/data目录下,如果安装时已经设置存放路径可以忽略此步:
cd /opt mv gitlab-8.5.1-0/ /data ln -s /data/gitlab-8.5.1-0 gitlab-8.5.1-0
4. 服务端 设置防火墙
iptables -I INPUT -p tcp --dport 80 -j ACCEPT service iptables save service iptables restart cat /etc/sysconfig/iptables
5、浏览器访问:http://192.168.7.99/users/sign_in
6、新建一个项目
Visibility Level
权限等级分三种:
- Private 私有的,只有你自己或者组内的成员能访问
- Internal 所有登录的用户
- Public 公开的,所有人都可以访问
7、Git的使用
7.1 添加sshkey
git仓库之间的代码传输协议主要使用ssh协议。而一般搭建gitlab的时候使用的git用户是没有密码的,因此直接ssh是不能登录的,就需要使用ssh-keygen上传公钥,使用非对称加密传输。下面讲述如何上传你的ssh公钥:
7.1.1生成sshkey
在windows终端中敲下面的命令,第一步会生成一对私钥和公钥,分别存在 ~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
中。
ssh-keygen -t rsa
7.1.2保存sshkey到gitlab
在面板上依次点击Profile Settings –> SSH Keys –> Add SSH Keys。然后把上一步中的id_rsa.pub
中的内容拷贝出来粘贴到输入框中,保存。
完成上面两步之后就成功的添加了sshkey了,然后就可以上传代码了。
7.2 初始上传代码
git config --global user.name"your_name" git config --global user.email "your_email"
下面的$project_root
代表工程根目录
- 进入工程目录 cd $project_root
- 初始化GIT本地仓库 git init
- 添加文件到本地仓库 git add .
- 查看本地仓库的状态 git status
- 提交代码到仓库 git commit -m 'init commit'
- 链接到GIT远程服务器
git remote add origin git@example.com:namespace/projectname.git
- push代码到GIT远程服务器
git push -u origin master
“git init”之后,如下图:
“git add .”之后使用“git status”查看本地仓库的状态,如下图:
"git commit -m 'init commit'"之后,如下图:
“git commit”之后使用“git status”查看本地仓库的状态,如下图:
将本地代码提交到远程服务器上去:“git remote add origin git@localgit:wangyunpeng/tlz.common.git”和“git push -u origin master”之后,如下图:
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
7.3 克隆代码到本地
在svn中,我们都叫checkout. 把代码checkout到本地。而git中我们叫克隆,克隆会把整个仓库都拉到本地。
如,我要把刚才的工程再clone到本地。(先把本地的tlz.common文件夹删除),需要先把.ssh目录下面的config文件配置使用证书方式登录。
git clone git@example.com:namespace/projectname.git
从现在起,只要本地作了提交,就可以通过命令:
git push origin master
把本地master
分支的最新修改推送至GitLab,现在,你就拥有了真正的分布式版本库!
例如:
touch abc.txt --创建abc.txt文件(windows直接创建)
git add abc.txt --把文件abc.txt添加到本地仓库
git commit -m 'add abc.txt' --把文件abc.txt提交到本地仓库
rm -f abc.txt --删除abc.txt文件(windows直接删除)
git rm abc.txt --从版本库中删除abc.txt文件
git commit -m 'remove abc.txt' --提交从版本库中删除abc.txt文件
git push origin master --把本地代码提交到远程服务器上,不用-u参数了。
给项目里的其他用户分配权限
使用eclipse添加maven项目到gitlab中,首先进入git bash窗口,执行初始化操作,如下图:
打开eclipse,创建maven项目,然后commit代码,如下图:
提交改变,如下图:
服务器上面新创建的空仓库,请使用下面的方式创建新的maven项目并且关联到远程服务器的git仓库项目:
git config --global user.name "administrator" git config --global user.email "wangyunpeng@tidebuy.net" git clone git@localgit:wangyunpeng/java.sem.db.git
注意:创建简单的项目(Create a simple project),需要手工创建项目目录并在Location中指定,否则不需要指定到项目目录直接指到Git目录就可以。
转:http://www.cnblogs.com/wintersun/p/3930900.html
http://blog.cnbluebox.com/blog/2014/04/15/gitlabde-shi-yong/
http://blog.csdn.net/huaishu/article/details/50475175
http://www.jianshu.com/p/7a0d6917e009?mType=Group (汉化)
Gitlab 服务器端 custom hook 配置
git自定义项目钩子和全局钩子
GITLab 提交代码到服务器上,自定义commit message信息规范(全局钩子实现方法)
编辑 gitlab.rb配置文件
vim /etc/gitlab/gitlab.rb #找到custom_hooks_dir目录
# gitlab_shell['custom_hooks_dir'] = "/opt/gitlab/embedded/service/gitlab-shell/hooks"
修改自定义hooks目录的路径,同时在目录下面创建提交验证message信息格式的shell文件,
gitlab_shell['custom_hooks_dir'] = "/data/gitlab-shell/" #自定义路径,也可以用默认的目录
注意目录结构:
实际截图:
mkdir -p /opt/gitlab/embedded/service/gitlab-shell/hooks cd /opt/gitlab/embedded/service/gitlab-shell/hooks mkdir pre-receive.d
cd pre-receive.d
pre-receive文件内容:
参考文件:
curl -o pre-receive https://gist.githubusercontent.com/jtbonhomme/b88cfc3eda108fae75059ae83129d9cb/raw/61f1d87eb5954c143a1d9147a45514d2e1307d83/pre-receive
实际使用:
# # pre-receive.sh hook for Commit Check # # vim /etc/gitlab/gitlab.rb #找到custom_hooks_dir目录,取消注释 # gitlab_shell['custom_hooks_dir'] = "/opt/gitlab/embedded/service/gitlab-shell/hooks" # cd /opt/gitlab/embedded/service/gitlab-shell/hooks # mkdir pre-receive.d #创建目录 # cd pre-receive.d #进入目录 # vim pre-receive.sh #创建文件 # 增加linux执行权限 # chown git:git pre-receive.sh # chmod 755 pre-receive.sh # gitlab-ctl reconfigure
vim pre-receive.sh
#!/bin/bash COMPANY_EMAIL="wangyp.org" readonly PROGNAME=$(basename $0) readonly PROGDIR=$(readlink -m $(dirname $0)) check_single_commit() { # # Put here any logic you want for your commit # # COMMIT_MESSAGE contains commit message # COMMIT_AUTHOR contains commit author (without email) # # Set COMMIT_CHECK_STATUS to non zero to indicate an error if [[ "$COMMIT_MESSAGE" =~ ^(refactor|feat|test|fix|style|docs|chore|perf|ci):[[:space:]].*$ || "$COMMIT_MESSAGE" =~ ^Merge[[:space:]]branch.*$ ]] then COMMIT_CHECK_STATUS=0 echo "Commit message is conform." else COMMIT_CHECK_STATUS=1 echo "Commit message \"$COMMIT_MESSAGE\" is not conform." echo "The push has been refused by the server." echo "You can change you commit message with the command: git commit --amend -m \"<NEW MESSAGE>\"" fi } check_all_commits() { if [ "$OLD_REVISION" = "0000000000000000000000000000000000000000" ] then OLD_REVISION=$NEW_REVISION fi REVISIONS=$(git rev-list $OLD_REVISION..$NEW_REVISION) IFS='\n' read -ra LIST_OF_REVISIONS <<< "$REVISIONS" for rid in "${!LIST_OF_REVISIONS[@]}"; do REVISION=${LIST_OF_REVISIONS[rid]} COMMIT_MESSAGE=$(git cat-file commit $REVISION | sed '1,/^$/d') COMMIT_AUTHOR=$(git cat-file commit $REVISION | grep committer | sed 's/^.* \([^@ ]\+@[^ ]\+\) \?.*$/\1/' | sed 's/<//' | sed 's/>//' | sed 's/@$COMPANY_EMAIL//') check_single_commit if [ "$COMMIT_CHECK_STATUS" != "0" ]; then echo "Commit validation failed for commit $REVISION ($COMMIT_AUTHOR)" >&2 exit 1 fi done } # Get custom commit message format while read OLD_REVISION NEW_REVISION REFNAME ; do # 下面是需要修改的分支名称:目前是master,可以改成dev if [ "$REFNAME" != "refs/heads/master" ]; then exit 0; fi check_all_commits done exit 0
增加linux执行权限
chown git:git pre-receive.sh chmod 755 pre-receive.sh gitlab-ctl reconfigure
提交git代码,消息规范格式
为后期制作git tag提供前提条件。
gitlab查询代码保存的@hashed路径,然后添加hooks自动部署项目
gitlab-13.8.1保存git代码路径时用的是hash来保存的,因为我要在代码库的hooks目录添加一些git hooks。但是gitlab保存的路径却是这样的如下
很明显是根据一个hash值来保存的路径,经过查资料得知这个值是项目id,项目id在每个项目的设置页面可以找到,如下
在shell中执行下面命令生成一个hash值,按这个值去找这个git库的代码位置
echo -n 2 | sha256sum
打开仓库目录后hooks这个目录不要动。在它的同级创建一个custom_hooks目录,然后在里面添加pre-receive文件执行任务