Devops(gitlab和jenkins)安装

此文我们要学习什么?

开发将代码上传到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

访问

https://jenkins.xxx.com

暂时可以选自己选择插件

然后什么都不选,需要用到什么再安装

等待完成

配置用户名密码

设置中文插件

install之后 选择下面的restart

重新登录

安装必要插件

Git Parameter 用来从gitlab拉取代码的 点安装

还有 Publish Over SSH

相关推荐
Leinwin2 小时前
OpenClaw 多 Agent 协作框架的并发限制与企业化规避方案痛点直击
java·运维·数据库
2401_865382502 小时前
信息化项目运维与运营的区别
运维·运营·信息化项目·政务信息化
漠北的哈士奇2 小时前
VMware Workstation导入ova文件时出现闪退但是没有报错信息
运维·vmware·虚拟机·闪退·ova
如意.7592 小时前
【Linux开发工具实战】Git、GDB与CGDB从入门到精通
linux·运维·git
运维小欣3 小时前
智能体选型实战指南
运维·人工智能
yy55273 小时前
Nginx 性能优化与监控
运维·nginx·性能优化
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ4 小时前
Linux 查询某进程文件所在路径 命令
linux·运维·服务器
05大叔5 小时前
网络基础知识 域名,JSON格式,AI基础
运维·服务器·网络
安当加密5 小时前
无需改 PAM!轻量级 RADIUS + ASP身份认证系统 实现 Linux 登录双因子认证
linux·运维·服务器
dashizhi20155 小时前
服务器共享禁止保存到本地磁盘、共享文件禁止另存为本地磁盘、移动硬盘等
运维·网络·stm32·安全·电脑