从零搭建 Jenkins + SonarQube 环境及 CI/CD 流水线:全流程复盘与经验总结

246 阅读3分钟

🛠 今日目标

今天的目标是完成 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 资源中明确指定 vpc_id
    hcl
    复制编辑
    vpc_id = aws_vpc.my-vpc.id
    
  • 如何避免?

    • 检查 Terraform 依赖关系,确保 aws_vpcaws_security_group 之前创建

❌ 2. host for provisioner cannot be empty

  • 问题原因

    • Terraform remote-exec 连接 EC2 时,host 变量为空
  • 解决方案

    • 使用 self.public_ipself.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 更高效?

  1. 配置自动化

    • 所有配置存入 GitHub
    • Terraform 代码结构清晰
    • Jenkins Pipeline 脚本化
  2. 提高可观测性

    • 监控 Jenkins 构建日志
    • SonarQube 代码分析报告
  3. 自动化测试

    • 结合 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 的完整搭建!