🛠 今日目标
今天的目标是完成 Jenkins + SonarQube 以及相关工具的安装和基础配置,为后续 CI/CD 流水线打好基础。整个过程涉及 AWS、Terraform、Jenkins、SonarQube、WebHook、Docker 等 DevOps 关键技术栈。
📌 1. 今日操作步骤
1️⃣ Terraform 创建 AWS 资源
- 创建 VPC,并配置子网、路由表、Internet Gateway
- 创建 Security Group,开放 SSH、Jenkins、SonarQube、Docker 端口
- 创建 EC2 实例,安装 Jenkins + SonarQube
✅ 关键代码片段
hcl
复制编辑
resource "aws_instance" "my-ec2" {
ami = "ami-0e86e20dae9224db8"
instance_type = "t2.medium"
key_name = "key"
subnet_id = "subnet-09adda493fe309431"
vpc_security_group_ids = ["sg-0b91c4d4481f7d909"]
provisioner "remote-exec" {
connection {
type = "ssh"
private_key = file("./key.pem")
user = "ubuntu"
host = self.public_ip
}
inline = [
"sudo apt update -y",
"sudo apt install -y openjdk-17-jdk",
"sudo apt install -y docker.io",
"sudo usermod -aG docker ubuntu",
]
}
}
2️⃣ 安装和配置 Jenkins
-
通过
terraform apply成功创建 EC2 实例,并 SSH 连接进入服务器 -
安装 Jenkins
bash 复制编辑 sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list sudo apt-get update -y sudo apt-get install -y jenkins sudo systemctl start jenkins sudo systemctl enable jenkins -
获取 Jenkins 初始管理员密码
bash 复制编辑 sudo cat /var/lib/jenkins/secrets/initialAdminPassword
3️⃣ 安装和配置 SonarQube
-
安装 Docker 并启动 SonarQube
bash 复制编辑 sudo apt install -y docker.io sudo usermod -aG docker ubuntu sudo chmod 777 /var/run/docker.sock docker run -d --name sonar -p 9000:9000 sonarqube:lts-community -
访问 SonarQube
- 访问
http://<EC2_PUBLIC_IP>:9000 - 默认用户名/密码:
admin/admin - 强制修改密码
- 生成 WebHook Token 供 Jenkins 访问
- 访问
4️⃣ 配置 Security Group 端口
-
AWS Security Group 必须开放端口
22(SSH)8080(Jenkins)9000(SonarQube)80/443(如果后续有 Nginx 代理)
⚠️ 2. 遇到的问题与解决方案
❌ 1. VPCIdNotSpecified: No default VPC for this user
-
问题原因:
- 创建 Security Group 或 EC2 时,未明确指定
vpc_id
- 创建 Security Group 或 EC2 时,未明确指定
-
解决方案:
- 在 Security Group 和 EC2 资源中明确指定
vpc_id
hcl 复制编辑 vpc_id = aws_vpc.my-vpc.id - 在 Security Group 和 EC2 资源中明确指定
-
如何避免?
- 检查 Terraform 依赖关系,确保
aws_vpc在aws_security_group之前创建
- 检查 Terraform 依赖关系,确保
❌ 2. host for provisioner cannot be empty
-
问题原因:
- Terraform
remote-exec连接 EC2 时,host变量为空
- Terraform
-
解决方案:
- 使用
self.public_ip或self.private_ip
hcl 复制编辑 host = coalesce(self.public_ip, self.private_ip) - 使用
-
如何避免?
- 确保 EC2 配置 Public IP
- Security Group 开放 SSH 端口
❌ 3. SonarQube WebHook 未能正确触发
-
问题原因:
- Jenkins 无法访问 SonarQube API
-
解决方案:
- 在 Jenkins 中手动添加 SonarQube 服务器
- 在 SonarQube 中配置 WebHook 指向 Jenkins
📌 3. DevOps 实践提升
🧩 1. 遵循 DevOps 标准化流程
| 步骤 | 工具 |
|---|---|
| 基础设施管理 | Terraform, AWS |
| CI/CD 服务器 | Jenkins |
| 代码质量检测 | SonarQube |
| 容器化 & 部署 | Docker |
🛠 2. 如何让 DevOps 更高效?
-
配置自动化:
- 所有配置存入 GitHub
- Terraform 代码结构清晰
- Jenkins Pipeline 脚本化
-
提高可观测性:
- 监控 Jenkins 构建日志
- SonarQube 代码分析报告
-
自动化测试:
- 结合 JUnit、Selenium 进行 CI 测试
🎯 4. 明日计划
- 搭建完整的 Jenkins Pipeline
- GitHub Webhook 触发 Jenkins
- SonarQube 代码质量检测集成
- Docker 容器化应用部署
💡 5. 经验总结
✅ 今天掌握的知识点
- Terraform 自动化部署 AWS 资源
- Jenkins + SonarQube + Docker 环境配置
- 解决 Terraform 远程执行问题
- 配置 WebHook 让工具自动触发
🔍 如何高效学习 DevOps?
- 动手实践:DevOps 是一门实践性极强的技能
- 分析错误日志:每次遇到错误,分析日志找根因
- 搭建真实环境:用 AWS 搭建生产级 CI/CD 环境
🔹 结语
今天的 DevOps 之旅是 从零到 Jenkins + SonarQube 基础设施搭建,解决了多个问题,明天继续完成 CI/CD Pipeline 的完整搭建!