跳至主要內容
基于容器化Jenkins的cicd环境配置

基于容器化Jenkins的cicd环境配置

Mr.Lexon大约 3 分钟environment

基于容器化Jenkins的ci/cd环境配置

提示

开发环境: nixos 24.05 docker 24.0.5 Jenkins 2.479.1 nginx 1.27.2 gitea 1.22.3

部署环境: ubuntu 22.04 docker 24.0.5

初始化环境

创建目录

mkdir -p local-ci-cd/gitea
mkdir -p local-ci-cd/Jenkins
mkdir -p local-ci-cd/nginx
cd local-ci-cd

创建.env文件

touch .env

内容如下:

GITEA_HTTP_PORT=3000
JENKINS_HTTP_PORT=8080
GITEA_SSH_PORT=2222
  1. GITEA_HTTP_PORT是gitea的服务监听端口
  2. JENKINS_HTTP_PORT是Jenkins的服务监听端口
  3. GITEA_SSH_PORT是gitea的ssh端口(一定要配置,否则无法使用ssh形式拉取仓库)

创建docker-compose.yml

touch docker-compose.yml

内容如下:

version: '3.3'

services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    networks:
      ci-cd-network:
        ipv4_address: 192.168.16.103
        
  gitea:
    image: gitea/gitea:latest
    environment:
      - USER_UID=1000
      - USER_GID=1000
    ports:
      - "${GITEA_HTTP_PORT}:3000"
      - "${GITEA_SSH_PORT}:22"
    volumes:
      - gitea-data:/data
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    networks:
      ci-cd-network:
        ipv4_address: 192.168.16.4
  
  jenkins:
    image: lexondeloy.top/jenkins:rust
    user: jenkins
    ports:
      - "${JENKINS_HTTP_PORT}:8080"
    volumes:
      - jenkins-data:/var/jenkins_home
      - /etc/localtime:/etc/localtime:ro
    networks:
      ci-cd-network:
        ipv4_address: 192.168.16.102
    dns:
      - 192.168.1.200
      - 8.8.8.8
      - 8.8.4.4
    
    environment:
      - JENKINS_OPTS="--prefix=/jenkins"
 
networks:
  ci-cd-network:
    name: produce
    driver: bridge
    ipam:
      config:
        - subnet: 192.168.16.0/24


volumes:
  gitea-data:
    driver: local
    driver_opts:
      type: none
      device: ./gitea
      o: bind

  jenkins-data:
    driver: local
    driver_opts:
      type: none
      device: ./Jenkins
      o: bind

需要注意的四个地方:

  1. JENKINS_OPTS="--prefix=/jenkins"是为了配合nginx反向代理地址所配置的地址
  2. networks配置了固定网段,并且各个容器都配置了固定ip,这是因为Jenkin要连接gitea,如果不固定ip地址,重启容器时ip地址会有变化,这样配置的ip就会失效导致服务无法使用
  3. jenkins容器配置里有一个dns服务指向192.168.1.200,这是为了使用本地域名解析和https配置所使用的。详情请看本地构建dns服务
  4. lexondeloy.top/jenkins:rust这个是基于Jenkin官方的镜像自定义的镜像,因为如果要Jenkin自己构建,必然要在其内部安装对应环境,在下一个步骤中会提到(后面发现可以使用docker插件,但是这个目前尚未研究,这里暂时不提)

创建nginx配置文件

如果有现有的nginx可参考配置内容进行配置

touch nginx/default.conf

文件内容:

server {
    listen 80;
    server_name localhost;

    location ~ "^/static/[0-9a-fA-F]{8}\/(.*)$" {
     # rewrite all static files into requests to the root
     # E.g /static/12345678/css/something.css will become /css/something.css
        rewrite "^/static/[0-9a-fA-F]{8}\/(.*)" /$1 last;
    }
  
    location /jenkins/ {
        proxy_pass http://192.168.2.131:8080/jenkins/;

        proxy_redirect default;
        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 $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Prefix /jenkins;
      }

    location /gitea/ {
        rewrite ^/gitea/(.*) /$1 break;
        proxy_pass http://192.168.16.4:3000;
        proxy_redirect default;

        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 $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Prefix /jenkins;

    }
}

基于官方Jenkins镜像的自定义改造


2025年6月24日更

过了大半年时间,因为各种各样的事情导致了这篇文章搁置了很久,现在回头看很多细节已经记不得了,并且目前探索出来一个全新的方案,采用podman+gitea+wookpecker ci,这个方案更加简洁和现代化,所以这篇文章打算无限期停更,有兴趣的请看我的另一篇文章:gitea与woodpecker的cicd环境

上次编辑于:
贡献者: Lexon