Windows11基于WSL2 + Ubuntu22.04 + docker搭建gitlab CI/CD环境
1. 安装 WSL2 和 Ubuntu
1.1. 安装 WSL2
打开终端,安装 wsl2,系统会自动安装 wsl2 和下载好 Ubuntu
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 #
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' gitlab_rails['time_zone'] = 'Asia/Shanghai'
#docker exec -it gitlab bash #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_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_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
|