一、一键部署gitlab并启用https与域名
1.1、使用docker-compose一键部署gitlab并启用https与域名
bash
#使用docker-compose一键部署gitlab并启用https与域名
#1-创建gitlab环境目录
mkdir -p /data/gitlab/{config,data,logs,ssl}
cd /data/gitlab
#2-创建私有证书
#2.1-生成自签名证书(有效期10年,适配自己的域名【如:gitlab2.ck.com】)
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /data/gitlab/ssl/gitlab2.ck.com.key \
-out /data/gitlab/ssl/gitlab2.ck.com.crt \
-subj "/CN=gitlab2.ck.com" \
-addext "subjectAltName=DNS:gitlab2.ck.com"
#2.2-设置证书权限
chmod 600 /data/gitlab/ssl/gitlab2.ck.com.key
chmod 644 /data/gitlab/ssl/gitlab2.ck.com.crt
#3-【docker-compose.yml】文件完整内容
version: '3.8'
services:
gitlab:
# 固定使用 GitLab EE 最新稳定版(非latest,生产环境推荐)
image: gitlab/gitlab-ee:18.9.6-ee.0
container_name: gitlab-ee
restart: always
hostname: gitlab2.ck.com
privileged: true #给高权限,避免 GitLab 初始化权限不足。
ports:
# HTTPS 端口
- "443:443"
# HTTP 端口(自动重定向到HTTPS)
- "80:80"
# SSH 端口(主机端口22映射容器22,避免与主机SSH冲突)
- "22:22"
# 容器仓库专用端口
- "5050:5050"
volumes:
# 配置文件持久化
- ./config:/etc/gitlab
# 数据持久化(仓库、数据库等)
- ./data:/var/opt/gitlab
# 日志持久化
- ./logs:/var/log/gitlab
# 自签名证书目录
- ./ssl:/etc/gitlab/ssl
# 【可选加固:挂载宿主机时区文件,双重保险】
- /etc/localtime:/etc/localtime:ro
environment:
# 核心:系统时区 = 上海(所有日志基础)
TZ: Asia/Shanghai
# 核心配置:HTTPS 域名 + 自签名证书
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab2.ck.com'
# 启用自签名SSL证书
nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab2.ck.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab2.ck.com.key"
# 强制HTTP重定向到HTTPS
nginx['redirect_http_to_https'] = true
# 禁用Let's Encrypt,使用自签名证书
letsencrypt['enable'] = false
# 修复SSH克隆地址(关键:对外显示22端口)
gitlab_rails['gitlab_shell_ssh_port'] = 22
# ====================== 时区强制配置(日志全上海时间)======================
timezone = "Asia/Shanghai"
gitlab_rails['time_zone'] = "Asia/Shanghai"
gitlab_rails['log_timezone'] = "Asia/Shanghai"
sidekiq['log_timezone'] = "Asia/Shanghai"
nginx['log_time_format'] = "$$time_local"
gitlab_rails['logging_format'] = "default"
# ==========================================================================
# 生产环境性能优化(可根据服务器配置修改)
puma['worker_processes'] = 2
postgresql['shared_buffers'] = "512MB"
redis['max_memory'] = '512MB'
#指定后台任务并发数【并发数 ≈ 服务器 CPU 核心数 × 3 ~ 5】
sidekiq['max_concurrency'] = 10
# ====================== 容器镜像仓库官方优化配置 ======================
registry['enable'] = true
registry_external_url 'https://gitlab2.ck.com:5050'
# 关键:GitLab 内部访问 Registry 的地址(官网强制,缺了就 0B)
gitlab_rails['registry_api_url'] = "http://127.0.0.1:5000"
# 通知签名密钥(官方推荐,防止上传回调失败)
gitlab_rails['registry_notification_secret'] = SecureRandom.hex(64)
# Registry Nginx 官方标准配置
registry_nginx['enable'] = true
registry_nginx['ssl_certificate'] = "/etc/gitlab/ssl/gitlab2.ck.com.crt"
registry_nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/gitlab2.ck.com.key"
registry_nginx['redirect_http_to_https'] = true
registry_nginx['proxy_read_timeout'] = "3600"
registry_nginx['proxy_send_timeout'] = "3600"
registry_nginx['client_max_body_size'] = "0"
registry_nginx['proxy_buffering'] = "off"
registry_nginx['ssl_verify_client'] = "off"
# 修复GitLab启动报错:共享内存不足
shm_size: '512m'
#生产环境资源限制(目前最高6G内存、4核cpu)
deploy:
resources:
limits:
cpus: '4'
memory: 6G
reservations:
cpus: '2'
memory: 5G
networks:
- gitlab_network
networks:
gitlab_network:
driver: bridge
#4-修改linux中SSH的原有端口22为22222,并放开gitlab的端口
vi /etc/ssh/sshd_config
systemctl restart sshd
systemctl status firewalld
firewall-cmd --permanent --add-port=22222/tcp
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=5050/tcp
firewall-cmd --reload
firewall-cmd --list-port
#5-一键启动gitlab并查看运行状态与日志(注意:gitlab启动后,大概需要等待3分钟才能使用)
docker-compose up -d
docker-compose ps
docker-compose logs
#5.1-查看gitlab的初始密码,默认密码是root
cat ./config/initial_root_password
#5.2-可进入容器中(查看状态与主核心puma日志)
docker exec -it gitlab-ee bash
gitlab-ctl status
gitlab-ctl tail puma
#5.3-也可不用进入容器查看日志
tail -f ./logs/nginx/current
tail -f ./logs/puma/current
#6-配置gitlab的域名解析+浏览器访问gitlab
#6.1-若是使用windows系统的浏览器访问gitlab则进行如下gitlab的域名解析(如:192.168.1.38 gitlab2.ck.com)
#编辑【C:\Windows\System32\drivers\etc\hosts】文件,在该文件末尾添加【192.168.1.38 gitlab2.ck.com】
#6.2-若是linux系统则在【/etc/hosts】文件末尾添加【192.168.1.38 gitlab2.ck.com】
cat >>/etc/hosts <<EOF
192.168.1.38 gitlab2.ck.com
EOF
#6.3-在浏览器输入【gitlab的IP:192.168.1.38】即可访问
注意:使用docker-compose.yml一键部署的gitlab核心数据是在data目录下,做好定期备份!!











1.2、 gitlab的web界面中文设置与密码修改
1.2.1、 配置root用户界面显示中文
使用root管理员用户登录到gitlab的web界面中,点击界面右上角的圆形图标-->【Preferencs-->Localization-->Language(选择Chinese,Simplified-简体中文)-->Save Changes】后按下【F5】键刷新网页即可显示中文,如下图所示:

1.2.2、 修改root用户密码
使用root管理员用户登录到gitlab的web界面中,点击界面右上角的【管理员(Admin)】-->【概览】-->【用户】-->【Administrator右侧的"编辑"】-->密码下面输入【新密码、确认密码】-->【保存更改】即可,如下图所示:


二、安装部署2.346.3版的jenkins
CI/CD------使用Jenkins实现自动化部署与持续集成之jenkins的安装部署
https://coffeemilk.blog.csdn.net/article/details/160737557?spm=1001.2014.3001.5502CI/CD------使用Jenkins实现自动化部署与持续集成之jenkins插件与凭据配置
https://coffeemilk.blog.csdn.net/article/details/160766389?spm=1001.2014.3001.5502
注意: jenkins中安装的Blue Ocean版本1.27及其以上版本的有问题,使用不了;因此若想要完整使用Blue Ocean就需要安装2.346版本的,对应的Blue Ocean版本是1.26.0。
bash
#一在红帽系系统离线安装jenkins所需的jdk环境(openjdk17)
#1.1-解压openjdk17的二进制包
tar -xvf java-17-openjdk-17.0.8.0.7-1.portable.jdk.el.x86_64.tar.xz
mv java-17-openjdk-17.0.8.0.7-1.portable.jdk.el.x86_64 openjdk17
mv openjdk17 /data
#1.2-编辑环境配置文件并添加openjdk21的环境变量
vi /etc/profile
#【/etc/profile】文件末尾添加如下内容
#openjdk17 enviroment
export JAVA_HOME=/data/openjdk17
export CLASSPATH=.:$JAVA_HOME/lib
export PATH=$JAVA_HOME/bin:$PATH
#1.3-让修改的环境变量生效
source /etc/profile
#1.4-查看java版本信息
echo $JAVA_HOME
echo $PATH
java -version
#二、离线安装jenkins
#2.1-下载jenkins的稳定版war包(如:2.346.3)【虽然Jenkins提供了Windows、Linux、OS X等各种安装程序,但是,这些安装程序都没有war包好用】
mkdir -p /data/jenkins/data
wget https://get.jenkins.io/war-stable/2.346.3/jenkins.war -c -P /data/jenkins
cd /data/jenkins/
#2.2-配置jenkins的程序运行目录【JENKINS_HOME用于设置JENKINS程序的运行目录,默认是运行JENKINS用户下的.jenkins目录下。这里指定到/data/jenkins/data目录下】
vi /etc/profile
#【/etc/profile】文件末尾添加jenkins程序运行目录配置
export JENKINS_HOME=/data/jenkins/data
#添加完成后让配置生效
source /etc/profile
#2.3-添加防火墙的放行端口(8081)
systemctl status firewalld
firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-port
#2.4-运行jenkins的war包;然后在浏览器输入【http://ip:8081】
#2.4.1-配置jenkins为systemd服务,实现开机自启;根据web界面提示获取初始密码【cat /data/jenkins/data/secrets/initialAdminPassword】
vi /etc/systemd/system/jenkins.service
#【/etc/systemd/system/jenkins.service】文件的完整内容如下:
[Unit]
Description=Jenkins Service
After=network.target
[Service]
# 绝对路径Java + 正确指定JENKINS_HOME
ExecStart=/data/openjdk17/bin/java -jar -DJENKINS_HOME=/data/jenkins/data /data/jenkins/jenkins-2.346.3.war --httpPort=8081
# 重启策略
Restart=always
RestartSec=3
# 用户
User=root
Group=root
# 工作目录(和环境变量统一)
WorkingDirectory=/data/jenkins/data
[Install]
WantedBy=multi-user.target
#2.4.2设置开机自启
systemctl daemon-reload
systemctl enable jenkins
systemctl start jenkins
#2.4.3-在浏览器输入【http://ip:8081】即可访问到jenkins的web界面进行配置安装
#2.5-由于jenkins2.246.3是老版本的,因此在安装插件时会报错,因此需要将该版本的对应插件解压到自己目录中
cd /data/jenkins/data
mv plugins plugins.old
cp data/jenkins/plugins.tar.gz .
tar -zxvf plugins.tar.gz
systemctl restart jenkins









三、 在jenkins中使用Blue Ocean方式部署java项目jpress并制作docker镜像
3.1、使用蓝海(Blue Ocean)创建流水线
登录到jenkins的web管理后台,点击左边的【打开 Blue Ocean】-->【流水线】-->【创建流水线】进入到流水线界面进行如下操作:
| 操作步骤 | 操作内容 |
|---|---|
| 1 | 在远程仓库中创建一个名为【jenkinsfile】的空白项目,然后复制该项目的SSH链接 |
| 2 | 在jenkins的【创建流水线界面】根据项目源码所在仓库情况选择对应的类型(如:Git) |
| 3 | 在jenkins的【创建流水线界面】粘贴从远程仓库复制的【jenkinsfile】项目的SSH链接 |
| 4 | 将【创建流水线界面】自动生成的rsa公钥内容复制一份,添加到可以操作【jenkinsfile】项目用户下【偏好设置-->SSH Keys-->添加新密钥】 |
| 5 | 点击【创建流水线界面】最底部的【创建流水线】按钮完成创建 |







解决使用Blue Ocean创建流水线,且输入了Git仓库地址后,已经将显示的【ssh-rsa xxx】公钥内容复制一份添加到gitlab的SSH keys中授权,但是最后点击【创建流水线】时报错"仓库URL-请输入一个有效的URL"问题,解决方法如下:
bash
#点击【创建流水线】按钮时报错"仓库URL-请输入一个有效的URL"错误的解决方法
#1-进入jenkins所在服务器配置git对应域名的解析
cat >>/etc/hosts <<EOF
192.168.1.38 gitlab2.ck.com
EOF
#2-在jenkins所在服务器生成密钥对
#2.1-在指定路径新生成指定名称的密钥对
ssh-keygen -t ed25519
/root/.ssh/id_ed25519_gitlab
#由于没有使用默认的文件名称,因此需要配置SSH
vi ~/.ssh/config
#【~/.ssh/config】文件的内容
Host gitlab2.ck.com
HostName gitlab2.ck.com
User git
Port 22
IdentityFile ~/.ssh/id_ed25519_gitlab
IdentitiesOnly yes
#2.2-查看密钥对的公钥信息
cat ~/.ssh/id_ed25519_gitlab.pub
#3-将查看到的公钥信息配置到【gitlab2.ck.com】的SSH Keys中
#4-测试 Git 仓库连接(若结果显示"Welcome to GitLab, @root!"则表示配置成功了)
ssh -T git@gitlab2.ck.com
#4.1-注意:若执行【ssh -T git@gitlab2.ck.com】命令提示"WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED"警告,则执行如下命令
#清除旧密钥
ssh-keygen -R gitlab2.ck.com
ssh -T git@gitlab2.ck.com









3.2、使用蓝海(Blue Ocean)创建部署jpress流水线
在蓝海创建好的流水线可视化流水线编辑器中:进行如下操作:
| 序号 | 蓝海编辑器的操作步骤 | 说明 |
|---|---|---|
| 1 | 点击【Start】配置全局变量 | 在蓝海编辑器中点击【Start】然后在右侧弹窗中点击加号(+)添加三个变量及其对应的值内容: 1. base_version v1 2. jpress_version v1.1 3. imagepasswd coffeemilk.blog.csdn.net |
| 2 | 克隆源码并编译 | 点击【start】后的【加号(+)】创建对应的流程(如:git clone code),然后点击右侧的【添加步骤】按钮即可选择对应的步骤类型: 1. 先配置工作空间(Allocate workspace),然后指定Dir(如:/data/jenkins/work1); 2. 选择Git拉取项目源码配置url【git@gitlab2.ck.com:ops/jpress.git】Branch【master】; 3. 选择"Shell Script"编译项目,编译命令是【/usr/local/maven/bin/mvn clean install -D maven.test.skip=true】(注意:这里有可能会出现使用jenkins自带的jre环境,而不是我们全局配置的jdk环境导致报错,因此最稳妥的方法是,手动指定jdk环境) bash #解决编译项目报错'[ERROR] No compiler is provided in this environment. #Perhaps you are running on a JRE rather than a JDK?' #(本环境中未提供编译器。或许您运行的是JRE而非JDK?) #针对这个项目编译报错则可以直接指定JDK环境 export JAVA_HOME=/data/openjdk17 export PATH=$JAVA_HOME/bin:$PATH |
| 3 | 创建dockerfile | 点击【git clone code】后的【加号(+)】创建对应的流程(如:create dockerfile ),然后点击右侧的【添加步骤】按钮即可选择对应的步骤类型: 1. 先配置工作空间(Allocate workspace),然后指定Dir(如:/data/jenkins/work1); 2. 接着在工作空间下子流程点击【添加步骤】选择"Shell Script"实现创建dockerfile。 bash #【create dockerfile / Shell Script】内容如下 cd docker docker build . -t jpress-base:${base_version} -f ./Dockerfile.base cd .. cat > dockerfile_jpress << EOF FROM jpress-base:${base_version} LABEL maintainer="coffeemilk" WORKDIR /opt/jpress COPY ./starter/target/starter-4.0/ /opt/jpress/ COPY ./docker/files/jpress.sh /opt/jpress/jpress1.sh COPY ./docker/files/jboot.properties /opt/jpress/config/jboot.properties RUN chmod +x /opt/jpress/jpress1.sh && \ rm -rf /opt/jpress/jpress.bat && \ rm -rf /opt/jpress/config/undertow.txt && \ rm -rf /opt/jpress/config/install.lock EXPOSE 8080 CMD ["/opt/jpress/jpress1.sh", "start"] EOF export DOCKER_BUILDKIT=0 docker build -t gitlab2.ck.com:5050/ops/jpress:${jpress_version} -f dockerfile_jpress . 注意:在执行构建镜像前,若该镜像需上传到到gitlab的容器镜像仓库中,则需要【#强制关闭 OCI 格式,让镜像变成 GitLab 兼容格式 export DOCKER_BUILDKIT=0】 |
| 4 | dockerfile检查 | 点击【create dockerfile】后的【加号(+)】创建对应的流程(如:dockerfile check ),然后点击右侧的【添加步骤】按钮即可选择对应的步骤类型: 选择"Shell Script"并输入内容 bash #【dockerfile check / Shell Script】内容 if [ $GIT_PREVIOUS_SUCCESSFUL_COMMIT == $GIT_COMMIT ];then echo "skip build" exit 0 fi |
| 5 | 推送镜像 | 点击【dockerfile check】后的【加号(+)】创建对应的流程(如:push images ),然后点击右侧的【添加步骤】按钮即可选择对应的步骤类型: 1、首先要在jenkins所在服务器配置自签名证书 ```bash #在jenkins所属服务器上配置自签名证书 #1-下载 GitLab 证书到系统目录 openssl s_client -connect gitlab2.ck.com:443 </dev/null 2>/dev/null |












四、使用ssh插件实现jpress的docker镜像部署
登录jenkins的web管理后台,然后点击右上角的【+ 新建Item】-->输入任务名称【deploy-dockerjpress】并选择【Freestyle project】后进入流程配置界面:
| 序号 | 流程内容 | 说明 |
|---|---|---|
| 1 | General | 在"通用"里面可进行: 描述:填写流程的说明(如:部署jpress的镜像到应用服务器中); 勾选【This project is parameterized】(参数化构建过程)-->【Muti-line String Parameter】(多行字符串参数)【名称:jpressversion】【默认值:v1.0】 |
| 2 | 构建 | 1. 先配置ssh远程主机(即:需要从jenkins直接使用ssh连接到应用服务器)【在jenkins所在服务器生成密钥对,且与需要部署应用的服务器上配置公钥】; 2. 就可以在jenkins的【Manage Jenkins】-->【系统配置】界面最底部的【Publish over SSH】模块下配置【先配置jenkins所在服务器上的私钥路径"Path to key"的值"/root/.ssh/id_ed25519"】-->【然后在SSH Servers】下面添加需要部署应用的服务器信息【Name表示创建的任务下构建环境时显示的名称(主要是为了方便识别,可随意取名)-->Hostname表示主机IP-->Username表示连接主机的用户名称(如:root)-->Remote Directory表示在需要部署服务器部署的路径(如:/usr/local)-->若需要部署应用服务器的SSH端口不是默认的22则需要在"高级"下配置对应的端口信息】如下图所示; 3. 在【构建】流程下选择"增加构建步骤"-->【Execute shell script on remote host using ssh】进行配置,如下图所示: |
| 3 | 执行流程 | 在Jenkins的web管理后台上点击【deploy-dockerjpress】任务进入任务面板后,点击右侧的【Build with Parameters】-->输入jpressversion的版本(如:v1.0)-->点击【开始构建】等待构建完成即可,如下图所示 |




在jenkins的全局配置中配置ssh直连的应用主机(192.168.1.30):
bash
#在jenkins所在的服务器上生成密钥对
#1-生成默认密钥对命令;密钥对的路径是【/root/.ssh/】,【id_ed25519】是私钥文件;【id_ed25519.pub】是公钥文件
ssh-keygen -t ed25519
#2-将公钥添加到需ssh免密登录的远程服务器上
#将公钥添加到需ssh免密登录的远程服务器上
ssh-copy-id -i /root/.ssh/id_rsa.pub user@remote-hostIP
#若远程Linux服务器的SSH端口不是默认的22则需要指定端口号【-p 端口】
ssh-copy-id -i /root/.ssh/id_rsa.pub -p 端口号 user@remote-hostIP
#如:我这里生成密钥对的服务器IP是【192.168.1.11】,还需要ssh免密登录的服务器IP有【192.168.1.30】(给root与ck用户都配置了公钥实现免密登录)
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 root@192.168.1.30
ssh-copy-id -i /root/.ssh/id_ed25519.pub -p 22222 ck@192.168.1.30













bash
#在需要安装jpress的docker镜像shell脚本内容如下:
cd /data1
test -d compose || mkdir compose
cd compose
cat > docker-compose.yml << EOF
version: '3.1'
services:
db:
image: mysql:5.7
command: --default-authentication-plugin=mysql_native_password
restart: always
environment:
MYSQL_ROOT_PASSWORD: jpress
MYSQL_DATABASE: jpress
MYSQL_USER: jpress
MYSQL_PASSWORD: jpress
volumes:
- "./docker_volumes/mysql:/var/lib/mysql"
jpress:
depends_on:
- db
links:
- db
image: gitlab2.ck.com:5050/ops/jpress:$jpressversion
ports:
- "8000:8000"
ulimits:
nofile:
soft: 65536
hard: 65536
restart: always
environment:
TZ: Asia/Shanghai
JPRESS_DB_HOST: db
JPRESS_DB_PORT: 3306
JPRESS_DB_NAME: jpress
JPRESS_DB_USER: jpress
JPRESS_DB_PASSWORD: jpress
volumes:
- "./docker_volumes/webapp/attachment:/opt/jpress/webapp/attachment"
- "./docker_volumes/webapp/addons:/opt/jpress/webapp/addons"
- "./docker_volumes/webapp/WEB-INF/addons:/opt/jpress/webapp/WEB-INF/addons"
- "./docker_volumes/webapp/wp-content:/opt/jpress/webapp/wp-content"
- "./docker_volumes/webapp/templates/dockers:/opt/jpress/webapp/templates/dockers"
EOF
docker-compose down
docker-compose up -d

注意:当我们首次在jenkins中配置好使用ssh插件实现jpress的docker镜像部署流程并开始构建时,可能会报错"Image gitlab2.ck.com:5050/ops/jpress:v1.0 Pulling
Image mysql:5.7 Pulling
Image gitlab2.ck.com:5050/ops/jpress:v1.0 Error failed to resolve reference "gitlab2.ck.com:5050/ops/jpress:v1.0": failed to do request: Head "https://gitlab2.ck.com:5050/v2/ops/jpress/manifests/v1.0": tls: failed to verify certificate: x509: certificate signed by unknown authority
Image mysql:5.7 Interrupted
Error response from daemon: failed to resolve reference "gitlab2.ck.com:5050/ops/jpress:v1.0": failed to do request: Head "https://gitlab2.ck.com:5050/v2/ops/jpress/manifests/v1.0": tls: failed to verify certificate: x509: certificate signed by unknown authority"
这是由于我们从【gitlab2.ck.com:5050/ops/jpress:v1.0】拉取容器镜像的仓库使用了自签名的证书,被部署该镜像容器的服务器的docker不承认我们仓库的自签名证书,有两种方法可以解决:
《1》给被部署该镜像容器的服务器添加该仓库的证书支持(推荐);
《2》将远程仓库中该容器对应的项目公开(不建议);
bash
#给被部署该镜像容器的服务器添加该仓库的证书支持
#1、下载 GitLab 证书到系统目录
openssl s_client -connect gitlab2.ck.com:443 </dev/null 2>/dev/null | openssl x509 > /etc/pki/ca-trust/source/anchors/gitlab2.ck.com.crt
#2、更新系统信任证书(核心!)
update-ca-trust
#3、同时信任 Docker 仓库
mkdir -p /etc/docker/certs.d/gitlab2.ck.com:5050
cp /etc/pki/ca-trust/source/anchors/gitlab2.ck.com.crt /etc/docker/certs.d/gitlab2.ck.com:5050/ca.crt
mkdir -p /etc/docker/certs.d/gitlab2.ck.com
cp /etc/pki/ca-trust/source/anchors/gitlab2.ck.com.crt /etc/docker/certs.d/gitlab2.ck.com/ca.crt
#4、重启 Docker
systemctl restart docker




到这里恭喜你,在jenkins使用ssh插件实现jpress的docker镜像自动化部署成功!