同福

Gitlab学习笔记

介绍

介绍

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务。安装方法是参考GitLab在GitHub上的Wiki页面。

安装Gitlab

镜像

拉取镜像

docker pull gitlab/gitlab-ce

容器

启动容器

docker run -tid \
--name gitlab \
-h gitlab \
--net eth2 \
--ip 10.16.1.163 \
--publish 9091:9091 \
--restart always \
--memory 4g \
--memory-swap -1 \
gitlab/gitlab-ce:latest

配置

修改端口

默认端口是80,当然不能给它用了

建议分配9090以上的端口,要不各种和其他服务端口冲突

[root@tongfunet]# vi /etc/gitlab/gitlab.rb

nginx['listen_port'] = 9091

重启服务

gitlab-ctl reconfigure
gitlab-ctl restart

开始使用

启动Gitlab

打开浏览器,输入网址 http://localhost:9091/

修改默认密码

首先我们要设置一下 root 的密码

生成SSH Key

建立SSH Key,用来向其他主机推送文件

[root@tongfunet]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:Fxz0olc9GnBd+3m7chymOJxHskX7W/yj8HypH6l5Wnk root@gitlab
The key's randomart image is:
+---[RSA 2048]----+
|         .+ .. ..|
|         . = .. .|
|          + + o. |
|         . + + .o|
|        S o o ..o|
|         o . + +=|
|          ..B =*E|
|           *+++O*|
|            oOX++|
+----[SHA256]-----+

查看SSH公钥

[root@tongfunet]# cat /root/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EABBBDAQABAAABAQDEAVZPD5j57jzmLY9Q8Iu7b4Q7c4r5BXudCW/Qcr1h/MNf9fp3FltatAnf1jXiBM0gCixdtKH/5cW8cilVfrRGg4kny6EyfEAtRKc5g5mI3rGrYCniZZuVjSZi1pI31LjiVN2ZhzZuI9roDAuSS9vnGUqYV9pkFUVbgyXGxk1k/TLWNyf4IoaxM5mr7Gg1HEKirlnMqGmhr86GayXrPJRNSeqE1O+Xg3twdoEGe3M9aV83vgLM0XOq1WKKbzLutdAHqqx9ZDO0jQd57SfCp0wiPW0hICTc+pk2tgLj1SyL36iXFtYPRS7Pz3hlaKgg4nbJ4DfJT054Cmw764DvNAID root@gitlab

点击“Settings”进入设置界面

6.jpg

安装Gitlab-Runner

有两种方式安装 gitlab-runner

一种是通过docker镜像安装,优点是简单,缺点是可维护性差

另一种是通过RPM安装,优点是可维护性高,缺点是安装过程相对繁琐一些

我们更加推荐使用RPM安装,以后还可以自己安装其他脚本,更加灵活地构建项目

通过镜像安装

镜像

拉取gitlab-runner镜像

docker pull docker.io/gitlab/gitlab-runner

容器

启动gitlab-runner容器

docker run -tid \
--name gitlab_runner \
-h gitlab_runner \
--net eth2 \
--ip 10.16.1.165 \
--restart always \
--memory 512m \
--memory-swap -1 \
gitlab/gitlab-runner:latest

通过RPM安装

容器

通过最小镜像启动一个gitlab-runner容器

docker run -tid \
--name gitlab_runner \
-h gitlab_runner \
--net eth2 \
--ip 10.16.1.165 \
--restart always \
--memory 512m \
--memory-swap -1 \
docker.io/centos:latest \
/usr/sbin/init

安装gitlab-runner

准备

yum -y install wget

下载

https://packages.gitlab.com/runner/gitlab-runner 选择合适的版本

wget --content-disposition https://packages.gitlab.com/runner/gitlab-runner/packages/el/7/gitlab-runner-12.1.0-1.x86_64.rpm/download.rpm

安装

rpm -ivh gitlab-runner-12.1.0-1.x86_64.rpm --nodeps

安装Git客户端

准备

yum -y install gcc gcc-c++ make
yum -y install zlib-devel gettext-devel curl-devel autoconf

下载

从 https://mirrors.edge.kernel.org/pub/software/scm/git/ 选择合适的版本

wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.21.0.tar.gz

安装

tar -xzvf git-2.21.0.tar.gz
cd git-2.21.0
./configure
make
make install

设置SSH Keys

通过RPM安装gitlab-runner环境,需要自己设置SSH Keys(不知道为什么,镜像方式就不用)

生成SSH Keys

[root@gitlab_runner gitlab_runner]# su gitlab-runner
[gitlab-runner@gitlab_runner gitlab_runner]$ ssh-keygen -t rsa

查看SSH Keys

[gitlab-runner@gitlab_runner gitlab_runner]$ cat ~/.ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAABAQACAAABAQDEpw2UJ7wyR1sHVfcLQjhL9aeqshAM68dO04dp50x1yRsEG3sn7tn0VLGCW8JqwKLWXGTiQw+9ah5kOGH1F8A9eFA2I55xBPLSiUCJksfAYm9q45FRF0JRPIOeFDk6Z51kRHW3YaUtPXZ+uY23gcAk9qokJe9YcVaGMlAUWci/AgmIlqZ73SDtJfJvK6tFDnyCWZ4OLNsoxMxXcqIUasW7CneJL3+QNFswqTgyXx4rF0K4WpFUkgwkD579xkpO2HsQS3VXl/DY+YSQX/8O7ZbkDZakjn3pJidRGltEgmGe8xtHPrXXWW64n3UjRUw1Ja/+luUU/2vurU1WqqwLPylz gitlab-runner@gitlab_runner

其实这里就是建立runner到gitlab通道的单方向SSH信任

1.jpg注册成功后再次回到这个界面可以看到刚刚注册的runner已经激活了

查看runner

通过下面的命令查看runner列表

gitlab-runner list

注销runner

选择一个要注销的runner,使用下面的命令注销

gitlab-runner unregister --name test

或者用url和token注销

gitlab-runner unregister --url htt://gitlab/ --token xxxxxx

CI / CD

使用CI / CD来部署项目,跟我来吧!

第一步:在项目根目录建立配置文件 .gitlab-ci.yml,示例内容如下:

stages:

- test

my_dev_deploy:

  stage: test
  
  tags:
  
  - build
  
  only:
  
  - master
  
  script:
  
  - sh my_dev_deploy.sh

第二步:在项目目录下(也可以去runner服务器)建立自动部署脚本:

#!/bin/sh

# 根据自己的情况编写

...

最后:通过git开发,提交后,合并到master的时候会自动出发部署任务

  • 因为gitlab项目的master分支是不能直接push的,只能通过合并的方式。

  • 当master发生合并事件后就会自动出发runner去部署程序了

  • 我们可以设置脚本自动部署到测试环境,丢给测试人员进行测试

  • 测试通过后反馈给管理员,由管理员手动执行打标记操作

  • 管理员最后再将此次的新版本手动推送到相应的生产环境上

迁移数据

迁移数据

如果我们想更改gitlab的仓库存放路径可以安装如下步骤操作

停止gitlab服务

gitlab-ctl stop

复制仓库父目录到新路径(当然你也可以移动这个目录)

rsync -av /var/opt/gitlab/git-data/ /gitlab/

修改配置文件(添加或修改如下参数)

[root@tongfunet]# vi /etc/gitlab/gitlab.rb

git_data_dirs({
   "default" => {
     "path" => "/gitlab"
    }
 })

重新配置gitlab服务

gitlab-ctl reconfigure

启动gitlab服务

gitlab-ctl start

注意:一定不要使用符号链接!!!

迁移仓库

从Git迁移到Gitlab

建立好了Gitlab,我们希望把我们的代码从Git转到Gitlab,但是又不想丢失之前的日志,怎么办?

可以参考下面的操作进行仓库迁移

从Git克隆带日志的版本

git clone --bare git@git.xxx.com:root/my-repository.git

进入带日志的版本目录

cd my-repository.git

镜像方式推送带日志的版本到Gitlab

git push --mirror git@gitlab.xxx.com:root/my-repository.git

现在就可以再Gitlab上进行克隆等操作了!

FAQ

Gitlab-runner

Pipelines总是pending

原因:

这个情况基本就是runner和gitlab之间的通讯出了问题了

或者就是gitlab-ci.yml脚本有问题了

或者就是gitlab-ci.yml的jobs执行不了

解决:

curl看看url是否通?

gitlab-ci.yml保存时候有没有报错?

jobs的executor是否可用?

unable to access 'http://gitlab-ci-token:xxxxxx@ip/xxx/xxx.git'

原因:

这个情况基本就是gitlab没有使用80端口的缘故

解决:

如果gitlab用的是nginx发布的,注册runner的时候就需要设置clone_url

clone_url就设置gitlab的external_url就可以了(带端口的)

bash: line 77: ci/xxx.sh: Permission denied

原因:

脚本没有执行权限

解决:

授权可执行权限

示例:

script:
- chmod +x ci/xxx.sh
- ci/xxx.sh

在前面增加sh解析器

示例:

script:
- sh ci/xxx.sh

repository 'http://gitlab/root/test.git/' not found

原因:

我们的客户端记住了一套用户名和密码,但是这套用户名密码没有权限克隆当前仓库

解决:

在地址上附加用户名和密码

示例:

http://user:pwd@gitlab/root/test.git   

让TortoiseGit每次都需要输入密码的方法

随便找一个文件夹,右键-> Settings -> Git -> Credential

右侧的 Credential 选择 None,点击应用按钮