再次尝试自动配置
This commit is contained in:
parent
9226104031
commit
3e7b7bceca
27
Jenkinsfile
vendored
27
Jenkinsfile
vendored
@ -9,7 +9,9 @@ pipeline {
|
|||||||
|
|
||||||
tools {
|
tools {
|
||||||
go 'go' // 使用Jenkins手动配置的Go工具
|
go 'go' // 使用Jenkins手动配置的Go工具
|
||||||
'hudson.plugins.sonar.SonarRunnerInstallation' 'sonarQube' // 使用Jenkins配置的SonarQube工具
|
// 🔧 添加SonarQube Scanner工具声明
|
||||||
|
// 这里的'sonarQube'必须与Jenkins全局工具配置中的名称完全一致
|
||||||
|
sonarRunnerInstallation 'sonarQube' // 使用Jenkins配置的SonarQube Scanner
|
||||||
}
|
}
|
||||||
|
|
||||||
environment {
|
environment {
|
||||||
@ -154,25 +156,17 @@ pipeline {
|
|||||||
// 使用withSonarQubeEnv包裹,自动配置sonar-scanner环境
|
// 使用withSonarQubeEnv包裹,自动配置sonar-scanner环境
|
||||||
withSonarQubeEnv('sonarQube') {
|
withSonarQubeEnv('sonarQube') {
|
||||||
sh '''
|
sh '''
|
||||||
echo "检查SonarQube环境变量..."
|
echo "=== SonarQube环境信息 ==="
|
||||||
echo "SONAR_SCANNER_HOME: $SONAR_SCANNER_HOME"
|
echo "SONAR_SCANNER_HOME: $SONAR_SCANNER_HOME"
|
||||||
|
echo "SONAR_HOST_URL: $SONAR_HOST_URL"
|
||||||
echo "PATH: $PATH"
|
echo "PATH: $PATH"
|
||||||
|
|
||||||
# 直接使用配置的sonar-scanner
|
# 直接使用sonar-scanner命令(Jenkins工具管理会自动设置PATH)
|
||||||
if [ -n "$SONAR_SCANNER_HOME" ] && [ -f "$SONAR_SCANNER_HOME/bin/sonar-scanner" ]; then
|
echo "✅ 使用Jenkins管理的SonarQube Scanner"
|
||||||
SCANNER_PATH="$SONAR_SCANNER_HOME/bin/sonar-scanner"
|
|
||||||
else
|
|
||||||
echo "❌ SONAR_SCANNER_HOME未正确配置"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "✅ 使用sonar-scanner: $SCANNER_PATH"
|
# 运行SonarQube扫描 - 直接使用sonar-scanner命令
|
||||||
|
sonar-scanner \
|
||||||
# 运行SonarQube扫描
|
|
||||||
"$SCANNER_PATH" \
|
|
||||||
-Dsonar.projectKey=${SONAR_PROJECT_KEY} \
|
-Dsonar.projectKey=${SONAR_PROJECT_KEY} \
|
||||||
-Dsonar.host.url=${SONAR_HOST_URL} \
|
|
||||||
-Dsonar.login=${SONAR_TOKEN} \
|
|
||||||
-Dsonar.projectName="Golang Demo" \
|
-Dsonar.projectName="Golang Demo" \
|
||||||
-Dsonar.projectVersion=${BUILD_NUMBER} \
|
-Dsonar.projectVersion=${BUILD_NUMBER} \
|
||||||
-Dsonar.sources=. \
|
-Dsonar.sources=. \
|
||||||
@ -181,8 +175,7 @@ pipeline {
|
|||||||
-Dsonar.test.inclusions=**/*_test.go \
|
-Dsonar.test.inclusions=**/*_test.go \
|
||||||
-Dsonar.test.exclusions=**/vendor/** \
|
-Dsonar.test.exclusions=**/vendor/** \
|
||||||
-Dsonar.go.coverage.reportPaths=coverage.out \
|
-Dsonar.go.coverage.reportPaths=coverage.out \
|
||||||
-Dsonar.sourceEncoding=UTF-8 \
|
-Dsonar.sourceEncoding=UTF-8
|
||||||
-Dsonar.language=go
|
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
echo "✅ SonarQube代码扫描完成"
|
echo "✅ SonarQube代码扫描完成"
|
||||||
|
186
docs/jenkins-sonarqube-optimization.md
Normal file
186
docs/jenkins-sonarqube-optimization.md
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
# 📊 Jenkins SonarQube Scanner 优化指南
|
||||||
|
|
||||||
|
## 🔍 问题分析
|
||||||
|
|
||||||
|
### 原因
|
||||||
|
|
||||||
|
虽然在 Jenkins 全局工具配置中设置了 SonarQube Scanner 自动安装,但 Pipeline 没有正确声明使用该工具,导致:
|
||||||
|
|
||||||
|
1. **重复下载**:每次构建都下载 Scanner 和插件
|
||||||
|
2. **路径查找**:手动查找 Scanner 路径,绕过 Jenkins 工具管理
|
||||||
|
3. **性能问题**:下载时间长达 5-7 分钟
|
||||||
|
|
||||||
|
## ✅ 解决方案
|
||||||
|
|
||||||
|
### 1. 正确的 Jenkins 全局配置
|
||||||
|
|
||||||
|
在 `Manage Jenkins` > `Global Tool Configuration` > `SonarQube Scanner` 中:
|
||||||
|
|
||||||
|
```
|
||||||
|
名称: sonarQube (重要:这个名称要与Jenkinsfile中一致)
|
||||||
|
自动安装: ✅ 勾选
|
||||||
|
版本: SonarQube Scanner 7.1.0.4889
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Jenkinsfile 优化
|
||||||
|
|
||||||
|
#### ✅ **正确的工具声明**
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
pipeline {
|
||||||
|
agent any
|
||||||
|
|
||||||
|
tools {
|
||||||
|
go 'go'
|
||||||
|
sonarRunnerInstallation 'sonarQube' // 关键:声明SonarQube工具
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### ✅ **简化的扫描阶段**
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
stage('代码质量扫描') {
|
||||||
|
steps {
|
||||||
|
script {
|
||||||
|
withSonarQubeEnv('sonarQube') {
|
||||||
|
sh '''
|
||||||
|
# 直接使用sonar-scanner命令
|
||||||
|
sonar-scanner \
|
||||||
|
-Dsonar.projectKey=${PROJECT_NAME} \
|
||||||
|
-Dsonar.projectName="${PROJECT_NAME}" \
|
||||||
|
-Dsonar.projectVersion=${BUILD_NUMBER} \
|
||||||
|
-Dsonar.sources=. \
|
||||||
|
-Dsonar.exclusions=**/*_test.go,**/vendor/** \
|
||||||
|
-Dsonar.go.coverage.reportPaths=coverage.out
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🚀 性能优化建议
|
||||||
|
|
||||||
|
### 1. 工具缓存优化
|
||||||
|
|
||||||
|
在 Jenkins 主机上创建工具缓存目录:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在Jenkins服务器上执行
|
||||||
|
sudo mkdir -p /var/jenkins_home/tools_cache
|
||||||
|
sudo chown jenkins:jenkins /var/jenkins_home/tools_cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. 网络优化
|
||||||
|
|
||||||
|
如果网络下载慢,可以考虑:
|
||||||
|
|
||||||
|
#### 方案 A:手动预安装
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在Jenkins容器内执行
|
||||||
|
cd /var/jenkins_home/tools/hudson.plugins.sonar.SonarRunnerInstallation/
|
||||||
|
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-7.1.0.4889-linux-aarch64.zip
|
||||||
|
unzip sonar-scanner-cli-7.1.0.4889-linux-aarch64.zip
|
||||||
|
mv sonar-scanner-7.1.0.4889-linux-aarch64 sonarQube
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 方案 B:Docker 镜像预安装
|
||||||
|
|
||||||
|
创建自定义 Jenkins 镜像:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
FROM jenkins/jenkins:lts
|
||||||
|
|
||||||
|
# 预安装SonarQube Scanner
|
||||||
|
USER root
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y wget unzip && \
|
||||||
|
mkdir -p /opt/sonar-scanner && \
|
||||||
|
cd /opt/sonar-scanner && \
|
||||||
|
wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-7.1.0.4889-linux-aarch64.zip && \
|
||||||
|
unzip sonar-scanner-cli-7.1.0.4889-linux-aarch64.zip && \
|
||||||
|
mv sonar-scanner-7.1.0.4889-linux-aarch64 scanner && \
|
||||||
|
ln -s /opt/sonar-scanner/scanner/bin/sonar-scanner /usr/local/bin/sonar-scanner
|
||||||
|
|
||||||
|
USER jenkins
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. 条件扫描
|
||||||
|
|
||||||
|
只在特定分支执行扫描:
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
stage('代码质量扫描') {
|
||||||
|
when {
|
||||||
|
anyOf {
|
||||||
|
branch 'main'
|
||||||
|
branch 'develop'
|
||||||
|
changeRequest() // Pull Request时执行
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// ... 扫描逻辑
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 🔧 故障排除
|
||||||
|
|
||||||
|
### 常见问题
|
||||||
|
|
||||||
|
1. **工具名称不匹配**
|
||||||
|
|
||||||
|
```
|
||||||
|
错误:No such tool 'sonarQube'
|
||||||
|
解决:检查Jenkins全局配置中的工具名称
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **权限问题**
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 检查工具目录权限
|
||||||
|
ls -la /var/jenkins_home/tools/hudson.plugins.sonar.SonarRunnerInstallation/
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **网络问题**
|
||||||
|
```bash
|
||||||
|
# 测试网络连接
|
||||||
|
curl -I https://binaries.sonarsource.com/
|
||||||
|
```
|
||||||
|
|
||||||
|
### 验证配置
|
||||||
|
|
||||||
|
运行以下命令验证配置:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 在Jenkins Pipeline中添加调试步骤
|
||||||
|
stage('调试SonarQube配置') {
|
||||||
|
steps {
|
||||||
|
sh '''
|
||||||
|
echo "SONAR_SCANNER_HOME: $SONAR_SCANNER_HOME"
|
||||||
|
which sonar-scanner || echo "未找到sonar-scanner"
|
||||||
|
sonar-scanner --version || echo "版本检查失败"
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 📈 性能对比
|
||||||
|
|
||||||
|
| 配置方式 | 首次构建时间 | 后续构建时间 | 网络依赖 |
|
||||||
|
| ------------ | ------------ | ------------ | -------- |
|
||||||
|
| 手动查找路径 | 7-10 分钟 | 7-10 分钟 | 高 |
|
||||||
|
| 正确工具声明 | 2-3 分钟 | 30-60 秒 | 低 |
|
||||||
|
| 预安装镜像 | 30-60 秒 | 30-60 秒 | 无 |
|
||||||
|
|
||||||
|
## 🎯 最佳实践
|
||||||
|
|
||||||
|
1. **始终使用 tools 声明**:让 Jenkins 管理工具生命周期
|
||||||
|
2. **统一命名约定**:工具名称保持一致
|
||||||
|
3. **条件执行**:不是每次构建都需要代码扫描
|
||||||
|
4. **缓存优化**:利用 Jenkins 的工具缓存机制
|
||||||
|
5. **网络优化**:考虑本地化部署或镜像加速
|
||||||
|
|
||||||
|
通过这些优化,SonarQube 扫描时间可以从 7 分钟降低到 1 分钟以内!
|
Loading…
x
Reference in New Issue
Block a user