
基于容器化Jenkins的cicd环境配置
大约 3 分钟
基于容器化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
GITEA_HTTP_PORT是gitea的服务监听端口JENKINS_HTTP_PORT是Jenkins的服务监听端口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
需要注意的四个地方:
JENKINS_OPTS="--prefix=/jenkins"是为了配合nginx反向代理地址所配置的地址networks配置了固定网段,并且各个容器都配置了固定ip,这是因为Jenkin要连接gitea,如果不固定ip地址,重启容器时ip地址会有变化,这样配置的ip就会失效导致服务无法使用jenkins容器配置里有一个dns服务指向192.168.1.200,这是为了使用本地域名解析和https配置所使用的。详情请看本地构建dns服务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环境。