前言

本章节讨论

  1. 我们的git服务器gitlab应该部署在企业内网,还是部署在公网如阿里云上,各自利弊。
  2. 我们的代码仓库如何划分比较好。

gitlab

部署在外网云上

  1. 在云上,所以很方便的在任何地方进行代码的同步,提交。
  2. 周末修复紧急BUG比较方便(当然本地内网也是能修和发布只是比较麻烦)。

缺点:

  1. 代码在外网能直接访问,存在一定的安全隐患。

企业内网

缺点:

  1. 只能在企业内网下提交代码和clone代码。
  2. 由于隔离了外网,无法从外网访问代码库,所以在外时紧急修复BUG比较麻烦,但也能做。

优点:

  1. 安全系数更高,代码全部托管在企业内网中,和外网完全隔离。
  2. checkout速度更快一些。
  3. 标准化交付,整个源代码只会保留在内网,对外采用统一的标准的Docker Image交付。

部署gitlab

这里我们使用docker来部署gitlab服务端。你可以从docker hub获取到最新发布的版本。 你可以用官方提供的Dockerfile了解到build的想想信息。 一下我从官方网站copy的一份,可以看到他定义了三个VOLUME,这样我们将其挂出到宿主机即可。

Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

FROM ubuntu:16.04
MAINTAINER GitLab Inc. <support@gitlab.com>

SHELL ["/bin/sh", "-c"],

# Default to supporting utf-8
ENV LANG=C.UTF-8

# Install required packages
RUN apt-get update -q \
    && DEBIAN_FRONTEND=noninteractive apt-get install -yq --no-install-recommends \
      ca-certificates \
      openssh-server \
      wget \
      apt-transport-https \
      vim \
      tzdata \
      nano \
    && rm -rf /var/lib/apt/lists/* \
    && sed 's/session\s*required\s*pam_loginuid.so/session optional pam_loginuid.so/g' -i /etc/pam.d/sshd

# Remove MOTD
RUN rm -rf /etc/update-motd.d /etc/motd /etc/motd.dynamic
RUN ln -fs /dev/null /run/motd.dynamic

# Copy assets
COPY RELEASE /
COPY assets/ /assets/
RUN /assets/setup

# Allow to access embedded tools
ENV PATH /opt/gitlab/embedded/bin:/opt/gitlab/bin:/assets:$PATH

# Resolve error: TERM environment variable not set.
ENV TERM xterm

# Expose web & ssh
EXPOSE 443 80 22

# Define data volumes
VOLUME ["/etc/gitlab", "/var/opt/gitlab", "/var/log/gitlab"]

# Wrapper to handle signal, trigger runit and reconfigure GitLab
CMD ["/assets/wrapper"]

HEALTHCHECK --interval=60s --timeout=30s --retries=5 \
CMD /opt/gitlab/bin/gitlab-healthcheck --fail --max-time 10

拉取gitlab-ce的镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
$ 12.1.0-ce.0: Pulling from gitlab/gitlab-ce
35b42117c431: Pull complete 
ad9c569a8d98: Pull complete 
293b44f45162: Pull complete 
0c175077525d: Pull complete 
46fa9af23f79: Pull complete 
a3eeae0f17b9: Pull complete 
8b1c0ce3d35c: Pull complete 
ee7f915d4ba3: Pull complete 
07bb28c21ccb: Pull complete 
794291508550: Pull complete 
Digest: sha256:87102aedb799a311f0abd78f43c7c7b208568a3bd161503851895c0baa18c2c8
Status: Downloaded newer image for gitlab/gitlab-ce:12.1.0-ce.0

将gitlab的数据配置等目录挂出来

我们这里将gitlab的logs,data,config目录挂出到宿主机,需要先创建三个目录

1
2
3
4
5
6
# gitlab 的配置文件夹
mkdir -p /opt/gitlab/config
# gitlab 的日志文件夹
mkdir -p /opt/gitlab/log
# gitlab 的数据文件夹 可
mkdir -p /opt/gitlab/data

启动gitlab

这里我们映射出去80端口和22端口,80端口是为了方便访问gitlab的ui界面,22端口是ssh端口方便采用公钥进行项目的clone,push,pull等操作。 请确保内存足够大,比如8G左右必然可能会导致启动失败,或者启动成功之后整个机器很卡。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# --hostname  会影响生成的ssh仓库地址,这里填ip或者要作为访问的域名即可
$ docker run -d \
    --hostname gitlab.example.com \
    -p 8080:80 -p 8022:22 \
    --name gitlab \
    --restart always \
    -v /opt/gitlab/config:/etc/gitlab \
    -v /opt/gitlab/logs:/var/log/gitlab \
    -v /opt/gitlab/data:/var/opt/gitlab \
    -v /etc/localtime:/etc/localtime:ro \
    gitlab/gitlab-ce:12.1.0-ce.0
3c99d1936485b57919a7a5ed0a1c03ecc03014957f578d5f2840c9ed8376baa9
# 查看gitlab的启动日志
# docker logs -f 3c99d1936485b57919a7a5ed0a1c03ecc03014957f578d5f2840c9ed8376baa9
# 启动根据硬件配置和硬盘性能不同 可能需要3-5分钟不等。

管理ui界面

通过浏览器访问http://ip:8080就能访问到gitlab提供的一个完善的ui界面了。 首次访问会需要你为root用户设置一个新的密码,输入即可,然后使用root/你设置的新密码登录即可,这里的root就是整个gitlab的超级管理员。

修改gitlab默认的ssh端口

虽然我们在docker使用映射的方式将22端口映射出为8022端口,但是gitlab并不知道,所以导致项目使用clone时仍然是默认的22端口,导致一些不便。 编辑gitlab.rb 配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看默认的端口
$ cd /opt/gitlab/config
$ cat gitlab.rb | grep ssh_port
# gitlab_rais['gitlab_shell_ssh_port'] = 22
# 修改端口 找到以上被注释的gitlab_rais['gitlab_shell_ssh_port'] 打开注释,并将22 修改为8022端口
$ vim gitlab.rb 
#修改后如下
....
### GitLab Shell settings for GitLab
 gitlab_rails['gitlab_shell_ssh_port'] = 8022
# gitlab_rails['gitlab_shell_git_timeout'] = 800
....
#进入gitlab的容器刷新配置,让配置生效
$ docker exec -it 3c99d1936485 bash
# 刷新配置
$ gitlab-ctl reconfigure
....
Running handlers:
Running handlers complete
Chef Client finished, 10/610 resources updated in 01 minutes 09 seconds
gitlab Reconfigured!
# 再次查看项目的ssh仓库地址 已经变成了如下
ssh://git@gitlab.example.com:8022/root/test.git

配置smtp邮箱服务器

  1. 配置好SMTP服务器之后方便我们之后的GITLAB-RUNNER 做CI时的编译错误时通知到对应邮箱。
  2. 方便找回密码。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#启用email
# 找到/opt/gitlab/config/gitlab.rb的内容,去掉注释,并填入你的信息。
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = ''
gitlab_rails['gitlab_email_display_name'] = ''
gitlab_rails['gitlab_email_reply_to'] = ''

#配置smtp 同样找到以下配置去掉注释,并修改相关信息。保存
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = ""
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = ""
gitlab_rails['smtp_password'] = ""
gitlab_rails['smtp_domain'] = ""
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true

#进入gitlab的容器刷新配置,让配置生效
$ docker exec -it 3c99d1936485 bash
# 刷新配置
$ gitlab-ctl reconfigure