最开始代码一直托管在GitHub上,之后为了CI(主要是自动化生成和测试),将代码迁移到了VSTS上,然而最近因为在写一些类库,想要自动发布nuget包到myget上,却发现免费版的VSTS的CD支持非常不完善几乎没有,文档又比较混乱,再加上电信连接外网实在是太慢太慢,所以决定尝试自建GitLab来托管自己的项目代码。
官网上提供了各个OS环境的安装文档,为了便于编排、管理,我选择将其托管在Docker上。
如果没有安装Docker,可以直接使用下面命令一键安装
curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh
使用docker compose部署gitlab服务
Docker Compose是一个用来定义和运行复杂应用的Docker工具。使用Compose,你可以在一个文件中定义一个多容器应用,然后使用一条命令来启动你的应用,完成一切准备工作。
docker-compose.yml
:
version: '3'
services:
gitlab:
image: gitlab/gitlab-ce
container_name: "gitlab"
restart: always
ports:
- "80:80"
- "443:443"
- "10022:22"
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://gitlab.csys.me'
gitlab_rails['gitlab_shell_ssh_port'] = 10022
volumes:
- '/srv/gitlab/config:/etc/gitlab'
- '/srv/gitlab/logs:/var/log/gitlab'
- '/srv/gitlab/data:/var/opt/gitlab'
networks:
default:
driver: bridge
在上面的yml中:
image
指定了使用gitlab-ce版本container_name
指定运行的容器名,指定以后比较方便操作ports
指定了需要暴露的端口,其中80和443为http/https端口,10022:22
是ssh端口,由于22端口被主机的sshd所占用,所以要另外指定一个端口用来和容器内的ssh通信,值得注意的是,docker会自动配置iptables,添加暴露的端口到入站规则,添加dockerfile中指定的entrypoint端口到NAT转发规则中,也就是说不必再额外配置iptables,方便了我这种每次配置iptables都要现查命令和规则的人environment
指定环境变量,其中GITLAB_OMNIBUS_CONFIG
是gitlab的安装配置,安装脚本会读取其值来进行安装前的配置。官方文档中有各配置项的用途和用法。volumes
指定了数据卷的配置,没有具体研究过各volumes的作用,只是从字面上猜测是持久化保存配置、日志、(未知)数据,防止重建容器后丢失这些数据
在docker-compose.yml的路径下执行docker-compose.yml up -d
,就会自动安装、运行Gitlab服务,通过 http://$hostIP
测试是否正常运行
使用外部数据库和Redis
gitlab镜像中捆绑了postgresql和redis,但是如果服务器中本就有postgres和redis服务,就可以使用外部服务来共用数据库和redis
PostgreSQL(pgsql)
目前CE版本只支持使用pgsql,只需要在之前的docker-compose.yml
文件中添加pgsql的服务定义就可以。
docker-compose.yml
:
postgres:
restart: always
image: postgres:latest
container_name: "postgres"
environment:
- POSTGRES_PASSWORD=csysme
volumes:
- /data/postgres:/var/lib/postgresql/data
pgsql的容器配置可以去看官方文档
然后配置gitlab服务使其引用外部pgsql
docker-compose.yml
:
gitlab:
environment:
GITLAB_OMNIBUS_CONFIG: |
postgresql['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_host'] = 'postgres'
gitlab_rails['db_port'] = '5432'
gitlab_rails['db_username'] = 'postgres'
gitlab_rails['db_password'] = 'csysme'
Redis
同理,配置redis服务
docker-compose.yml
:
redis:
restart: always
image: redis:latest
container_name: "redis"
配置gitlab服务使其引用外部redis
docker-compose.yml
:
gitlab:
environment:
GITLAB_OMNIBUS_CONFIG: |
redis['enable'] = false
gitlab_rails['redis_host'] = 'redis'
gitlab_rails['redis_port'] = 6379
使用外部NginX
gitlab镜像内同样捆绑了nginx,但是由于gitlab的nginx配置需要passenger module,而nginx只能在编译时才能指定添加module,所以选择不停用容器内部的nginx,而选择用外部的nginx做二次转发
首先添加nginx服务的定义
docker-compose.yml
:
proxy:
restart: always
build: nginx/
image: nginx-proxy
container_name: "nginx"
ports:
- "80:80"
nginx服务没有进行ssl的支持,ssl方面有空会单独发一篇来写
nginx服务没有选择直接使用官方镜像,而是生成自定义镜像
dockerfile
:
FROM nginx:alpine
RUN rm -v /etc/nginx/conf.d/*
COPY config/well-known.conf /etc/nginx/conf.d/well-known.conf
COPY config/gitlab.conf /etc/nginx/conf.d/gitlab.conf
dockerfile中使用COPY命令将本地的站点配置添加到容器中
gitlab.conf
:
upstream gitlab {
server gitlab:80;
}
server {
listen 80;
server_name gitlab.csys.me;
location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass http://gitlab/;
}
}
由于使用了nginx服务做转发,gitlab服务的80端口就不必再暴露了,所以去掉gitlab服务中的80端口配置
docker-compose.yml
:
gitlab:
ports:
- "10022:22"
只留下了ssh端口10022
通过docker ps
命令可以查看指定的端口和外部映射的端口
TIPS
至此gitlab服务应该正常运行,下面是一些tips
- docker会默认添加DNS解析来发现服务地址,所以可以直接将所引用的服务的hostname配置为服务名,额外的手段还有指定links或hosts
- 如果gitlab所依赖的服务如redis,pgsql,nginx等没有在
docker-compose.yml
中定义,可以使用external_links
来指定引用外部容器 - 在使用外部pgsql时,gitlab容器启动后自动安装时,可能会出现
ActiveRecord::NoDatabaseError (FATAL: database "gitlabhq_production" does not exist
错误,手动创建数据库即可 - 可选添加portainer服务来进行可视化管理docker,和watchtower服务来自动更新容器镜像