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

相关推荐
J_liaty2 小时前
客户端负载均衡与服务端负载均衡解释与对比
java·运维·负载均衡
梦想的旅途22 小时前
企微API自动化:外部群消息高效推送
运维·自动化·企业微信
先生先生3932 小时前
docker/linux
linux·运维·服务器
独隅2 小时前
Ollama 在 Linux 上的完整安装与使用指南:从零部署到熟练运行大语言模型
linux·运维·语言模型
历程里程碑2 小时前
Linux 6 权限管理全解析
linux·运维·服务器·c语言·数据结构·笔记·算法
恒星科通2 小时前
校园广播系统:全场景校园音频解决方案
运维·服务器·安全·音视频·广播·应急广播
LI JS@你猜啊2 小时前
【本地搭建项目运行服务器 + 免费公网地址映射 + Docker】
运维·服务器·docker
上海云盾第一敬业销售2 小时前
深入解析:游戏盾与零信任在服务器防护中的应用对比
运维·服务器·游戏
?re?ta?rd?ed?2 小时前
linux中的进程
linux·运维·服务器