谷歌云高权重账号 GCP谷歌云部署Jenkins集成
话说那天我对着 Jenkins 的启动日志发呆,第17次看到 java.lang.OutOfMemoryError: Metaspace,窗外的鸽子正蹲在 GCP 控制台图标上拉了一泡——那一刻我顿悟:不是 Jenkins 不行,是它不该被塞进我那台 1核512MB 的免费 tier 实例里当苦力。
所以今天这篇,不讲「Jenkins 是什么」这种能让人秒睡的定义,也不甩一堆带星号的官方文档截图。咱们就干一件事:把 Jenkins 稳稳当当、舒舒服服、还能顺手调用 GCP 各种服务地,部署到 Google Cloud Platform 上。过程像煮一碗溏心蛋——火候要准,步骤要顺,翻车了……也别慌,锅底还留着蛋壳,能捞出来重打。
第一步:先给 Jenkins 找个「公寓」,别住地下室
别急着点「Create Instance」!GCP 默认推荐的 e2-micro 是慈善款,适合跑 hello world,不适合跑 CI/CD。Jenkins 启动就要吃掉 800MB+ 内存,加上插件、构建缓存、Java GC 开销——我们直接选 e2-standard-4(4核16GB),月均约 $32,但换来的是:构建不卡顿、页面不转圈、半夜告警不误报。省钱?省的是你反复重装的时间,和凌晨三点排查 Connection refused 的血压。
创建时勾选「Allow HTTP traffic」和「Allow HTTPS traffic」——别信「我后续再配防火墙」这种鬼话。等 Jenkins 跑起来了,你才发现 8080 端口被挡得严严实实,而你的 SSH 连接又刚好超时……那种绝望,堪比在微信里发了「在?」之后对方已读不回。
第二步:SSH 登上去,别急着 apt update
连上实例后,第一件事不是装 Jenkins,而是先升级系统并换源:
sudo apt update && sudo apt upgrade -y
# 换成阿里云源(GCP 新加坡节点访问快)
sudo sed -i 's|archive.ubuntu.com|mirrors.aliyun.com|g' /etc/apt/sources.list
sudo sed -i 's|security.ubuntu.com|mirrors.aliyun.com|g' /etc/apt/sources.list
sudo apt update
然后装 OpenJDK 17(Jenkins 2.4x 起强制要求 Java 17+):
sudo apt install openjdk-17-jdk -y
java -version # 输出应含 "17.0.x"
⚠️重点来了:别用 apt install jenkins!Ubuntu 官方源里的 Jenkins 版本老旧(2.3xx),且自带 systemd 配置有坑——它会把 JENKINS_HOME 锁死在 /var/lib/jenkins,后面你扩容磁盘、挂载 SSD、迁移到 Cloud Storage 备份时,会发现路径像焊死的防盗门。
第三步:手动部署 Jenkins —— 自己动手,丰衣足食
谷歌云高权重账号 去 jenkins.io/download 下最新 LTS 的 WAR 包(比如 jenkins.war),上传到实例:
wget https://get.jenkins.io/war-stable/2.440.4/jenkins.war
sudo mkdir -p /opt/jenkins
sudo mv jenkins.war /opt/jenkins/
创建专用用户(安全起见,别用 root 跑 Jenkins):
sudo useradd -r -m -U -d /opt/jenkins -s /bin/false jenkins
sudo chown -R jenkins:jenkins /opt/jenkins
写个轻量级 systemd service(/etc/systemd/system/jenkins.service):
[Unit]
Description=Jenkins CI Server
After=network.target
[Service]
Type=simple
User=jenkins
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64"
Environment="JENKINS_HOME=/opt/jenkins/home"
ExecStart=/usr/bin/java -Djava.awt.headless=true -Djenkins.install.runSetupWizard=false -Xmx4g -XX:MaxMetaspaceSize=512m -jar /opt/jenkins/jenkins.war --httpPort=8080 --prefix=/
Restart=on-failure
RestartSec=10
[Install]
WantedBy=multi-user.target
注意三个灵魂参数:
• -Xmx4g:堆内存设为 4GB(总内存 16GB,留足余量);
• -XX:MaxMetaspaceSize=512m:防 Metaspace 爆炸;
• --httpPort=8080:先走明文,HTTPS 交由反向代理管。
启动:
sudo systemctl daemon-reload
sudo systemctl enable jenkins
sudo systemctl start jenkins
sudo systemctl status jenkins # 看一眼 ✅ Active (running)
第四步:搞个域名 + HTTPS,别让管理员密码裸奔
买个便宜域名(.dev/.site 首年不到 10 块),解析到实例公网 IP。然后用 Nginx 反代 + Let's Encrypt:
sudo apt install nginx certbot python3-certbot-nginx -y
sudo ufw allow 'Nginx Full'
配 Nginx(/etc/nginx/sites-available/jenkins):
server {
listen 80;
server_name ci.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name ci.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/ci.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ci.yourdomain.com/privkey.pem;
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 $scheme;
proxy_redirect http:// https://;
}
}
申请证书:
sudo ln -sf /etc/nginx/sites-available/jenkins /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
certbot --nginx -d ci.yourdomain.com
现在打开 https://ci.yourdomain.com,输入初始密码(sudo cat /opt/jenkins/home/secrets/initialAdminPassword),一路下一步——插件选「建议的插件」即可,别手贱全装,Jenkins 会慢得像用算盘跑 Docker。
第五步:和 GCP 深度谈恋爱 —— 不是单相思
装好 Google OAuth Plugin(登录对接 GSuite),Google Cloud Storage Plugin(备份 job config 和 build artifacts 到 GCS Bucket),再建个 Service Account:
- 进 IAM → 创建服务账号 → 给
Storage Object Admin+Cloud Build Editor角色; - 下载 JSON 密钥,上传到 Jenkins 服务器(
/opt/jenkins/gcp-key.json); - Jenkins 系统设置 → Google Cloud → 填入密钥路径 → 测试连接 ✅。
顺手把构建日志自动归档到 GCS:Job 配置 → 构建后操作 → 「Archive the artifacts」→ 勾选「Upload artifacts to Google Cloud Storage」→ 指定 bucket 和路径。从此再也不怕构建记录被磁盘撑爆清空。
更骚的操作:用 Cloud Build 当 webhook 触发器。在 GCP Console → Cloud Build → 触发器 → GitHub/GitLab → 关联仓库 → 设置构建配置文件 cloudbuild.yaml,内容里写:
steps:
- name: 'gcr.io/cloud-builders/curl'
args: ['--data', '', 'https://ci.yourdomain.com/job/your-job-name/build?token=YOUR_TOKEN']
再在 Jenkins Job 中开启「Trigger builds remotely」,填上 token。这样 Git Push 后,Cloud Build 先跑 lint/test,再通知 Jenkins 打包部署——流水线分层清晰,出问题好定位,不像以前所有事都挤在 Jenkins 里,debug 时像在拆炸弹。
最后送你三条保命口诀
- 「备份先行」:每周用
gsutil rsync -r /opt/jenkins/home gs://your-backup-bucket/jenkins/同步一次,比祈祷有用; - 「插件少装」:每多一个插件,Jenkins 启动慢 3 秒,内存多占 50MB,出问题概率 ×2;
- 「日志常看」:别等构建失败才翻
/opt/jenkins/home/logs/,每天扫一眼jenkins.log里有没有WARN或ERROR,早发现早治疗。
部署完成那一刻,你可以泡杯茶,看着 Jenkins 首页右上角那个绿色小球稳定跳动——它不再是你焦虑的源头,而是你自动化流水线里最老实的守门员。至于那只曾经蹲在 GCP 图标上的鸽子?它现在正帮你把构建成功的通知,咕咕咕地发到 Slack 频道里。

