我想做一个 Jenkins自动化编译服务器的搭建和使用 ,给公司内部使用,针对的是SDK开发,涉及平台有:Windows、Linux_x86架构、Linux arm架构、Android、iOS。我目前有一些编译的依赖库,还有一些编译的脚本,现在是想实现自动化的将开发组的代码从指定svn路径拉取后,结合本地路径下的依赖库,用户选择开发分支和需要平台的编译脚本,将编好的库文件放到大网服务器//nt03指定目录下,然后给内网用户发送邮件进行提醒。
时间: 2025-07-29 16:19:06 AIGC 浏览: 18
<think>我们正在为一家公司搭建Jenkins自动化编译服务器,目标包括:
1. 从SVN拉取SDK代码
2. 集成本地依赖库(可能涉及不同平台的依赖)
3. 支持多平台编译:Windows, Linux x86, Linux ARM, Android, iOS
4. 运行指定分支和对应编译脚本
5. 输出构建结果到网络路径(如//nt03)
6. 发送邮件通知
由于Jenkins本身是一个强大的持续集成工具,我们可以通过以下步骤实现:
### 步骤1: 安装和配置Jenkins
- 安装Jenkins:根据操作系统(如Ubuntu、Windows等)安装Jenkins。建议使用长期支持版本(LTS)。
- 安装必要插件:
- Subversion Plugin:用于从SVN拉取代码。
- Email Extension Plugin:用于发送邮件通知。
- 平台相关构建工具插件(如Xcode插件用于iOS,Android插件,以及SSH插件用于远程Linux构建等)。
- Pipeline插件(用于编写流水线脚本)。
### 步骤2: 配置全局工具
在Jenkins的“全局工具配置”中配置:
- JDK(如果使用Java)
- Git(虽然我们用SVN,但有时脚本可能需要)
- 构建工具(如Maven、Gradle等,根据项目需要)
- 对于Android:配置Android SDK路径
- 对于iOS:配置Xcode版本
### 步骤3: 配置节点(可选)
由于需要多平台构建,我们可能需要配置多个构建节点(agent):
- 主节点(Master):通常用于调度任务,不建议直接执行构建。
- 构建节点(Agent):
- Windows节点:用于Windows平台构建。
- Linux节点(x86):用于Linux x86构建。
- Linux节点(ARM):可以是物理设备或交叉编译,如果使用交叉编译则可以在x86节点上完成,否则需要ARM节点(如树莓派或ARM服务器)。
- Android节点:通常可以在Linux或Windows节点上完成,需要安装Android SDK和NDK。
- iOS节点:必须使用macOS节点(因为Xcode只能在Mac上运行)。
因此,我们需要至少设置以下节点:
1. Windows节点
2. Linux节点(x86)
3. macOS节点(用于iOS构建)
4. (可选)单独的Linux ARM节点,如果需要在ARM设备上构建的话。
注意:如果使用交叉编译,Linux ARM的构建可以在Linux x86节点上完成。
### 步骤4: 创建Jenkins任务
我们可以为每个平台创建一个单独的任务,或者使用一个多配置任务(Matrix)或者使用Pipeline(推荐)来统一管理。
#### 推荐使用Pipeline(Jenkinsfile)
使用Pipeline可以定义整个构建过程,包括拉取代码、构建、部署和发送邮件。
##### 示例Pipeline脚本(Jenkinsfile)结构:
```groovy
pipeline {
agent none // 在具体阶段指定agent
parameters {
string(name: 'BRANCH', defaultValue: 'trunk', description: '要构建的分支')
choice(name: 'PLATFORM', choices: ['Windows', 'Linux_x86', 'Linux_arm', 'Android', 'iOS'], description: '选择构建平台')
}
stages {
stage('拉取代码') {
steps {
checkout([$class: 'SubversionSCM',
locations: [[credentialsId: 'svn-cred',
depthOption: 'infinity',
ignoreExternalsOption: true,
local: '.',
remote: "svn://svn-server/sdk/${params.BRANCH}"]],
workspaceUpdater: [$class: 'UpdateUpdater']])
}
}
stage('集成依赖库') {
steps {
// 根据平台执行不同的依赖集成脚本
script {
if (params.PLATFORM == 'Windows') {
bat 'call integrate_dependencies.bat'
} else if (params.PLATFORM == 'iOS') {
sh './integrate_dependencies_ios.sh'
} else {
// 其他平台
sh './integrate_dependencies.sh'
}
}
}
}
stage('构建') {
steps {
script {
// 根据平台选择agent并执行构建脚本
def label = ""
if (params.PLATFORM == 'Windows') {
label = "windows"
node(label) {
bat 'call build_windows.bat'
}
} else if (params.PLATFORM == 'Linux_x86') {
label = "linux-x86"
node(label) {
sh './build_linux_x86.sh'
}
} else if (params.PLATFORM == 'Linux_arm') {
label = "linux-arm" // 或者使用交叉编译在x86节点上构建
node(label) {
sh './build_linux_arm.sh'
}
} else if (params.PLATFORM == 'Android') {
label = "android" // 可以是linux节点或windows节点
node(label) {
sh './build_android.sh'
}
} else if (params.PLATFORM == 'iOS') {
label = "macos"
node(label) {
sh './build_ios.sh'
}
}
}
}
}
stage('部署到网络路径') {
steps {
script {
// 假设构建产物在各自的构建脚本中已经放在某个目录下
// 将构建产物复制到网络路径 //nt03
// 注意:需要确保Jenkins节点有权限写入该网络路径
def destPath = "//nt03/builds/${params.PLATFORM}/${BUILD_NUMBER}/"
if (isUnix()) {
sh "mkdir -p ${destPath}"
sh "cp -R output/* ${destPath}"
} else {
bat "mkdir ${destPath}"
bat "xcopy output\\* ${destPath} /E /Y"
}
}
}
}
}
post {
always {
// 发送邮件通知,无论成功或失败
emailext body: '构建详情: ${BUILD_URL}',
subject: '构建结果: ${JOB_NAME} - ${BUILD_NUMBER} - ${currentBuild.currentResult}',
to: '[email protected]'
}
}
}
```
### 步骤5: 配置依赖库集成
- 本地依赖库:可以放在网络路径上,然后在构建时通过脚本从网络路径复制到工作空间;或者使用依赖管理工具(如Maven、NuGet等)管理。
- 在构建脚本中(如`integrate_dependencies.bat`或`.sh`)编写逻辑,将依赖库复制到正确位置。
### 步骤6: 配置邮件通知
- 在Jenkins系统配置中配置SMTP服务器。
- 使用Email Extension Plugin可以定制邮件内容。
### 步骤7: 配置网络路径访问
- 确保所有构建节点都有权限读写网络路径`//nt03`。
- 在Windows节点上,可能需要映射网络驱动器;在Linux节点上,可能需要挂载SMB共享。
### 注意事项
1. **安全性**:使用Jenkins的凭据管理存储SVN账号密码以及网络路径的访问凭证。
2. **构建脚本**:为每个平台编写构建脚本(如批处理文件或shell脚本),并在Pipeline中调用。
3. **分支参数化**:通过参数化构建,允许选择分支。
4. **并发构建**:如果同时构建多个平台,注意资源分配。
### 常见问题处理
- **节点连接问题**:确保主节点和代理节点之间的网络畅通,且代理节点已正确启动。
- **权限问题**:确保Jenkins服务运行账户有足够权限访问SVN、网络路径和本地依赖库。
- **构建环境问题**:每个构建节点需要安装对应平台所需的编译工具(如Visual Studio、gcc、Xcode等)。
通过以上步骤,即可搭建一个满足需求的Jenkins自动化编译服务器。
§§相关问题§§
1. Jenkins Pipeline 中如何管理多个节点的构建任务?
2. 如何配置 Jenkins 节点以支持不同平台的构建?
3. 在 Jenkins 中如何安全地管理凭证(如 SVN 密码、网络路径访问凭证)?
4. 如何优化 Jenkins 多平台构建的性能?</think>### 搭建 Jenkins 自动化编译服务器指南
#### **1. 基础环境部署**
- **安装 Jenkins**
下载 Jenkins WAR 包或使用系统包管理器安装(如 Ubuntu:`sudo apt install jenkins`)。
启动后通过 `http://localhost:8080` 完成初始化,安装推荐插件[^1]。
- **关键插件安装**
在 *Manage Jenkins > Plugins* 中安装:
- Subversion Plugin(SVN 支持)
- Email Extension Plugin(邮件通知)
- Platform-specific 插件(如 Xcode 用于 iOS,Android Emulator 插件)
- Pipeline(流水线任务管理)
- Publish Over SSH(远程文件部署)[^1]
---
#### **2. 多平台编译环境配置**
- **节点管理**
为不同平台添加构建节点(*Manage Jenkins > Nodes*):
- **Windows 节点**:安装 JDK、编译工具链(如 MSVC)
- **Linux_x86/Linux_arm 节点**:安装交叉编译工具链(如 `gcc-arm-linux-gnueabihf`)
- **Android 节点**:配置 Android SDK/NDK
- **iOS 节点**:需 macOS 设备,安装 Xcode 和开发者证书
- **全局工具配置**
在 *Global Tool Configuration* 中设置:
- JDK 路径
- Git/SVN 可执行文件
- 平台编译工具(如 CMake、Gradle)
---
#### **3. 流水线任务实现**
创建 **Pipeline 类型任务**,使用 Jenkinsfile 定义多阶段流程:
```groovy
pipeline {
agent any
parameters {
string(name: 'BRANCH', defaultValue: 'trunk', description: 'SVN 分支名')
choice(name: 'PLATFORM', choices: ['Windows', 'Linux_x86', 'Linux_arm', 'Android', 'iOS'], description: '目标平台')
}
stages {
stage('拉取代码') {
steps {
checkout([$class: 'SubversionSCM',
locations: [[credentialsId: 'svn-creds',
remote: "svn://your-repo/sdk/${params.BRANCH}"]]])
}
}
stage('集成依赖库') {
steps {
// 示例:Windows 平台依赖处理
script {
if (params.PLATFORM == 'Windows') {
bat 'copy "\\\\dep-server\\libs\\*.dll" .\\libs\\'
}
// 其他平台类似
}
}
}
stage('编译') {
steps {
script {
switch(params.PLATFORM) {
case 'Windows':
bat 'call build_win.bat'
break
case 'Android':
sh './gradlew assembleRelease'
break
// 其他平台编译脚本
}
}
}
}
stage('部署产物') {
steps {
// 推送到网络路径 //nt03
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'nt03-server',
transfers: [
sshTransfer(
sourceFiles: 'build/output/**',
remoteDirectory: "/sdk_builds/${params.PLATFORM}/${BUILD_NUMBER}"
)
]
)
]
)
}
}
}
post {
always {
emailext body: "构建结果: ${currentBuild.currentResult}\n详情: ${BUILD_URL}",
subject: "SDK构建通知 - ${params.PLATFORM}",
to: '[email protected]'
}
}
}
```
---
#### **4. 关键配置详解**
- **SVN 凭证管理**
在 *Manage Jenkins > Credentials* 添加 SVN 账号密码,ID 设为 `svn-creds`[^1]。
- **网络路径部署**
1. 配置 **Publish Over SSH**:
- *Manage Jenkins > Configure System* 添加 SSH 服务器(//nt03 对应的 IP 和凭证)
- 命名配置为 `nt03-server`
2. 确保 Jenkins 节点有写入权限。
- **邮件通知**
在 *Email Extension* 中配置 SMTP 服务器,使用 `${currentBuild.currentResult}` 动态填充状态[^1]。
---
#### **5. 依赖库集成方案**
- **本地依赖库处理**
- 将依赖库(如 `.so`/`.a` 文件)集中存储在共享路径(如 `//dep-server/libs`)
- 在流水线中通过平台脚本复制到工作空间:
```bash
# Linux 示例
cp /mnt/dep-server/libs/arm/*.so ./libs/
```
---
#### **6. 测试与优化**
1. 手动触发参数化构建,测试各平台流程。
2. 添加单元测试阶段,确保编译质量。
3. 使用 **Blue Ocean 插件** 可视化流水线状态。
4. 配置构建资源池,避免资源争用。
---
### 注意事项
- **iOS 构建限制**:需在 macOS 节点上操作,且必须配置开发者证书签名。
- **权限控制**:使用 Jenkins 的 Role-Based 策略管理访问权限。
- **构建缓存**:对大型 SDK 启用缓存加速(如 `ccache`)。
阅读全文
相关推荐




















