一、安装gitlab
1.查看OpenEuler版本,openEuler 25.03
[root@gitlab1 ~]# cat /etc/os-release
NAME="openEuler"
VERSION="25.03"
ID="openEuler"
VERSION_ID="25.03"
PRETTY_NAME="openEuler 25.03"
ANSI_COLOR="0;31"
2.安装基础环境
sudo yum update -y
sudo yum install -y curl policycoreutils-python-utils openssh-server perl wget
3.下载gitlab安装包, RPM 包
curl -LOS https://packages.gitlab.cn/repository/el/8/gitlab-jh-17.7.0-jh.0.el8.x86_64.rpm
4.安装并配置
[root@gitlab1 soft]# export EXTERNAL_URL="http://172.16.50.23"
[root@gitlab1 soft]# sudo rpm -ivh gitlab-jh-*.rpm
警告:gitlab-jh-17.7.0-jh.0.el8.x86_64.rpm: 头 V4 DSA/SHA256 Signature, 密钥 ID 319ec913: NOKEY
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:gitlab-jh-17.7.0-jh.0.el8 ################################# [100%]
It looks like JiHu GitLab has not been configured yet; skipping the upgrade script.
*. *.
*** ***
***** *****
.****** *******
******** ********
,,,,,,,,,***********,,,,,,,,,
,,,,,,,,,,,*********,,,,,,,,,,,
.,,,,,,,,,,,*******,,,,,,,,,,,,
,,,,,,,,,*****,,,,,,,,,.
,,,,,,,****,,,,,,
.,,,***,,,,
,*,.
___ __ __ _______ __ __ __
/ (_) / / /_ __ / ____(_) /_/ / ____ _/ /_
__ / / / /_/ / / / / / / __/ / __/ / / __ `/ __ \
/ /_/ / / __ / /_/ / / /_/ / / /_/ /___/ /_/ / /_/ /
\____/_/_/ /_/\__,_/ \____/_/\__/_____/\__,_/_.___/
Thank you for installing JiHu GitLab!
GitLab was unable to detect a valid hostname for your instance.
Please configure a URL for your JiHu GitLab instance by setting `external_url`
configuration in /etc/gitlab/gitlab.rb file.
Then, you can start your JiHu GitLab instance by running the following command:
sudo gitlab-ctl reconfigure
For a comprehensive list of configuration options please see the Omnibus GitLab readme
https://jihulab.com/gitlab-cn/omnibus-gitlab/-/blob/main-jh/README.md
Help us improve the installation experience, let us know how we did with a 1 minute survey:
https://wj.qq.com/s2/10068464/dc66
5.修改配置文件
vim /etc/gitlab/gitlab.rb
external_url 'http://172.16.50.23'
nginx['listen_port'] = 80
gitlab_rails['time_zone'] = 'Asia/Shanghai'
原文件
external_url 'http://172.16.50.23' 默认不注释
nginx['listen_port'] = 80 默认注释
gitlab_rails['time_zone'] = 'Asia/Shanghai' 默认注释
6.启动gitlab
sudo gitlab-ctl reconfigure # 初始化配置(耗时较长,可能10几分钟)最后输出下面这段
Notes:
Default admin account has been configured with following details:
Username: root
Password: You didn't opt-in to print initial root password to STDOUT.
Password stored to /etc/gitlab/initial_root_password. This file will be cleaned up in first reconfigure run after 24 hours.
NOTE: Because these credentials might be present in your log files in plain text, it is highly recommended to reset the password following https://docs.gitlab.com/ee/security/reset_user_password.html#reset-your-root-password.
gitlab Reconfigured!
启动gitlab
sudo gitlab-ctl start
sudo gitlab-ctl status
[root@gitlab1 soft]# sudo gitlab-ctl start
\ok: run: alertmanager: (pid 12908) 108s
ok: run: gitaly: (pid 12835) 111s
ok: run: gitlab-exporter: (pid 12854) 110s
ok: run: gitlab-kas: (pid 11514) 346s
ok: run: gitlab-workhorse: (pid 12759) 112s
ok: run: logrotate: (pid 11102) 380s
ok: run: nginx: (pid 12791) 111s
ok: run: node-exporter: (pid 12844) 111s
ok: run: postgres-exporter: (pid 12926) 107s
ok: run: postgresql: (pid 11318) 357s
ok: run: prometheus: (pid 12865) 109s
ok: run: puma: (pid 11623) 224s
ok: run: redis: (pid 11148) 374s
ok: run: redis-exporter: (pid 12856) 110s
ok: run: sidekiq: (pid 11650) 218s
[root@gitlab1 soft]# ^C
[root@gitlab1 soft]# sudo gitlab-ctl status
run: alertmanager: (pid 12908) 116s; run: log: (pid 12082) 181s
run: gitaly: (pid 12835) 119s; run: log: (pid 11254) 373s
run: gitlab-exporter: (pid 12854) 118s; run: log: (pid 11924) 199s
run: gitlab-kas: (pid 11514) 354s; run: log: (pid 11556) 350s
run: gitlab-workhorse: (pid 12759) 120s; run: log: (pid 11764) 218s
run: logrotate: (pid 11102) 388s; run: log: (pid 11110) 387s
run: nginx: (pid 12791) 119s; run: log: (pid 11822) 213s
run: node-exporter: (pid 12844) 119s; run: log: (pid 11887) 205s
run: postgres-exporter: (pid 12926) 115s; run: log: (pid 12116) 177s
run: postgresql: (pid 11318) 365s; run: log: (pid 11339) 361s
run: prometheus: (pid 12865) 117s; run: log: (pid 12015) 187s
run: puma: (pid 11623) 232s; run: log: (pid 11634) 229s
run: redis: (pid 11148) 382s; run: log: (pid 11168) 379s
run: redis-exporter: (pid 12856) 118s; run: log: (pid 11961) 195s
run: sidekiq: (pid 11650) 226s; run: log: (pid 11658) 225s
[root@gitlab1 soft]#
本机测试启动curl http://172.16.50.23
[root@gitlab1 soft]# curl http://172.16.50.23
<html><body>You are being <a href="http://172.16.50.23/users/sign_in">redirected</a>.</body></html>
防火墙开通
sudo firewall-cmd --permanent --add-port={80,443}/tcp
sudo firewall-cmd --reload
查看登录密码cat /etc/gitlab/initial_root_password
登录http://172.16.50.23,账号root
登录进来是这样的,我的已经设置为中文版了,默认英文版
二、安装部署docker
设置源
sudo tee /etc/yum.repos.d/docker-ce.repo <<-'EOF'
[docker-ce-stable]
name=Docker CE Stable
baseurl=https://repo.huaweicloud.com/docker-ce/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://repo.huaweicloud.com/docker-ce/linux/centos/gpg
EOF
sudo dnf install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enbale docker
docker --version
三、下载部署runner
wget https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner_amd64.rpm
下载依赖库
sudo yum install -y curl git-core wget tar openssl shim-unsigned-x64
安装sudo rpm -ivh --nodeps gitlab-runner_amd64.rpm
[root@gitlab1 soft]# sudo rpm -ivh --nodeps gitlab-runner_amd64.rpm
警告:gitlab-runner_amd64.rpm: 头 V4 RSA/SHA512 Signature, 密钥 ID 6ba75a4e: NOKEY
Verifying... ################################# [100%]
准备中... ################################# [100%]
正在升级/安装...
1:gitlab-runner-18.1.0-1 ################################# [100%]
GitLab Runner: creating gitlab-runner...
Home directory skeleton not used
Runtime platform arch=amd64 os=linux pid=21350 revision=0731d300 version=18.1.0
gitlab-runner: the service is not installed
Runtime platform arch=amd64 os=linux pid=21371 revision=0731d300 version=18.1.0
gitlab-ci-multi-runner: the service is not installed
Runtime platform arch=amd64 os=linux pid=21436 revision=0731d300 version=18.1.0
Runtime platform arch=amd64 os=linux pid=21518 revision=0731d300 version=18.1.0
INFO: Docker installation not found, skipping clear-docker-cache
[root@gitlab1 soft]#
手动创建 systemd 服务文件
sudo tee /usr/lib/systemd/system/gitlab-runner.service > /dev/null <<'EOF'
[Unit]
Description=GitLab Runner
After=syslog.target network.target
[Service]
Type=forking
ExecStart=/usr/bin/gitlab-runner run --working-directory /home/gitlab-runner --config /etc/gitlab-runner/config.toml --service gitlab-runner --syslog
ExecReload=/usr/bin/gitlab-runner restart
ExecStop=/usr/bin/gitlab-runner stop
User=gitlab-runner
Group=gitlab-runner
Restart=always
[Install]
WantedBy=multi-user.target
EOF
创建用户及授权
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo mkdir -p /home/gitlab-runner
sudo chown -R gitlab-runner:gitlab-runner /home/gitlab-runner /etc/gitlab-runner
启动服务
sudo systemctl daemon-reload
sudo systemctl enable --now gitlab-runner
sudo systemctl status gitlab-runner
获取gitlab-runner的token
项目-设置-ci/cd-runner-复制
服务器注册 Runner,需修改ip,token
sudo gitlab-runner register \
--non-interactive \
--url "http://172.16.50.23" \
--registration-token "GR1348941whg1S7GddDQUsat9z2by" \
--executor "docker" \
--docker-image "alpine:latest" \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock" \
--docker-privileged \
--description "Docker Runner" \
--tag-list "docker,prod" \
--run-untagged "false"
验证,测试
[root@gitlab1 soft]# sudo gitlab-runner list
Runtime platform arch=amd64 os=linux pid=28350 revision=0731d300 version=18.1.0
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
Docker Runner Executor=docker Token=t3_hw7kcnLUpxKyHtU4K5w4 URL=http://172.16.50.23
[root@gitlab1 soft]# sudo gitlab-runner verify
Runtime platform arch=amd64 os=linux pid=28372 revision=0731d300 version=18.1.0
Running in system-mode.
Verifying runner... is alive correlation_id=01JY659T9Q9B7FQHGH31AXX1Y7 runner=t3_hw7kc
[root@gitlab1 soft]#
四、构建CI/CD
1.构建新分支
2.创建2个文件,index.html,Dockerfile
index.html
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to 666666666</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
jkjkjhkhjk
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
Dockerfile
# 使用动态基础镜像版本(可选)
ARG BASE_IMAGE=nginx:1.27.5
FROM ${BASE_IMAGE}
# 复制自定义内容
COPY index.html /usr/share/nginx/html
# 暴露端口
EXPOSE 80
# 添加版本元数据(便于追踪)
ARG NEW_VERSION
LABEL org.opencontainers.image.version="${NEW_VERSION}"
添加流水线编辑器,里面含有harbor地址,账号密码,需修改
stages:
- get_version # 获取当前最新版本
- build # 构建新版本镜像
- deploy # 部署新版本
variables:
HARBOR_URL: "harbor.i.cdtig.com"
PROJECT: "gxq"
REPO: "nginx"
HARBOR_USER: "admin"
HARBOR_PASSWORD: "123456"
# 敏感变量在GitLab CI/CD设置中配置(Settings > CI/CD > Variables):
# HARBOR_USER, HARBOR_PASSWORD (勾选Masked和Protected)
# 阶段1:获取当前最新镜像版本
get_image_version:
stage: get_version
image: alpine:latest
script:
- apk add --no-cache curl jq
- |
# 获取最新版本并排序(取最高版本)
CURRENT_TAG=$(curl -s -u "${HARBOR_USER}:${HARBOR_PASSWORD}" \
"${HARBOR_URL}/api/v2.0/projects/${PROJECT}/repositories/${REPO}/artifacts" \
| jq -r '.[].tags[].name' | sort -V | tail -1)
# 若无版本则初始化为v0.0.0
if [ -z "$CURRENT_TAG" ]; then
CURRENT_TAG="v0.0.0"
fi
echo "当前最新版本: $CURRENT_TAG"
echo "CURRENT_VERSION=$CURRENT_TAG" > variables.env
artifacts:
reports:
dotenv: variables.env # 传递变量到后续阶段[8](@ref)
# 阶段2:生成新版本并构建镜像
build_new_image:
stage: build
image: docker:20.10.24 # 包含Docker CLI
services:
- docker:dind # 启用Docker-in-Docker
script:
- |
# 版本号递增逻辑(v1.02 → v1.03)
version=${CURRENT_VERSION#v} # 去掉v前缀 → "1.02"
major=${version%.*} # 主版本 → "1"
minor=${version##*.} # 次版本 → "02"
new_minor=$(printf "%02d" $((10#$minor + 1))) # 次版本+1 → "03"
NEW_VERSION="v${major}.${new_minor}" # 新版本 → "v1.03"
echo "生成新版本: $NEW_VERSION"
# 登录Harbor
echo "$HARBOR_PASSWORD" | docker login -u $HARBOR_USER --password-stdin $HARBOR_URL
echo "登录成功"
# 构建镜像(含新版本标签)
docker build -t $HARBOR_URL/$PROJECT/$REPO:$NEW_VERSION .
echo "构建成功"
# 推送镜像到Harbor
docker push $HARBOR_URL/$PROJECT/$REPO:$NEW_VERSION
echo "推送成功"
# 存储新版本变量
echo "NEW_VERSION=$NEW_VERSION" > new_version.env
artifacts:
reports:
dotenv: new_version.env # 传递新版本到部署阶段[8](@ref)
needs: ["get_image_version"] # 依赖上一阶段
# 阶段3:部署新版本镜像
deploy_new_image:
stage: deploy
image: docker:20.10.24 # 包含 Docker CLI
services:
- docker:dind # 启用 Docker 守护进程
script:
- docker stop my-nginx || true
- docker rm my-nginx || true
- echo "正在部署 $REPO:$NEW_VERSION"
- docker run -d -p 8081:80 --name my-nginx --cpus 2 --memory 1g -e NGINX_WORKER_PROCESSES=2 $HARBOR_URL/$PROJECT/$REPO:$NEW_VERSION
- echo "容器启动成功"
流水线运行状态查看,我测试了几遍才成功
服务器docker ps容器运行查看
[root@gitlab1 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e4e8d9f8bb76 harbor.i.cdtig.com/gxq/nginx:v1.04 "/docker-entrypoint.…" 13 minutes ago Up 13 minutes 0.0.0.0:8081->80/tcp, :::8081->80/tcp my-nginx
nginx页面查看
以后修改nginx的index.html,会在harbor仓库里面进行版本自增,并运行新的版本
我现在nginx最新版本v1.04
现在更改流水线的index.html
更改之后,流水线会自动运行,生成新的nginx版本v1.05,并且运行
流水线运行情况查看
harbor查看nginx版本
服务器docker运行查看
[root@gitlab1 soft]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b0988d2e0837 harbor.i.cdtig.com/gxq/nginx:v1.05 "/docker-entrypoint.…" About a minute ago Up About a minute 0.0.0.0:8081->80/tcp, :::8081->80/tcp my-nginx
web页面查看,已经换了
现在,gitlab实现nginx版本自增,大功告成!!!