在Droplet中通过Jenkins/Jenkinsfile运行DDEV时如何实现网页访问?
解决Jenkins构建中DDEV环境无法外部访问的问题
核心问题
DDEV默认使用本地自签域名(如*.ddev.site)和固定/随机端口,仅允许本地访问。要让外部浏览器访问Droplet上的Jenkins构建专属DDEV环境,需要解决三个关键点:
- 为每个构建实例分配唯一可解析的公网域名
- 配置DDEV绑定到Droplet的公网IP/所有网卡
- 避免不同构建的端口冲突,同时开放防火墙端口
具体解决方案(集成到Jenkinsfile)
1. 修改Jenkinsfile,配置DDEV公网访问参数
更新Example阶段的命令,为每个构建生成唯一的项目名、域名和端口,同时让DDEV绑定到所有网卡:
pipeline { agent any stages { stage('Checkout') { steps { checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'jenkinsSSH', url: 'https://myrepo.git']]) } } stage('Start DDEV Staging') { steps { echo "Staging environment for build ${env.BUILD_ID} starting..." sh ''' cd $WORKSPACE # 取BUILD_ID后4位作为端口后缀,避免端口号过长 PORT_SUFFIX=${BUILD_ID: -4} # 配置DDEV:唯一项目名、公网域名、自定义端口 ddev config --project-name="jenkins-${BUILD_ID}" \ --host-name="${BUILD_ID}-staging.your-domain.com" \ --web-port="80${PORT_SUFFIX}" \ --https-port="443${PORT_SUFFIX}" # 启动DDEV并绑定到所有网卡,允许外部访问 ddev start --bind-all # 输出访问地址,方便后续通知或记录 echo "Staging URL: https://${BUILD_ID}-staging.your-domain.com:443${PORT_SUFFIX}" ''' } } stage('Release') { steps { echo 'Ready to release etc.' } } } // 构建完成/失败后强制清理DDEV资源,避免服务器资源占用 post { always { sh 'cd $WORKSPACE && ddev stop --remove-data' } } }
2. 配套网络配置(Droplet端)
- 域名解析:在域名服务商后台配置通配符DNS记录,将
*.staging.your-domain.com指向Droplet的公网IP,这样所有构建生成的${BUILD_ID}-staging.your-domain.com都会自动解析到服务器。 - 防火墙开放:在Droplet的防火墙规则中开放端口范围
8000-8999(HTTP)和44300-44399(HTTPS),对应Jenkinsfile中用BUILD_ID后4位生成的端口。 - Docker权限:确保Jenkins用户加入
docker用户组,避免运行ddev时权限不足:sudo usermod -aG docker jenkins sudo systemctl restart jenkins
3. 可选:解决SSL证书警告
DDEV默认使用自签证书,外部访问会触发浏览器警告。可以通过以下方式优化:
- 集成Let's Encrypt:确保域名已解析,在Jenkinsfile的启动步骤中加入
ddev get ddev/ddev-letsencrypt && ddev restart,自动生成可信证书。 - 反向代理统一处理:在Droplet上部署Nginx,将所有
*.staging.your-domain.com的请求反向代理到对应DDEV端口,同时使用Let's Encrypt通配符证书。
内容的提问来源于stack exchange,提问作者Alimba
相关产品推荐
相关产品推荐

