打造独一无二的 CI/CD 工厂:Java 应用的自动化之旅

embedded/2025/3/14 22:46:17/

好的,下面是一个更为丰富和详细的CICD(持续集成/持续交付)搭建流程,涵盖了各个应用和组件的操作过程及详细介绍。整个流程包括环境准备、各个组件的安装与配置、持续集成与交付流程、监控与报警系统以及安全性保障。

目录

  1. 环境准备
  2. 安装与配置各个组件
    • 2.1 安装Docker
    • 2.2 安装Docker Compose
    • 2.3 部署GitLab
    • 2.4 部署Jenkins
    • 2.5 部署Prometheus和Grafana
    • 2.6 部署ELK堆栈
  3. 配置CICD流水线
    • 3.1 配置GitLab仓库
    • 3.2 配置Jenkins
    • 3.3 创建Jenkins Pipeline
  4. 监控与报警系统
    • 4.1 配置Prometheus
    • 4.2 配置Grafana
    • 4.3 配置报警规则
  5. 安全性保障
  6. 示例项目与代码
  7. 总结

1. 环境准备

  • 服务器要求

    • 操作系统:CentOS 7.x
    • CPU:至少2核
    • 内存:至少8GB
    • 存储:至少50GB可用空间
    • 网络:确保服务器能够访问互联网
  • 网络配置

    • 开放所需端口:
      • GitLab:80, 443, 22(SSH),2224(自定义)
      • Jenkins:8080, 50000
      • Prometheus:9090
      • Grafana:3000
      • ELK相关端口(如9200, 9300, 5044, 5601)
  • 防火墙配置

    yum install -y firewalld
    systemctl start firewalld
    systemctl enable firewalld# 开放所需端口
    firewall-cmd --permanent --add-port=80/tcp
    firewall-cmd --permanent --add-port=443/tcp
    firewall-cmd --permanent --add-port=8080/tcp
    firewall-cmd --permanent --add-port=50000/tcp
    firewall-cmd --permanent --add-port=8829/tcp
    firewall-cmd --permanent --add-port=2224/tcp
    firewall-cmd --permanent --add-port=9090/tcp
    firewall-cmd --permanent --add-port=3000/tcp
    # 添加其他端口...firewall-cmd --reload
    

2. 安装与配置各个组件

2.1 安装Docker

# 卸载旧版本(如果有)
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine# 安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2# 添加Docker官方仓库
yum-config-manager \--add-repo \https://download.docker.com/linux/centos/docker-ce.repo# 安装Docker CE
yum install -y docker-ce docker-ce-cli containerd.io# 启动并启用Docker服务
systemctl start docker
systemctl enable docker# 验证安装
docker --version

2.2 安装Docker Compose

# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose# 验证安装
docker-compose --version

2.3 部署GitLab

  • 创建目录

    mkdir -p ~/gitlab/config ~/gitlab/logs ~/gitlab/data
    
  • 编写docker-compose.yml

    # docker-compose-gitlab.yml
    version: '3.6'services:gitlab:image: 'gitlab/gitlab-ce:latest'container_name: gitlabrestart: alwayshostname: '<your_server_ip>'environment:GITLAB_OMNIBUS_CONFIG: |external_url 'http://<your_server_ip>:8829'gitlab_rails['gitlab_shell_ssh_port'] = 2224ports:- '8829:80'- '2224:22'volumes:- ./gitlab/config:/etc/gitlab- ./gitlab/logs:/var/log/gitlab- ./gitlab/data:/var/opt/gitlab
    
  • 启动GitLab

    docker-compose -f docker-compose-gitlab.yml up -d
    
  • 访问GitLab
    打开浏览器,访问 http://<your_server_ip>:8829,按照提示设置root密码。

2.4 部署Jenkins

  • 创建目录

    mkdir -p ~/jenkins/jenkins_home
    
  • 编写docker-compose.yml

    # docker-compose-jenkins.yml
    version: '3.6'services:jenkins:image: 'jenkins/jenkins:lts'container_name: jenkinsrestart: alwaysports:- '8080:8080'- '50000:50000'volumes:- ./jenkins/jenkins_home:/var/jenkins_home
    
  • 启动Jenkins

    docker-compose -f docker-compose-jenkins.yml up -d
    
  • 访问Jenkins
    打开浏览器,访问 http://<your_server_ip>:8080,输入初始管理员密码(通过docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword获取),按照向导完成安装。

2.5 部署Prometheus和Grafana

  • 创建目录

    mkdir -p ~/prometheus/prometheus.yml
    mkdir -p ~/grafana/data
    
  • 编写Prometheus配置文件prometheus.yml

    global:scrape_interval: 15sscrape_configs:- job_name: 'prometheus'static_configs:- targets: ['localhost:9090']
    
  • 编写docker-compose.yml

    # docker-compose-prometheus-grafana.yml
    version: '3.6'services:prometheus:image: prom/prometheus:latestcontainer_name: prometheusrestart: alwaysports:- '9090:9090'volumes:- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.ymlgrafana:image: grafana/grafana:latestcontainer_name: grafanarestart: alwaysports:- '3000:3000'volumes:- ./grafana/data:/var/lib/grafana
    
  • 启动Prometheus和Grafana

    docker-compose -f docker-compose-prometheus-grafana.yml up -d
    
  • 访问Grafana
    打开浏览器,访问 http://<your_server_ip>:3000,默认用户名和密码为 admin,首次登录需要修改密码。

2.6 部署ELK堆栈

  • 编写docker-compose.yml

    # docker-compose-elk.yml
    version: '3.6'services:elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.17.3container_name: elasticsearchrestart: alwaysenvironment:- discovery.type=single-nodeports:- '9200:9200'- '9300:9300'volumes:- esdata:/usr/share/elasticsearch/datalogstash:image: docker.elastic.co/logstash/logstash:7.17.3container_name: logstashrestart: alwaysports:- '5044:5044'volumes:- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml- ./logstash/pipeline:/usr/share/logstash/pipelinekibana:image: docker.elastic.co/kibana/kibana:7.17.3container_name: kibanarestart: alwaysports:- '5601:5601'environment:ELASTICSEARCH_URL: http://elasticsearch:9200volumes:esdata:
    
  • 配置Logstash(示例logstash.conf):

    input {beats {port => 5044}
    }output {elasticsearch {hosts => ["elasticsearch:9200"]index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+yyyy.MM.dd}"}
    }
    
  • 启动ELK堆栈

    docker-compose -f docker-compose-elk.yml up -d
    
  • 访问Kibana
    打开浏览器,访问 http://<your_server_ip>:5601,按照向导完成配置。

3. 配置CICD流水线

3.1 配置GitLab仓库

  • 创建新项目
    在GitLab界面创建一个新的项目,选择“Create a blank project”,记下项目的HTTPS或SSH URL。

  • 初始化本地仓库(在开发机器上):

    git init
    git remote add origin <your_gitlab_repo_url>
    

3.2 配置Jenkins

  • 安装必要的插件

    • GitLab Plugin
    • Docker Pipeline
    • Prometheus Plugin
    • 其他相关插件
  • 配置GitLab连接

    1. 进入Jenkins管理界面:系统管理 -> 系统设置
    2. 找到GitLab部分,添加GitLab服务器,配置URL和API Token(在GitLab用户设置中生成)。
  • 配置Docker
    确保Jenkins服务器上已安装Docker,并且Jenkins用户有权限执行Docker命令。

3.3 创建Jenkins Pipeline

  • 使用Jenkinsfile定义流水线

    在项目根目录创建Jenkinsfile

    pipeline {agent anyenvironment {GIT_REPO = '<your_gitlab_repo_url>'DOCKER_IMAGE = 'your_dockerhub_username/your_image_name'DOCKER_TAG = "${env.BUILD_NUMBER}"}stages {stage('Checkout') {steps {git url: "${GIT_REPO}", branch: 'master'}}stage('Build') {steps {sh 'mvn clean package -DskipTests'}}stage('Test') {steps {sh 'mvn test'}}stage('Docker Build & Push') {steps {withCredentials([usernamePassword(credentialsId: 'docker-hub', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {sh 'docker build -t ${DOCKER_IMAGE}:${DOCKER_TAG} .'sh 'docker login -u $DOCKER_USER -p $DOCKER_PASS'sh 'docker push ${DOCKER_IMAGE}:${DOCKER_TAG}'}}}stage('Deploy') {steps {sh 'ansible-playbook deploy.yml --extra-vars "image=${DOCKER_IMAGE}:${DOCKER_TAG}"'}}}post {success {// 发送通知}failure {// 发送报警}}
    }
    
  • 配置Ansible Playbook(deploy.yml)

    ---
    - hosts: productionbecome: yestasks:- name: 停止旧版本容器docker_container:name: your_app_namestate: absent- name: 启动新版本容器docker_container:name: your_app_nameimage: "{{ image }}"ports:- "80:80"restart_policy: always
    

4. 监控与报警系统

4.1 配置Prometheus

  • 添加监控目标
    在Prometheus的prometheus.yml中添加需要监控的服务,如Jenkins、GitLab等。

  • 示例添加Jenkins监控

    scrape_configs:- job_name: 'jenkins'static_configs:- targets: ['<your_server_ip>:8080']
    

4.2 配置Grafana

  • 添加数据源

    1. 访问Grafana界面,进入Configuration -> Data Sources
    2. 添加Prometheus数据源,输入Prometheus服务器的URL。
  • 导入仪表盘

    1. 在Grafana界面,点击+ -> Import
    2. 输入Jenkins、GitLab等组件的Dashboard JSON模板,导入预设的监控仪表盘。

4.3 配置报警规则

  • 在Prometheus中配置报警规则

    创建prometheus.rules.yml

    groups:- name: examplerules:- alert: HighCPUUsageexpr: rate(node_cpu_seconds_total{mode="system"}[5m]) > 80for: 1mlabels:severity: warningannotations:summary: "High CPU usage detected on {{ $labels.instance }}"description: "CPU usage is above 80% for more than 1 minute."
    
  • 重启Prometheus以应用新的报警规则。

  • 在Grafana中配置报警通知

    1. 进入Alerting -> Notification channels,添加通知渠道(如Email、Slack等)。
    2. 配置报警策略,关联报警规则与通知渠道。

5. 安全性保障

5.1 自动化安全扫描

  • 集成SonarQube

    1. 部署SonarQube(使用Docker):

      # docker-compose-sonarqube.yml
      version: '3.6'services:sonarqube:image: sonarqube:latestcontainer_name: sonarquberestart: alwaysports:- '9000:9000'environment:- SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar- SONARQUBE_JDBC_USERNAME=sonar- SONARQUBE_JDBC_PASSWORD=sonarvolumes:- sonarqube_data:/opt/sonarqube/data- sonarqube_extensions:/opt/sonarqube/extensionsvolumes:sonarqube_data:sonarqube_extensions:
      
    2. 配置Jenkins与SonarQube集成

      • 安装SonarQube插件。
      • 在Jenkins中配置SonarQube服务器信息。
      • Jenkinsfile中添加SonarQube扫描步骤。
  • 示例Jenkinsfile添加SonarQube扫描

    stage('SonarQube Analysis') {steps {withSonarQubeEnv('SonarQube') {sh 'mvn sonar:sonar'}}
    }
    

5.2 权限控制

  • GitLab权限管理

    • 使用GitLab内置的角色和权限系统,为不同用户分配适当的访问权限。
    • 配置项目级别的访问控制,确保只有授权人员可以修改代码和触发流水线。
  • Jenkins权限管理

    • 安装并配置Role Strategy Plugin,定义不同的用户角色和权限。
    • 限制对关键操作的访问,如部署到生产环境。
  • Docker和Kubernetes安全

    • 使用最小权限原则,限制容器和服务的权限。
    • 配置网络策略,限制服务之间的通信。

6. 示例项目与代码

为了更好地理解整个CICD流程,下面提供一个简单的Java Spring Boot示例项目,并展示如何集成上述CICD流程。

6.1 示例项目结构

my-app/
├── src/
│   ├── main/
│   │   ├── java/com/example/demo/
│   │   │   └── DemoApplication.java
│   │   └── resources/
│   │      
├── pom.xml
├── .gitignore好的,接下来是剩余部分的详细说明:### 6.2 示例项目代码#### 6.2.1 创建Spring Boot项目你可以使用Spring Initializr(https://start.spring.io/)来创建一个新的Spring Boot项目。选择以下选项:- **Project:** Maven Project
- **Language:** Java
- **Packaging:** Jar
- **Java:** 11 或更高
- **Dependencies:** Web, Lombok下载生成的项目压缩包并解压。#### 6.2.2 编写示例代码在`src/main/java/com/example/demo`目录下,编辑`DemoApplication.java`文件,添加一个简单的REST端点:```java
package com.example.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}@RestControllerclass HelloController {@GetMapping("/hello")public String sayHello() {return "Hello, World!";}}
}

6.3 配置GitLab仓库

  1. 创建新项目:在GitLab界面创建一个新的项目,选择“Create a blank project”,记下项目的HTTPS或SSH URL。

  2. 初始化本地仓库(在开发机器上):

    cd my-app
    git init
    git remote add origin <your_gitlab_repo_url>
    
  3. 提交代码

    git add .
    git commit -m "Initial commit"
    git push -u origin master
    

6.4 配置Jenkins

  1. 安装必要的插件

    • GitLab Plugin:用于与GitLab集成。
    • Docker Pipeline:用于构建和推送Docker镜像。
    • Prometheus Plugin:用于监控Jenkins。
    • SonarQube Plugin:用于代码质量分析。
  2. 配置GitLab连接

    • 进入Jenkins管理界面:系统管理 -> 系统设置
    • 找到GitLab部分,添加GitLab服务器,配置URL和API Token(在GitLab用户设置中生成)。
  3. 配置Docker

    • 确保Jenkins服务器上已安装Docker,并且Jenkins用户有权限执行Docker命令。

6.5 创建Jenkins Pipeline

在项目根目录创建Jenkinsfile

pipeline {agent anyenvironment {GIT_REPO = '<your_gitlab_repo_url>'DOCKER_IMAGE = 'your_dockerhub_username/your_image_name'DOCKER_TAG = "${env.BUILD_NUMBER}"}stages {stage('Checkout') {steps {git url: "${GIT_REPO}", branch: 'master'}}stage('Build') {steps {sh 'mvn clean package -DskipTests'}}stage('Test') {steps {sh 'mvn test'}}stage('SonarQube Analysis') {steps {withSonarQubeEnv('SonarQube') {sh 'mvn sonar:sonar'}}}stage('Docker Build & Push') {steps {withCredentials([usernamePassword(credentialsId: 'docker-hub', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {sh 'docker build -t ${DOCKER_IMAGE}:${DOCKER_TAG} .'sh 'docker login -u $DOCKER_USER -p $DOCKER_PASS'sh 'docker push ${DOCKER_IMAGE}:${DOCKER_TAG}'}}}stage('Deploy') {steps {sh 'ansible-playbook deploy.yml --extra-vars "image=${DOCKER_IMAGE}:${DOCKER_TAG}"'}}}post {success {echo 'Pipeline succeeded!'}failure {echo 'Pipeline failed!'}}
}

6.6 配置Ansible Playbook(deploy.yml)

在项目根目录创建deploy.yml文件:

---
- hosts: productionbecome: yestasks:- name: 停止旧版本容器docker_container:name: your_app_namestate: absent- name: 启动新版本容器docker_container:name: your_app_nameimage: "{{ image }}"ports:- "80:80"restart_policy: always

6.7 配置Prometheus和Grafana监控

  1. 配置Prometheus

    • 在Prometheus的prometheus.yml中添加Jenkins和GitLab的监控目标:

      scrape_configs:- job_name: 'jenkins'static_configs:- targets: ['<your_server_ip>:8080']- job_name: 'gitlab'static_configs:- targets: ['<your_server_ip>:8829']
      
  2. 配置Grafana

    • 添加Prometheus数据源:

      1. 访问Grafana界面,进入Configuration -> Data Sources
      2. 添加Prometheus数据源,输入Prometheus服务器的URL。
    • 导入Jenkins和GitLab的监控仪表盘:

      1. 在Grafana界面,点击+ -> Import
      2. 输入Jenkins和GitLab的Dashboard JSON模板,导入预设的监控仪表盘。

6.8 配置报警规则

  1. 在Prometheus中配置报警规则

    创建prometheus.rules.yml文件:

    groups:- name: examplerules:- alert: JenkinsBuildFailedexpr: Jenkins_builds_last_status == "FAILURE"for: 1mlabels:severity: warningannotations:summary: "Jenkins build failed"description: "A Jenkins build has failed for more than 1 minute."- alert: GitLabBuildFailedexpr: gitlab_pipeline_last_status == "failed"for: 1mlabels:severity: warningannotations:summary: "GitLab pipeline failed"description: "A GitLab pipeline has failed for more than 1 minute."
    
  2. 重启Prometheus以应用新的报警规则。

  3. 在Grafana中配置报警通知

    • 进入Alerting -> Notification channels,添加通知渠道(如Email、Slack等)。
    • 配置报警策略,关联报警规则与通知渠道。

6.9 安全性保障

  1. 自动化安全扫描

    • 部署SonarQube(使用Docker):

      # docker-compose-sonarqube.yml
      version: '3.6'services:sonarqube:image: sonarqube:latestcontainer_name: sonarquberestart: alwaysports:- '9000:9000'environment:- SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/sonar- SONARQUBE_JDBC_USERNAME=sonar- SONARQUBE_JDBC_PASSWORD=sonarvolumes:- sonarqube_data:/opt/sonarqube/data- sonarqube_extensions:/opt/sonarqube/extensionsvolumes:sonarqube_data:sonarqube_extensions:
      
    • 配置Jenkins与SonarQube集成:

      • 安装SonarQube插件。

      • 在Jenkins中配置SonarQube服务器信息。

      • Jenkinsfile中添加SonarQube扫描步骤:

        stage('SonarQube Analysis') {steps {withSonarQubeEnv('SonarQube') {sh 'mvn sonar:sonar'}}
        }
        
  2. 权限控制

    • GitLab权限管理

      • 使用GitLab内置的角色和权限系统,为不同用户分配适当的访问权限。
      • 配置项目级别的访问控制,确保只有授权人员可以修改代码和触发流水线。
    • Jenkins权限管理

      • 安装并配置Role Strategy Plugin,定义不同的用户角色和权限。
      • 限制对关键操作的访问,如部署到生产环境。
    • Docker和Kubernetes安全

      • 使用最小权限原则,限制容器和服务的权限。
      • 配置网络策略,限制服务之间的通信。

7. 总结

通过以上步骤,你已经成功搭建了一个完整的CI/CD系统,涵盖了从环境准备、各个组件的安装与配置、持续集成与交付流程、监控与报警系统以及安全性保障。这个系统可以帮助你实现代码的自动化构建、测试和部署,提高开发效率和代码质量。


http://www.ppmy.cn/embedded/172597.html

相关文章

OpenSource - Apache POI 的 Word 模板引擎 poi-tl

文章目录 概述地址Word模板引擎功能Getting Started前提MavenGradle2分钟入门Template&#xff1a;模板Data-model&#xff1a;数据Output&#xff1a;输出 概述 该项目是基于 Apache POI 的 Word 模板引擎&#xff0c;可以动态生成 Word 文档。它提供了友好的 API&#xff0c…

机器学习模型-从线性回归到神经网络

在当今的数据驱动世界中&#xff0c;机器学习模型是许多应用程序的核心。无论是推荐系统、图像识别&#xff0c;还是自动驾驶汽车&#xff0c;机器学习技术都在背后发挥着重要作用。在这篇文章中&#xff0c;我们将探索几种基础的机器学习模型&#xff0c;并了解它们的基本原理…

Mysql_DML

1.DML概述&#xff1a; 英文全称为DataManipulationLanguage&#xff08;数据操作语言&#xff09;&#xff0c;用来对数据库中的表中的数据记录进行增删改的操作 2.基本操作 &#xff08;1&#xff09;.添加数据&#xff08;insert&#xff09; 在指定字段中添加数据&#…

FPGA基础 -- 仿真初识

什么是仿真&#xff08;Simulation&#xff09;&#xff1f; 在 FPGA 开发 中&#xff0c;仿真&#xff08;Simulation&#xff09; 是指在硬件电路真正部署到 FPGA 之前&#xff0c;通过 计算机软件 来模拟 FPGA 设计的功能和时序&#xff0c;以验证设计的正确性。仿真主要用…

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线&#xff0c;一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线&#xff0c;插入手机充电口&#xff08;可能会需要转接头&#xff09; 然后确保手机开机 按下键盘…

Kotlin高效实现 Android ViewPager2 顶部导航:动态配置与性能优化指南

高效实现&#xff1a;强调代码的性能优化。Android ViewPager2&#xff1a;明确技术栈。顶部导航&#xff1a;核心功能点。动态配置与性能优化指南&#xff1a;突出动态配置的灵活性和性能优化的重点。 在 Android 开发中&#xff0c;使用 ViewPager2 实现高效的顶部导航&…

深度学习正则化技术之权重衰减法、暂退法(通俗易懂版)

一、影响模型泛性的因素有&#xff1f;什么是正则化技术&#xff1f;有什么用&#xff1f; 通常&#xff0c;影响模型泛化能力的因素有&#xff1a; 可调节参数的个数&#xff1a;可调节的参数过少&#xff0c;会造成模型过于简单&#xff0c;欠拟合&#xff1b;过多&#xf…

数据中心安全建设方案,数据安全运营体系建设方案,信息中心安全解决方案(PPT)

1. 项目简介 项目背景 项目建设思路 项目建设内容 项目建设目标 2. 技术平台建设方案 监控范围 平台架构 安全模型 部署示意图 详细方案 3. 人员流程制度建设方案 人员建设规划 流程建设规划 制度建设规划 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行…