# 持续集成

# 持续集成常用技术方案

以下是持续集成（**Continuous Integration, CI**）的常用技术实现方案，涵盖工具链、流程设计和最佳实践，帮助团队高效实现自动化构建、测试和部署：

---

### **一、核心工具链**

#### 1. **代码托管与版本控制**

- **GitHub/GitLab/Bitbucket**：托管代码，支持Webhook触发CI流程。
- **Git Submodules**：管理多仓库依赖。

#### 2. **CI/CD 平台**

- **Jenkins**：开源灵活，支持插件扩展（需自行搭建）。
- **GitHub Actions**：原生集成GitHub，YAML配置流水线。
- **GitLab CI/CD**：内置GitLab，支持多阶段流水线。
- **CircleCI**：云原生，快速配置（适合云项目）。
- **Travis CI**：老牌CI服务，支持开源免费。

#### 3. **构建与依赖管理**

- **Maven/Gradle**（Java）、**npm/Yarn**（JavaScript）、**pip/Poetry**（Python）。
- **Docker**：容器化构建环境，保证一致性。

#### 4. **测试工具**

- **单元测试**：JUnit（Java）、pytest（Python）、Jest（JS）。
- **集成测试**：Postman（API）、Selenium（UI）。
- **代码质量**：SonarQube、ESLint/Prettier。

#### 5. **部署与发布**

- **Kubernetes（k8s）**：容器编排，滚动更新。
- **Terraform**：基础设施即代码（IaC）。
- **Ansible/Chef**：配置管理自动化。

---

### **二、典型CI流程设计**

```mermaid
graph LR
  A[代码提交] --> B(触发CI)
  B --> C[代码拉取]
  C --> D[依赖安装]
  D --> E[代码构建]
  E --> F[自动化测试]
  F --> G{测试通过?}
  G -- 是 --> H[构建镜像/包]
  G -- 否 --> I[通知开发者]
  H --> J[部署到测试环境]
  J --> K[人工/自动化验收]
  K -- 通过 --> L[生产环境部署]

```

#### **关键阶段**：

1. **代码提交触发**：通过Git Hook或定时任务启动。
2. **环境一致性**：使用Docker或虚拟机隔离环境。
3. **测试分层**： 
    - 单元测试（快速反馈）。
    - 集成测试（验证模块交互）。
    - E2E测试（全流程验证）。
4. **制品管理**：存储构建产物（如Docker镜像、JAR包）到Nexus、Harbor等仓库。
5. **部署策略**：蓝绿部署、金丝雀发布（渐进式上线）。

---

### **三、技术方案示例**

#### **方案1：GitHub Actions（云原生）**

```yaml
# .github/workflows/ci.yml
name: CI Pipeline
on: [push]
jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install
      - run: npm run build
      - run: npm test
  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
      - run: kubectl apply -f k8s/deployment.yaml

```

#### **方案2：Jenkins + Docker（自建）**

```groovy
// Jenkinsfile
pipeline {
  agent { docker 'maven:3.8.6' }
  stages {
    stage('Build') {
      steps {
        sh 'mvn clean package'
      }
    }
    stage('Test') {
      steps {
        sh 'mvn test'
      }
    }
    stage('Deploy') {
      steps {
        sh 'docker build -t myapp .'
        sh 'docker push myrepo/myapp'
      }
    }
  }
}

```

---

### **四、最佳实践**

1. **快速反馈**：单元测试应在5分钟内完成。
2. **失败优先**：任何阶段失败立即终止流程。
3. **环境隔离**：开发、测试、生产环境严格分离。
4. **日志与监控**：集成ELK（日志）、Prometheus（指标）。
5. **安全扫描**：在CI中嵌入Trivy（镜像扫描）、OWASP ZAP（安全测试）。

---

### **五、扩展场景**

- **微服务CI**：每个服务独立流水线，通过API契约测试保证兼容性。
- **移动端CI**：Fastlane（iOS/Android自动化构建）、Firebase Test Lab。
- **Serverless**：AWS CodePipeline + Lambda，无服务器部署。

---

通过上述方案，团队可根据技术栈和规模选择合适工具，实现从代码提交到交付的全自动化流水线。

# 建 Jenkins 平台步骤

以下是搭建 **Jenkins 项目平台** 的完整步骤，涵盖 **安装、配置、流水线创建** 和 **自动化部署**，适用于 Linux/Windows 环境：

---

### **1. 安装 Jenkins**

#### **Linux (Ubuntu/CentOS)**

```bash
# 安装 Java (Jenkins 依赖)
sudo apt update && sudo apt install openjdk-11-jdk -y  # Ubuntu
sudo yum install java-11-openjdk -y                   # CentOS

# 添加 Jenkins 仓库并安装
curl -fsSL https://pkg.jenkins.io/debian/jenkins.io.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt update && sudo apt install jenkins -y

# 启动 Jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins

```

#### **Windows**

1. 下载 [Jenkins Windows Installer](https://www.jenkins.io/download/) 并运行。
2. 安装完成后，访问 `http://localhost:8080`。

---

### **2. 初始配置**

1. **解锁 Jenkins**  
    访问 `http://<服务器IP>:8080`，输入初始密码（路径在终端显示，通常为 `/var/lib/jenkins/secrets/initialAdminPassword`）。
2. **安装推荐插件**  
    选择 "Install suggested plugins"（包括 Git、Pipeline 等核心插件）。
3. **创建管理员账户**  
    设置用户名和密码。

---

### **3. 关键插件安装**

进入 **Manage Jenkins &gt; Plugins**，安装以下插件：

- **Git**：代码仓库集成。
- **Pipeline**：定义流水线任务。
- **Docker**：容器化构建支持。
- **Blue Ocean**：可视化流水线编辑器（可选）。
- **SSH Agent**：远程服务器部署。

---

### **4. 创建第一个流水线项目**

#### **方式1：自由风格项目**

1. **新建任务** &gt; 选择 "Freestyle project"。
2. **配置 Git 仓库**： 
    - 在 "Source Code Management" 中选择 Git，填写仓库 URL（如 `https://github.com/your-repo.git`）。
    - 添加凭据（GitHub 用户名/密码或 SSH 密钥）。
3. **构建触发器**： 
    - 定时构建：`H/5 * * * *`（每5分钟检查一次）。
    - GitHub Webhook：需在 GitHub 仓库设置中配置 Webhook URL（`http://<Jenkins-IP>:8080/github-webhook/`）。
4. **构建步骤**： 
    - 执行 Shell 命令（如 `mvn clean package`）或调用 Docker 构建。

#### **方式2：Pipeline 脚本（推荐）**

1. 新建任务 &gt; 选择 "Pipeline"。
2. 在 **Pipeline** 选项卡中，输入脚本示例： ```groovy
    pipeline {
        agent any
        stages {
            stage('Checkout') {
                steps {
                    git 'https://github.com/your-repo.git'
                }
            }
            stage('Build') {
                steps {
                    sh 'mvn clean package'
                }
            }
            stage('Test') {
                steps {
                    sh 'mvn test'
                }
            }
            stage('Deploy') {
                steps {
                    sh 'docker build -t myapp .'
                    sh 'docker push myrepo/myapp'
                }
            }
        }
    }
    
    ```

---

### **5. 集成 Docker 和 Kubernetes**

#### **Docker 构建**

1. 确保 Jenkins 服务器已安装 Docker，并将 Jenkins 用户加入 `docker` 组： ```bash
    sudo usermod -aG docker jenkins
    sudo systemctl restart jenkins
    
    ```
2. 在 Pipeline 中添加 Docker 步骤： ```groovy
    stage('Docker Build') {
        steps {
            script {
                docker.build("myapp:${env.BUILD_ID}").push()
            }
        }
    }
    
    ```

#### **Kubernetes 部署**

1. 安装 **Kubernetes CLI (kubectl)** 并配置 `~/.kube/config`。
2. 添加 Pipeline 阶段： ```groovy
    stage('Deploy to k8s') {
        steps {
            sh 'kubectl apply -f k8s/deployment.yaml'
        }
    }
    
    ```

---

### **6. 配置自动化触发**

#### **GitHub Webhook**

1. 在 GitHub 仓库 &gt; Settings &gt; Webhooks 中添加： 
    - Payload URL: `http://<Jenkins-IP>:8080/github-webhook/`
    - Content type: `application/json`
2. 在 Jenkins 任务中勾选 **"GitHub hook trigger for GITScm polling"**。

#### **Jenkinsfile（代码即配置）**

1. 在项目根目录创建 `Jenkinsfile`，提交到仓库。
2. Jenkins 任务选择 **"Pipeline script from SCM"**，指定仓库和文件路径。

---

### **7. 监控与安全**

- **日志查看**：  
    进入任务控制台输出界面，实时查看构建日志。
- **权限管理**：  
    **Manage Jenkins &gt; Configure Global Security**，启用 "Role-Based Strategy"。
- **备份**：  
    定期备份 `/var/lib/jenkins` 目录。

---

### **8. 常见问题解决**

- **权限不足**： ```bash
    sudo chown -R jenkins:jenkins /var/lib/jenkins
    
    ```
- **插件安装失败**：  
    更换 Jenkins 插件镜像源（**Manage Jenkins &gt; Plugin Manager &gt; Advanced**，修改 Update Site 为清华镜像）。
- **端口冲突**：  
    修改 Jenkins 端口： ```bash
    sudo systemctl edit jenkins
    # 添加 Environment="JENKINS_PORT=8081"
    sudo systemctl restart jenkins
    
    ```

---

### **总结**

- **快速开始**：通过 Docker 或包管理器一键安装 Jenkins。
- **核心能力**：通过 Pipeline 实现代码构建、测试、部署全自动化。
- **扩展性**：集成 Docker/K8s、GitHub Webhook 等现代工具链。

完成后，团队可实现代码提交后自动触发测试和部署，显著提升交付效率！ 🚀