DevOps实战系列【第二章】:详解Gitlab环境及搭建

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

gitlab就不多说了,这个东西现在大多数公司内部都在使用,它分为社区和企业版本,社区版本ce是免费的,当然也可以选择gitee或github,但由于一些情况gitlab还是最受欢迎的。

首先在docker服务器根目录创建gitlab目录,表示将所有gitlab容器的数据都会映射到/docker/gitlab目录

网络规划

创建网络:通用同一个网段

docker network create --subnet=172.2.1.0/24 devops

目录规划

首先在docker服务器根目录创建gitlab目录表示将所有gitlab容器的数据都会映射到 /docker/gitlab 目录

cd /docker
mkdir gitlab

拉取Gitlab最新镜像

官网地址:https://docs.gitlab.com/ee/install/docker.html

docker pull gitlab/gitlab-ce:latest

运行Gitlab容器

通过docker-compose.yml运行

我们知道docker-compose是可以编排复杂容器关系的工具,该文件中可以通过设置docker容器的多维属性并能同时创建运行多个容器,可以和kubernetes的yaml类比。

# 创建vi docker-compose.yml文件,保存到宿主机的/docker/gitlab目录。

version: '3'  # docker-compose可以使用1、2、3版本,1版本已经基本弃用了,2、3分别会支持更多的指令,我们使用3即可,具体可参考官网对照表查看指令支持
services:
  gitlab:
    image: 'gitlab/gitlab-ce:latest'  # 使用的gitlab镜像版本[其他参数见方案一解释]
    restart: always
    container_name: 'gitlab'
    hostname: 'gitlab'
    environment:
      GITLAB_OMNIBUS_CONFIG: |
        # Add any other gitlab.rb configuration here, each on its own line
        external_url 'http://10.10.1.199:8929'
        gitlab_rails['gitlab_shell_ssh_port'] = 2224
    ports:
      - '8929:80'
      - '2224:22'
      # - '9443:443' # 如果需要https访问则需要映射443端口
    networks:
      - 'exist-net-bloom' # 当前创建的容器加入到外部的bloom网络
    volumes:
      - '/docker/gitlab/config:/etc/gitlab'
      - '/docker/gitlab/logs:/var/log/gitlab'
      - '/docker/gitlab/data:/var/opt/gitlab'
      - '/etc/timezone:/etc/timezone:ro'
      - '/etc/localtime:/etc/localtime:ro'
    shm_size: '256m'
networks:
  exist-net-bloom: # 改名字为当前docker-compose中要引用的名字
    external: # 指定已经存在的网络名字
      name: devops

# 命令行执行,运行docker编排内容
docker-compose up -d
# 观察docker运行日志
docker logs -f gitlab

统一配置部分

修改docker容器内的gitlab配置, 完成gitlab容器的高级映射[避免修改宿主机映射的目录文件]

1.修改容器中vi /etc/gitlab/gitlab.rb配置,增加对外映射的ip,可以认为指定对外开放哪个ip可以访问

# 进容器内部
docker exec -it gitlab /bin/bash
 
# 修改gitlab.rb
vi /etc/gitlab/gitlab.rb
 
# 加入如下配置内容
# gitlab访问地址,可以写域名。如果端口不写的话默认为80端口,10.10.1.199是我omv(宿主机)的ip地址,大家可以根据自己的情况设置
external_url 'http://10.10.1.199'

#ssh主机ip
gitlab_rails['gitlab_ssh_host'] = '10.10.1.199'
#ssh连接端口
gitlab_rails['gitlab_shell_ssh_port'] = 2224
 
# 让配置生效
gitlab-ctl reconfigure
2.修改容器中vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
 
  gitlab:
    host: 10.10.1.199 # 因为上面的修改生效后会自动更新到改文件,所以host不用改
    port: 8929 # 这里需要改成外部映射的8929端口
    https: false # 如果想通过https访问,此处设置成true
    
# 让配置生效
gitlab-ctl restart

3.安装完后进入容器查看默认gitlab密码,用户名: root
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password

注意:安装完后查看容器日志,可能会发现如下错误

err="create memberlist: Failed to get final advertise address: No private IP address found, and explicit IP not provided"
# 错误原因是因为alertmanager配置的监听地址是localhost,
# 此处需要指定127.0.0.1,修改vi /etc/gitlab/gitlab.rb如下:
alertmanager['flags'] = {
'cluster.advertise-address' => "127.0.0.1:9093"
}

# 指定后使配置生效即可
gitlab-ctl reconfigure

其他配置

邮箱配置:用于用户操作时推送关键性信息

# 1.修改容器中配置文件vi /etc/gitlab/gitlab.rb
### GitLab email server settings                                                          
###! Docs: https://docs.gitlab.com/omnibus/settings/smtp.html                      
###! **Use smtp instead of sendmail/postfix.**                                     

gitlab_rails['smtp_enable'] = true                                                 
gitlab_rails['smtp_address'] = "smtp.126.com"                                      
gitlab_rails['smtp_port'] = 465                                                                
gitlab_rails['smtp_user_name'] = "xxx@126.com"                             
gitlab_rails['smtp_password'] = "xxx"                                         
gitlab_rails['smtp_domain'] = "smtp.126.com"                                                             
gitlab_rails['smtp_authentication'] = "login"                                                                 
gitlab_rails['smtp_enable_starttls_auto'] = true                                           
gitlab_rails['smtp_tls'] = true               

gitlab_rails['gitlab_email_from'] = 'xxx@126.com'                          
gitlab_rails['gitlab_email_display_name'] = 'gitlab'

user['git_user_email'] = "xxx@126.com"  

# 2.重启配置
gitlab-ctl reconfigure
gitlab-ctl restart 

# 3.测试:首先进入控制台
gitlab-rails console
# 执行测试命令
Notify.test_email("接收邮箱","标题","内容").deliver_now

# 4.输出如下内容就是成功了
root@gitlab:/# gitlab-rails console
--------------------------------------------------------------------------------
Ruby:         ruby 2.7.5p203 (2021-11-24 revision f69aeb8314) [x86_64-linux]
GitLab:       14.6.1 (661d663ab2b) FOSS
GitLab Shell: 13.22.1
PostgreSQL:   12.7
--------------------------------------------------------------------------------
Loading production environment (Rails 6.1.4.1)
irb(main):001:0> Notify.test_email("xxx@126.com","ceshi","内容").deliver_now
Delivered mail 636286d3cea5d_35a95adc58939@gitlab.mail (1436.8ms)
=> #<Mail::Message:154820, Multipart: false, Headers: <Date: Wed, 02 Nov 2022 23:03:47 +0800>, <From: gitlab <xxx@126.com>>, <Reply-To: gitlab <noreply@10.10.1.199>>, <To: xxx@126.com>, <Message-ID: <636286d3cea5d_35a95adc58939@gitlab.mail>>, <Subject: ceshi>, <Mime-Version: 1.0>, <Content-Type: text/html; charset=UTF-8>, <Content-Transfer-Encoding: 7bit>, <Auto-Submitted: auto-generated>, <X-Auto-Response-Suppress: All>>

坑和疑惑


# 按照以上方式启动docker会遇到一个坑,就是注册用户后,给新用户发邮件需要新用户点击邮件中的链接去重置密码,而链接点击后却是空白页?
# 这是因为邮件的链接是指向了10.10.1.199:80,并没有使用我们映射到宿主机的8929端口,这是因为我们在配置external_url 'http://10.10.1.199'时用的是默认的80,
# 那就简单了,直接指定external_url 'http://10.10.1.199:8929'不就行了吗?
# 这样改问题更大,直接通过http://10.10.1.199:8929都不能访问gitlab了,那怎么办?

# 其实问题出在docker创建时的端口映射,我们把容器的80->映射到了宿主的8929,而宿主内部使用的是80,而external_url 'http://10.10.1.199'对外的地址也是80,
# 所以改起来也很简单,就是让宿主机内部也是用8929,这样在external_url这里就可以使用external_url 'http://10.10.1.199:8929'了。

更正后的docker-compose.yml如下:

version: '3'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'  # 使用的gitlab镜像版本[其他参数见方案一解释]
restart: always
container_name: 'gitlab'
hostname: 'gitlab'
environment:
 GITLAB_OMNIBUS_CONFIG: |
   external_url 'http://10.10.1.199:8929'
   gitlab_rails['gitlab_shell_ssh_port'] = 2224
   alertmanager['flags'] = {'cluster.advertise-address' => "127.0.0.1:9093"}
ports:
    - '8929:8929'
    - '2224:22'
    # - '9443:443' # 如果需要https访问则需要映射443端口
  networks:
    - 'exist-net-bloom' # 当前创建的容器加入到外部的bloom网络
  volumes:
    - '/docker/gitlab/config:/etc/gitlab'
    - '/docker/gitlab/logs:/var/log/gitlab'
    - '/docker/gitlab/data:/var/opt/gitlab'
    - '/etc/timezone:/etc/timezone:ro'
    - '/etc/localtime:/etc/localtime:ro'
  shm_size: '256m'
networks:
 exist-net-bloom: # 改名字为当前docker-compose中要引用的名字
   external: # 指定已经存在的网络名字
     name: devops

疑惑:有的小伙伴可能注意了,你的GITLAB_OMNIBUS_CONFIG环境变量中不是指定了external_url 'http://10.10.1.199:8929’吗?怎么实际设置vi /etc/gitlab/gitlab.rb的时候却使用了external_url 'http://10.10.1.199’不带端口的?

官方的解释:GITLAB_OMNIBUS_CONFIG这个变量可以指定所有gitlab.rb配置文件中的属性,但这个不会写入到容器的gitlab.rb配置文件,所以他只是一个临时的配置,实际运行是还是使用的gitlab.rb中的配置。

疑惑:既然不生效,为什么要在docker-compose.yml中指定呢?

其实直接说不生效并不准确,通过GITLAB_OMNIBUS_CONFIG指定的参数,在我不重新读gitlab.rb配置时确实是生效的,但是当重新执行gitlab-ctl reconfigure后就会以gitlab.rb中的配置为准了。而我们以上操作确实在启动docker容器后又改了gitlab.rb并重启加载,这样就导致GITLAB_OMNIBUS_CONFIG是失效的。

细节:其实不知道大家有没有注意,如果按照我上边的操作,执行完docker-compose.yml启动容器后,直接访问http://10.10.1.199:8926是无响应的,就是因为这个时候GITLAB_OMNIBUS_CONFIG的设置生效了,因为这里我指定的external_url 'http://10.10.1.199:8929’是带端口的,而宿主和容器的映射却是8929->80。

最后一步:所以按照正确的修正,修改了docker-compose.yml中的端口映射后,还需要修改一下vi /etc/gitlab/gitlab.rb才算完整:

external_url 'http://10.10.1.199:8929'

重新部署gitlab:
因为修改了docker-compose.yml,所以需要更新一下配置并构建

# 关闭并移除现有gitlab容器
docker-compose down
# 重构并启动:【之前的配置并不会丢失】
docker-compose up -d --build

常用命令

命令描述
gitlab-ctl reconfigure重载配置
gitlab-ctl check-config检查配置并启动
gitlab-ctl diff-config将用户配置与包可用配置进行比较
gitlab-ctl status查看所有启动组件的进程和状态
gitlab-ctl service-list查看所有服务
gitlab-ctl stop停止GitLab服务
gitlab-ctl start启动GitLab服务
gitlab-ctl restart重启GitLab服务
gitlab-ctl once如服务已停止则启动,如服务已启动则重启

常用修改

gitlab默认的主分支是main:

# 修改路径:
Menu->Admin->Settings->Repository->Default initial branch name自行设置,比如master是我们常用的主分支。

gitlab默认开启了分支保护:

# 不是owner用户需要mergerequest,测试期间可以暂时关闭,线上一般是开启的,为了安全,夜方便codereview。
# 关闭路径:
Menu->Admin->Settings->General->Visibility and access controls->选中”Not protected“

以上参考官方文档:
https://docs.gitlab.cn/jh/install/docker.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上树的蜗牛儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值