Windows11基于WSL2 + Ubuntu22.04 + docker搭建gitlab CI/CD环境

1. 安装 WSL2 和 Ubuntu

1.1. 安装 WSL2

打开终端,安装 wsl2,系统会自动安装 wsl2 和下载好 Ubuntu

1
wsl --install  #安装wsl2

1.2. 安装 Ubuntu

打开电脑应用软件,找到Ubuntu,双击开始安装

输入普通的用户名和密码,再使用sudo passwd root添加 root 用户 ,即可完成安装。

在 windows11 终端中输入命令可以看到 wsl 版本和 Ubuntu 版本

1.3. 移动 wsl 安装位置

wsl 默认安装到 C 盘,为了后续安装其他软件占据 C 盘空间,将 WSL 迁移

1
2
3
4
5
wsl --shutdown #终止wsl
wsl --export Ubuntu D:/wsl2/Ubuntu.tar #导出指定的wsl安装的Linux发行版本到其他位置
wsl --unregister Ubuntu #注销指定的wsl安装的Linux发行版本
wsl --import Ubuntu D:\wsl2\ D:\wsl2\Ubuntu.tar #导入之前的包
Ubuntu config --default-user xxx #配置wsl登录用户名,一般是之前安装时输入的用户名

1.4. Ubuntu 配置

1.4.1. Ubutnu 切换镜像源

在用 MobaXterm 连接 Ubuntu 系统,也可以用 Windows11 或者其他软件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo -i #切换到root
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份镜像文件
vim /etc/apt/sources.list #使用以下内容替换,针对Ubutnu22.04, vim输入v进入编辑,方向键选择内容,输入d删除

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse


sudo apt-get -y update && sudo apt-get -y upgrade #更新系统

sudo apt install net-tools #安装net-tools
ifconfig #查看Ubuntu系统IP

2. 安装 docker

2.1. 安装 docker 准备工作

2.1.1. 安装 docker 依赖
1
2
3
4
5
6
7
sudo apt-get install ca-certificates gnupg
#apt-transport-https:通过 HTTPS 协议安全访问存储库,为apt获取HTTPS支持,apt新版本(1.5)以上,已获支持,可不安装

#ca-certificates:CA证书管理工具,是一个软件包,包含了一组根证书和中间证书,这些证书用于验证 SSL/TLS 连接中的服务器证书和客户端证书。当用户使用 SSL/TLS 协议与服务器通信时,服务器会发送一个证书,证书上包含了服务器的公钥和证书的签名。客户端需要验证证书的有效性,以确保与服务器的通信是安全的。包含的根证书和中间证书是由各个证书颁发机构(CA)签发的,这些 CA 可以是公共 CA,也可以是私有 CA。当客户端收到服务器证书时,它会使用 ca-certificates 中的证书来验证服务器证书的有效性。如果证书有效,则 SSL/TLS 连接将被建立;如果证书无效,则连接将被终止。因此,ca-certificates 起到了保障 SSL/TLS 连接安全的作用。在 Linux 系统中,安装 ca-certificates 软件包是非常重要的,因为它提供了一组可信任的根证书和中间证书,使得用户可以安全地与各种服务器通信。

#gnupg:GNU Privacy Guard (GnuPG) 是一个开源的加密工具,它可以帮助用户在Linux系统上加密文件,保护文件内容不被窃取或篡改。

2.1.2. 配置 docker 的 apt 源 GPG key
1
2
3
4
5
sudo install -m 0755 -d /etc/apt/keyrings
# -m 选项设置已安装对象的模式(访问控制位)。目录与普通文件一样具有模式,-m 选项对于安装目录和安装普通文件具有相同的含义,-d 选项指定为安装指定的名称将作为要创建的目录,以及指定路径中任何缺失的目录,效果类似于mkdir -p,将模式显式设置为0755,即用户具有读/写/执行权限,组用户和其它用户具有读写权限。/etc/apt/keyrings是key的路径
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
# 远程存储库的 GPG 密钥,来自存储库的包由GPG密钥“签名(signed)”,并且通过这份存储的公钥,系统能够验证软件包正是来自这个存储库
2.1.3. 配置 docker 软件源
1
2
3
4
5
6
7
8
9
10
11
12
13
#配置官方软件源
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#配置其他软件源,需要导入对应的GPG?

# tuna
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
tee /etc/apt/sources.list.d/docker.list > /dev/null
2.1.4. 更新软件源
1
2
sudo apt update
sudo apt-get update

2.2. 安装 docker

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
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#docker-ce:docker社区版

#docker-ce-cli:docker的命令行客户端工具(Command Line Interface)。它允许用户通过命令行界面与docker守护程序进行交互,从而管理容器和镜像。使用docker命令,可以构建、运行、停止、删除容器,以及管理docker镜像、网络、卷等。docker-ce-cli提供了与docker守护程序通信的途径,使可以轻松地管理容器化应用。

#containerd.io:是一个面向容器运行时的基本组件。它充当了docker引擎的核心,负责管理容器的生命周期、镜像管理和存储。实际上,docker-ce内部使用containerd.io来处理容器的创建、销毁和运行等操作。containerd.io的设计更加注重稳定性和可扩展性,使其成为容器生态系统的关键基础。

#docker-buildx-plugin:docker的一个插件,用于构建多平台的容器镜像。它可以在一个构建过程中同时构建多个不同平台的镜像,例如x86、ARM等。这样可以方便地为不同平台的设备提供适配的容器镜像。

#docker-compose-plugin:
#Compose 是用于定义和运行多容器 Docker 应用程序的工具。 借助 Compose,您可以使用 YAML 文件来配置应用程序的服务。 然后,只需一个命令,即可创建并启动所有服务 从您的配置。
#Compose 适用于所有环境;生产、暂存、开发、测试 以及 CI 工作流。它还包含用于管理应用程序的整个生命周期的命令:
#启动、停止和重建服务
#查看正在运行的服务的状态
#流式传输正在运行的服务的日志输出
#在服务上运行一次性命令

#Compose 使其有效的主要功能包括:
#在单个主机上具有多个隔离环境
#创建容器时保留卷数据
#仅重新创建已更改的容器
#支持变量和在环境之间移动合成

docker version #安装完成后,查看docker版本信息

3. 安装 gitlab

3.1. 搜索和拉取镜像

1
2
docker search gitlab/gitlab-ce #搜索镜像
docker pull gitlab/gitlab-ce #拉取镜像,默认拉取最新版,安装需要一定的时间

3.2. 安装

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
docker images #查看镜像

sudo mkdir -p /srv/gitlab
sudo chmod -R 777 /srv/gitlab #权限
export GITLAB_HOME=/srv/gitlab #配置全局目录,通常会将 gitlab 的配置 (etc) 、 日志 (log) 、数据 (data)放到容器之外,便于日后升级,配置一个新的环境变量$GITLAB_HOME,该变量指向配置,日志和数据文件将驻留的目录。确保目录存在并且已授予适当的权限。
source ~/.bashrc #路径生效

#启动gitlab容器
sudo docker run --detach \
--hostname gitlab.example.com \
--publish 8443:443 --publish 8888:80 --publish 8822:22 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
--shm-size 256m \
gitlab/gitlab-ce:latest

# --hostname:主机IP
# --detach:后台运行
# --publish:将容器内部端口向外映射
# --name:命名容器名称
# --volume:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录

# 8443:443:将http:443映射到外部端口8443
# 8888:80:将web:80映射到外部端口8888
# 2222:22:将ssh:22映射到外部端口8822


docker ps #查看正在运行的容器
docker ps -a #查看所有容器
docker exec -it gitlab bash #进入gitlab容器

3.3. 配置

3.3.1. 配置文件
1
2
3
4
5
6
7

vim $GITLAB_HOME/config/gitlab.rb #gitlab配置
# external_url '我的主机IP' #配置http协议所使用的访问地址,不能添加端口号,默认 GENERATED_EXTERNAL_URL
gitlab_rails['time_zone'] = 'Asia/Shanghai'

#docker exec -it gitlab bash #进入gitlab容器
#gitlab-ctl reconfigure #更新配置
3.3.2. 减少 gitlab 内存占用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
vim $GITLAB_HOME/config/gitlab.rb
#docker exec -it gitlab bash进入gitlab容器
#vi /etc/gitlab/gitlab.rb修改配置
#gitlab-ctl reconfigure更新配置
#gitlab-ctl restart重启

puma['worker_timeout'] = 30
puma['worker_processes'] = 2 # 0, 禁用 puma cluster 模式, 可以减少 100-400 MB占用
puma['max_threads'] = 4
puma['min_threads'] = 4
postgresql['max_worker_processes'] = 8
# Sidekiq 是一个后台处理守护进程。默认情况下使用 GitLab 配置时,它以50. 这确实会影响它在给定时间可以分配多少内存。建议将其配置为使用明显更小的值5或10(首选)。
sidekiq['max_concurrency'] = 10
# GitLab 默认启用所有服务,无需任何额外配置即可提供完整的 DevOps 解决方案。一些默认服务,如监控,对于 GitLab 的运行不是必需的,可以禁用以节省内存。
# 禁用监控
prometheus_monitoring['enable'] = false

## GitLab 由许多组件(用 Ruby 和 Go 编写)组成,其中 GitLab Rails 是最大的组件,并且消耗最多的内存。
#gitlab_rails['env'] = {
# 'MALLOC_CONF' => 'dirty_decay_ms:1000,muzzy_decay_ms:1000'
#}
docker restart gitlab #修改完成,重启gitlab
3.3.3. gitlab web 配置
3.3.3.1. web 无法打开
1
2
docker exec -it gitlab bash #进入gitlab容器
gitlab-ctl tail #查看日志
3.3.3.2. 提示 502
  • 需要等待一会儿再刷新
3.3.3.3. 登录
1
2
root #默认账号
cat $GITLAB_HOME/config/initial_root_password #查看密码
3.3.3.4. 克隆地址没有 IP 和端口号
  • 管理员登录—设置—通用—可见性,项目功能,权限—自定义 HTTP(S)协议 Git 克隆 URL, 设置为 gitlab 的 ip:port 模式
3.3.3.5. 无法克隆或者导入导出
  • 管理员登录—设置—网络—出站请求, 设置为允许来自 webhooks 和集成对本地网络的请求,允许系统钩子向本地网络发送请求

4. 安装 gitlab-runner

4.1. 搜索和拉取镜像

1
2
docker search gitlab/gitlab-runner #搜索镜像
docker pull gitlab/gitlab-runner #拉取镜像,默认拉取最新版,安装需要一定的时间

4.2. 安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
docker images #查看镜像

sudo mkdir -p /srv/gitlab-runner
sudo chmod -R 777 /srv/gitlab-runner #权限
export GITLAB_RUNNER_HOME=/srv/gitlab-runner #配置一个新的环境变量$GITLAB_RUNNER_HOME,该变量指向配置文件。确保目录存在并且已授予适当的权限。
vim ~/.bashrc #增加一行 export GITLAB_RUNNER_HOME=/srv/gitlab-runner

source ~/.bashrc #路径生效

#启动gitlab-runner容器
docker run -d --name gitlab-runner --restart always \
-v $GITLAB_RUNNER_HOME/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

docker ps #查看正在运行的容器
docker ps -a #查看所有容器
docker exec -it gitlab-runner bash #进入gitlab-runner容器

4.3. 配置

4.3.1. 新建项目
4.3.2. 项目新增文件
  • 新建index.html文件
  • 新建.gitlab-ci.yml文件,模板选择html
  • 新建runnner,复制页面代码
1
2
3
4
docker exec -it gitlab-runner bash #进入git-runner容器
gitlab-runner register --url http://ip --token tokennnnn #注册runner
#name:test
#shell
4.3.3. 配置pages
4.3.3.1. 开启pages
1
2
vim $GITLAB_HOME/config/gitlab.rb #配置gitlab
gitlab_pages['enable'] = true #开启gitlab pages
4.3.3.2. pages配置
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
49
50
51
52
53
#Pages部署目录:/var/opt/gitlab/gitlab-rails/shared/pages

#内置Nginx目录:/var/opt/gitlab/nginx

#编辑nginx目录下的conf/gitlab-pages.conf文件,内容如下:

server {
listen port; ## 端口根据需要填写
server_name ip; ## IP根据实际情况填写
server_tokens off; ## Don't show the nginx version number, a security best practice

## Disable symlink traversal
disable_symlinks on;

access_log /var/log/gitlab/nginx/gitlab_pages_access.log gitlab_access;
error_log /var/log/gitlab/nginx/gitlab_pages_error.log;

# Pass everything to pages daemon
location / {
# 指向pages的发布目录
root /var/opt/gitlab/gitlab-rails/shared/pages;
index index.html;
}

# Define custom error pages
error_page 403 /403.html;
error_page 404 /404.html;
}
#配置好后重启Nginx:gitlab-ctl restart nginx
#访问页面:http://IP:端口/gitlab账号/项目名/public/
http://ip:port/gitlab_username/test/public/

vim /etc/hosts
sudo systemctl restart systemd-resolved


pages_external_url = "http://ip:port"
gitlab_pages['enable'] = true

cp /var/opt/gitlab/nginx/conf/gitlab-pages.conf /etc/gitlab/gitlab-pages.conf
vi /etc/gitlab/gitlab-pages.conf
#proxy_cache off;
#proxy_pass http://localhost:8090;

root /var/opt/gitlab/gitlab-rails/shared/pages;
index index.html;
gitlab-ctl restart nginx

vi /etc/gitlab/gitlab.rb
nginx['custom_nginx_config'] = "include /etc/gitlab/gitlab-pages.conf;"
gitlab-ctl reconfigure
Document single-IP solution for GitLab Pages