此文我们要学习什么?
开发将代码上传到git,Jenkins拉去代码通过Maven构建(可以完成测试),然后推送到生产,生产通过docker部署完成
基本上这一套流程称为Devops

1.docker安装gitlab
1.1)安装docker
curl -fsSL https://get.docker.com | bash
1.2)Nginx + Certbot
sudo apt update
sudo apt install -y nginx certbot
先做好域名解析 gitlab.xxxx.com---->某个IP
sudo mkdir -p /var/www/certbot/.well-known/acme-challenge
在 /etc/nginx/conf.d/gitlab.conf 写入
server {
listen 80;
server_name gitlab.xxxx.com;
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
}
# 证书签下来之前,先给个简单响应(避免跳 https 引起排错困难)
location / {
return 200 "nginx ok\n";
}
}
systemctl reload nginx
申请证书
sudo certbot certonly --webroot -w /var/www/certbot \
-d gitlab.xxxxx.com \
--agree-tos -m QQ号或者其他邮箱.qq.com --no-eff-email
成功后会生成:
-
/etc/letsencrypt/live/gitlab.flareboot.com/fullchain.pem -
/etc/letsencrypt/live/gitlab.flareboot.com/privkey.pem
证书申请完成之后
修改/etc/nginx/conf.d/gitlab.conf 写入
# /etc/nginx/conf.d/gitlab.conf
# WebSocket upgrade 映射(可选但推荐)
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name gitlab.xxxx.com;
# Let's Encrypt HTTP-01 验证文件
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
}
# 其余全部跳到 https
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name gitlab.xxxx.com;
ssl_certificate /etc/letsencrypt/live/gitlab.xxxxxx.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/gitlab.xxxxx.com/privkey.pem;
# GitLab push/LFS 可能很大
client_max_body_size 0;
# 反代到本机 Docker 映射端口
location / {
proxy_pass http://127.0.0.1:10080;
# 基本头
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
# sameersbn 文档提到的 422 解决头
proxy_set_header X-Forwarded-Ssl on;
# WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
# 超时(GitLab 操作可能很久)
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
}
systemctl restart nginx
mkdir -p /usr/local/develop/gitlab
项目地址:https://github.com/sameersbn/docker-gitlab?tab=readme-ov-file
wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
修改
services:
redis:
restart: always # 总是自动重启
image: redis:7 # 使用 Redis 7 官方镜像
command:
- --loglevel warning # 设置日志级别为警告
volumes:
- redis-data:/data:Z # 挂载持久化数据卷,Z标签用于SELinux
postgresql:
restart: always # 总是自动重启
image: kkimurak/sameersbn-postgresql:16 # 使用 PostgreSQL 16 定制镜像
volumes:
- postgresql-data:/var/lib/postgresql:Z # 挂载数据库数据卷
environment:
- DB_USER=gitlab # 数据库用户名
- DB_PASS=和下面的一致 # 数据库密码(生产环境应使用强密码)
- DB_NAME=gitlabhq_production # 数据库名称
- DB_EXTENSION=pg_trgm,btree_gist # 启用的PostgreSQL扩展
gitlab:
restart: always # 总是自动重启
image: sameersbn/gitlab:18.8.2 # 使用 GitLab 18.8.2 社区版镜像
depends_on: # 依赖的服务
- redis
- postgresql
ports: # 端口映射 (主机端口:容器端口)
- "127.0.0.1:10080:80" # HTTP 端口
- "10022:22" # SSH 端口
volumes:
- gitlab-data:/home/git/data:Z # 挂载 GitLab 数据卷
healthcheck: # 健康检查配置
test: ["CMD", "/usr/local/sbin/healthcheck"] # 检查命令
interval: 5m # 每5分钟检查一次
timeout: 10s # 超时时间10秒
retries: 3 # 重试3次
start_period: 5m # 启动后5分钟开始检查
environment: # 环境变量配置
- DEBUG=false # 关闭调试模式
# 数据库配置
- DB_ADAPTER=postgresql # 数据库适配器
- DB_HOST=postgresql # 数据库主机名(容器名称)
- DB_PORT=5432 # 数据库端口
- DB_USER=gitlab # 数据库用户名
- DB_PASS=和上面的一致 # 数据库密码
- DB_NAME=gitlabhq_production # 数据库名称
# Redis 配置
- REDIS_HOST=redis # Redis 主机名(容器名称)
- REDIS_PORT=6379 # Redis 端口
# 时区配置
- TZ=Asia/Kolkata # 系统时区
- GITLAB_TIMEZONE=Kolkata # GitLab 时区
# HTTPS/SSL 配置
- GITLAB_HTTPS=true # 是否启用 HTTPS
- SSL_SELF_SIGNED=false # 禁用自签名 SSL
# GitLab 基础配置
- GITLAB_HOST=gitlab.xxxx.com # GitLab 访问域名/IP
- GITLAB_PORT=443 # GitLab 端口
- GITLAB_SSH_PORT=10022 # GitLab SSH 端口
- GITLAB_RELATIVE_URL_ROOT= # 相对URL根路径(用于子路径部署)
# 安全密钥配置(生产环境必须修改)
- GITLAB_SECRETS_DB_KEY_BASE=这几个由脚本生成 # 数据库加密密钥
- GITLAB_SECRETS_SECRET_KEY_BASE=这几个由脚本生成 # 会话加密密钥
- GITLAB_SECRETS_OTP_KEY_BASE=这几个由脚本生成 # 双因素认证密钥
- GITLAB_SECRETS_ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=["这几个由脚本生成"] # AR加密主密钥
- GITLAB_SECRETS_ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=["这几个由脚本生成"] # AR加密确定性密钥
- GITLAB_SECRETS_ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=这几个由脚本生成 # AR加密盐值
# 管理员账户配置(首次启动时设置)
- GITLAB_ROOT_PASSWORD=填写你的密码 # 管理员密码(为空时首次访问设置)
- GITLAB_ROOT_EMAIL=填写你的邮箱 # 管理员邮箱
# 通知配置
- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true # 构建失败时通知
- GITLAB_NOTIFY_PUSHER=true # 是否通知推送者
# 邮箱配置
- GITLAB_EMAIL=填写你的邮箱 # 系统发件邮箱
- GITLAB_EMAIL_REPLY_TO=填写你的邮箱 # 回复地址
- GITLAB_INCOMING_EMAIL_ADDRESS=填写你的邮箱 # 接收邮件地址
# 备份配置
- GITLAB_BACKUP_SCHEDULE=daily # 每日备份
- GITLAB_BACKUP_TIME=01:00 # 备份时间(凌晨1点)
# SMTP 邮件服务器配置(需启用 SMTP_ENABLED=true)
- SMTP_ENABLED=true # 启用 SMTP
- SMTP_DOMAIN=qq.com # SMTP 域名
- SMTP_HOST=smtp.qq.com # SMTP 服务器
- SMTP_PORT=587 # SMTP 端口
- SMTP_USER=填写你的邮箱 # SMTP 用户名
- SMTP_PASS=填写你的邮箱授权码 # SMTP 密码
- SMTP_STARTTLS=true # 启用 STARTTLS
- SMTP_AUTHENTICATION=login # 认证方式
# IMAP 配置(用于接收邮件)
- IMAP_ENABLED=false # 启用 IMAP
- IMAP_HOST=imap.gmail.com # IMAP 服务器
- IMAP_PORT=993 # IMAP 端口
- IMAP_USER=mailer@example.com # IMAP 用户名
- IMAP_PASS=password # IMAP 密码
- IMAP_SSL=true # 启用 SSL
- IMAP_STARTTLS=false # 禁用 STARTTLS
# OAuth 配置
- OAUTH_ENABLED=false # 是否启用 OAuth
- OAUTH_AUTO_SIGN_IN_WITH_PROVIDER= # 自动登录的 OAuth 提供商
- OAUTH_ALLOW_SSO= # 允许 SSO
- OAUTH_BLOCK_AUTO_CREATED_USERS=true # 阻止自动创建的用户
- OAUTH_AUTO_LINK_LDAP_USER=false # 自动链接 LDAP 用户
- OAUTH_AUTO_LINK_SAML_USER=false # 自动链接 SAML 用户
- OAUTH_EXTERNAL_PROVIDERS= # 外部 OAuth 提供商列表
# CAS3 OAuth 配置
- OAUTH_CAS3_LABEL=cas3 # CAS3 标签
- OAUTH_CAS3_SERVER= # CAS3 服务器地址
- OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false # 是否禁用SSL验证
- OAUTH_CAS3_LOGIN_URL=/cas/login # CAS3 登录URL
- OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate # CAS3 验证URL
- OAUTH_CAS3_LOGOUT_URL=/cas/logout # CAS3 登出URL
# Google OAuth 配置
- OAUTH_GOOGLE_API_KEY= # Google API 密钥
- OAUTH_GOOGLE_APP_SECRET= # Google 应用密钥
- OAUTH_GOOGLE_RESTRICT_DOMAIN= # 限制访问的域名
# Facebook OAuth 配置
- OAUTH_FACEBOOK_API_KEY= # Facebook API 密钥
- OAUTH_FACEBOOK_APP_SECRET= # Facebook 应用密钥
# Twitter OAuth 配置
- OAUTH_TWITTER_API_KEY= # Twitter API 密钥
- OAUTH_TWITTER_APP_SECRET= # Twitter 应用密钥
# GitHub OAuth 配置
- OAUTH_GITHUB_API_KEY= # GitHub API 密钥
- OAUTH_GITHUB_APP_SECRET= # GitHub 应用密钥
- OAUTH_GITHUB_URL= # GitHub 企业版URL
- OAUTH_GITHUB_VERIFY_SSL= # 是否验证SSL
# GitLab OAuth 配置
- OAUTH_GITLAB_API_KEY= # GitLab API 密钥
- OAUTH_GITLAB_APP_SECRET= # GitLab 应用密钥
# Bitbucket OAuth 配置
- OAUTH_BITBUCKET_API_KEY= # Bitbucket API 密钥
- OAUTH_BITBUCKET_APP_SECRET= # Bitbucket 应用密钥
- OAUTH_BITBUCKET_URL= # Bitbucket 企业版URL
# SAML 配置
- OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL= # SAML 断言消费者服务URL
- OAUTH_SAML_IDP_CERT_FINGERPRINT= # IDP 证书指纹
- OAUTH_SAML_IDP_SSO_TARGET_URL= # IDP SSO 目标URL
- OAUTH_SAML_ISSUER= # SAML 签发者
- OAUTH_SAML_LABEL="Our SAML Provider" # SAML 提供商标签
- OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient # 名称标识符格式
- OAUTH_SAML_GROUPS_ATTRIBUTE= # 组属性
- OAUTH_SAML_EXTERNAL_GROUPS= # 外部组
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL= # 邮箱属性
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME= # 姓名属性
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_USERNAME= # 用户名属性
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME= # 名属性
- OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME= # 姓属性
# Crowd OAuth 配置
- OAUTH_CROWD_SERVER_URL= # Crowd 服务器URL
- OAUTH_CROWD_APP_NAME= # Crowd 应用名称
- OAUTH_CROWD_APP_PASSWORD= # Crowd 应用密码
# Auth0 OAuth 配置
- OAUTH_AUTH0_CLIENT_ID= # Auth0 客户端ID
- OAUTH_AUTH0_CLIENT_SECRET= # Auth0 客户端密钥
- OAUTH_AUTH0_DOMAIN= # Auth0 域名
- OAUTH_AUTH0_SCOPE= # Auth0 权限范围
# Azure OAuth 配置
- OAUTH_AZURE_API_KEY= # Azure API 密钥
- OAUTH_AZURE_API_SECRET= # Azure 应用密钥
- OAUTH_AZURE_TENANT_ID= # Azure 租户ID
# Docker 卷定义(持久化存储)
volumes:
redis-data: # Redis 数据卷
postgresql-data: # PostgreSQL 数据卷
gitlab-data: # GitLab 数据卷
脚本
#!/bin/bash
echo "生成 GitLab 安全密钥..."
echo ""
echo "# 安全密钥配置(生产环境必须修改)"
echo "- GITLAB_SECRETS_DB_KEY_BASE=$(openssl rand -hex 32)"
echo "- GITLAB_SECRETS_SECRET_KEY_BASE=$(openssl rand -hex 32)"
echo "- GITLAB_SECRETS_OTP_KEY_BASE=$(openssl rand -hex 32)"
echo "- GITLAB_SECRETS_ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY=[\"$(openssl rand -hex 16)\"]"
echo "- GITLAB_SECRETS_ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY=[\"$(openssl rand -hex 16)\"]"
echo "- GITLAB_SECRETS_ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT=$(openssl rand -hex 16)"
cd /usr/local/develop/gitlab
docker compose up -d
https://gitlab.xxx.com然后你就可以使用邮箱+密码或者root+密码登录了


2.docker安装jenkins
https://github.com/jenkinsci/docker
我这里换了一台vps安装jenkins
mkdir -p /usr/local/develop/jenkins
cd /usr/local/develop/jenkins
touch docker-compose.yaml
services:
jenkins:
image: jenkins/jenkins:lts-jdk17
container_name: jenkins
restart: unless-stopped
ports:
- "127.0.0.1:8080:8080"
# 如果你明确要用"TCP inbound agents",再放开下面这行
# - "50000:50000"
volumes:
- /srv/jenkins_home:/var/jenkins_home
environment:
- TZ=Asia/Tokyo
给与权限
sudo mkdir -p /srv/jenkins_home
sudo chown -R 1000:1000 /srv/jenkins_home
sudo chmod -R u+rwX /srv/jenkins_home
docker compose up -d
docker ps
Nginx + Certbot
apt update
apt install certbot nginx -y
sudo mkdir -p /var/www/certbot/.well-known/acme-challenge
/etc/nginx/conf.d/jenkins.conf 写入
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name jenkins.example.com;
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
}
location / {
return 301 https://$host$request_uri;
}
}
sudo nginx -t
sudo systemctl reload nginx
申请证书 做好DNS解析 小云朵先不开
sudo certbot certonly --webroot -w /var/www/certbot \
-d jenkins.example.com \
--agree-tos -m your@email.com --no-eff-email
申请完成后
/etc/nginx/conf.d/jenkins.conf 补全成
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 80;
server_name jenkins.example.com;
location ^~ /.well-known/acme-challenge/ {
root /var/www/certbot;
try_files $uri =404;
}
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl http2;
server_name jenkins.example.com;
ssl_certificate /etc/letsencrypt/live/jenkins.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/jenkins.example.com/privkey.pem;
# Jenkins 官方建议:允许透传某些 header
ignore_invalid_headers off; # :contentReference[oaicite:7]{index=7}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 3600;
proxy_send_timeout 3600;
}
}
sudo nginx -t
sudo systemctl reload nginx
首次登录jenkins之前 拿密码
docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
访问


暂时可以选自己选择插件
然后什么都不选,需要用到什么再安装

等待完成
配置用户名密码



设置中文插件



install之后 选择下面的restart

重新登录


安装必要插件
Git Parameter 用来从gitlab拉取代码的 点安装

还有 Publish Over SSH
