最近在研究流水线,对于我来说,自动构建并上传镜像是非常有必要的,一方面每次都需要执行代码,一方面每次都需要找到版本号,非常的麻烦。 在此,我顺便编写文章,记录gitlab快速搭建以及ci/cd部署。
配置要求: 4H 8G (可以自己电脑开自启动的虚拟机)
首先安装docker/docker-compose,nuoyis提供了快速安装脚本,在安装docker前全是n
curl -sSO https://shell.nuoyis.net/nuoyis-init.sh;bash nuoyis-init.sh
然后将下方docker-compose复制进去(注意要修改内容)
version: '3'
services:
gitlab:
image: gitlab/gitlab-ce:latest
container_name: gitlab
restart: always
privileged: true
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://你的外网机器IP:2236'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
# 禁用 PUMA 集群模式
puma['worker_processes'] = 0
puma['min_threads'] = 1
puma['max_threads'] = 2
# 关闭监控
prometheus_monitoring['enable'] = false
alertmanager['enable'] = false
node_exporter['enable'] = false
redis_exporter['enable'] = false
postgres_exporter['enable'] = false
pgbouncer_exporter['enable'] = false
gitlab_exporter['enable'] = false
sidekiq['metrics_enabled'] = false
GITLAB_ROOT_PASSWORD: '修改成你的密码'
ports:
- "2236:2236"
- "2238:22"
volumes:
- /nuoyis-server/gitlab/config:/etc/gitlab
- /nuoyis-server/gitlab/logs:/var/log/gitlab
- /nuoyis-server/gitlab/data:/var/opt/gitlab
networks:
nuoyis-net:
aliases:
- nuoyis-gitlab
gitlab-runner:
image: gitlab/gitlab-runner:latest
container_name: gitlab-runner
restart: always
privileged: true
volumes:
- /nuoyis-server/gitlab/runner:/etc/gitlab-runner
- /var/run/docker.sock:/var/run/docker.sock
networks:
nuoyis-net:
aliases:
- nuoyis-gitlab-runner
networks:
nuoyis-net:
name: nuoyis-net
driver: bridge
ipam:
driver: default
config:
- subnet: 192.168.223.0/24
gateway: 192.168.223.1
首先docker-compose启动,然后再去编写gitlab-runner
docker-compose -f gitlab.yaml up -d
gitlab-runner 启动文件编写 首先获取token(修改链接快速访问),访问后在右边三个点内
http://IP:2236/admin/runners
cat > /nuoyis-server/gitlab/runner/config.toml << EOF
concurrent = 1
check_interval = 0
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "nuoyis-runner"
url = "http://192.168.223.1:2236/"
id = 1
token = "gitlab生成的token"
token_obtained_at = 2025-03-13T19:16:59Z
token_expires_at = 0001-01-01T00:00:00Z
executor = "docker"
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:20.10.8"
privileged = true
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]
shm_size = 0
network_mtu = 0
EOF
在物理机上使用git上传项目
mkdir nuoyis-lnmp-np
# 把东西复制一个目录里或者提前有目录
# 有目录写法
# rm -rf .git
# 创建目录写法
# mv ./*
# cd nuoyis-lnmp-np
git init
git config --global user.name "nuoyis"
git config --global user.email "nuoyis@nuoyis.net"
# main分支可以切换别的分支
git checkout -b main
git add .
git commit -m "初次上传"
git remote add origin http://IP地址:2236/nuoyis(用户名)/nuoyis-lnmp-np(库名).git
git pull origin main
git push -u origin main
gitlab docker构建 .gitlab.yml 编写示范 首先在库的根目录创建build.json
{
"name": "nuoyis-lnmp-np",
"version": "0.1.3"
}
然后获取token并填入(修改后访问快速到达)
http://IP:2236/用户/库名/-/settings/access_tokens
http://IP:2236/用户/库名/-/settings/ci_cd#js-cicd-variables-settings
再在根目录下创建.gitlab.yml
stages:
- build
- deploy
nuoyis_image_tag:
image: ubuntu:20.04
stage: build
except:
- build.json
- README.md
script:
- echo "Changing to domestic mirrors for faster package installation"
- cp /etc/apt/sources.list /etc/apt/sources.list.bak # 备份原始源列表
- sed -i 's/http:\/\/archive.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list # 更换为阿里云镜像源
- sed -i 's/http:\/\/security.ubuntu.com/https:\/\/mirrors.aliyun.com/g' /etc/apt/sources.list # 更换为阿里云镜像源
- apt-get -o Acquire::https::Verify-Peer=false -o Acquire::https::Verify-Host=false update -y && apt-get -o Acquire::https::Verify-Peer=false -o Acquire::https::Verify-Host=false upgrade -y && apt-get -o Acquire::https::Verify-Peer=false -o Acquire::https::Verify-Host=false install -y ca-certificates # 更新源列表
- apt-get install -y git curl build-essential jq # 安装常用工具,如 git, curl 等
- current_version=$(jq -r '.version' build.json)
- IFS='.' read -ra version_parts <<< "$current_version"
- ((version_parts[2]++))
- new_version="${version_parts[0]}.${version_parts[1]}.${version_parts[2]}"
- jq ".version = \"$new_version\"" build.json > temp.json
- mv temp.json build.json
- git config user.name "nuoyis"
- git config user.email "nuoyis@nuoyis.net"
- git remote rm origin
- git remote add origin http://oauth2:$GitLab_Access_Tokens@你的IP:2236/nuoyis/nuoyis-lnmp-np.git
- git add build.json
- git commit -m "use to $new_version"
- git push origin HEAD:main -o ci.skip
- echo "VERSION=$new_version" > nuoyis.env
artifacts:
paths:
- nuoyis.env
only:
- main
nuoyis_image_build:
image: docker:20.10.8
timeout: 10 hours
stage: deploy
dependencies:
- nuoyis_image_tag
services:
- name: docker:20.10.8-dind
alias: docker
command: ["--insecure-registry=0.0.0.0/0"]
variables:
DOCKER_DRIVER: overlay2 # 使用 overlay2 存储驱动
script:
- export $(cat nuoyis.env | xargs)
- echo $VERSION
- echo "Building Docker image..."
- docker build --no-cache -t "nuoyis-lnmp-np:$VERSION" -f ./dockerfile/dockerfile .
- docker tag "nuoyis-lnmp-np:$VERSION" "registry.cn-hangzhou.aliyuncs.com/nuoyis/nuoyis-lnmp:$VERSION"
- docker tag "nuoyis-lnmp-np:$VERSION" "registry.cn-hangzhou.aliyuncs.com/nuoyis/nuoyis-lnmp:latest"
- 'docker login --username=$DOCKER_USERNAME --password=$DOCKER_PASSWORD registry.cn-hangzhou.aliyuncs.com'
- docker push registry.cn-hangzhou.aliyuncs.com/nuoyis/nuoyis-lnmp:latest
- docker push registry.cn-hangzhou.aliyuncs.com/nuoyis/nuoyis-lnmp:$VERSION
only:
- main
流水线执行检测
流水线发布