【持续集成】docker 搭建基于 Jenkins SonarQube 的持续集成环境

文章目录

持续集成目标

  • 流水线 Java 示例:http://192.168.0.111/root/sonar-maven-multimodule。
  • 构建和部署流程自动化(TBD)
  • 单元测试自动化 (TBD)
  • 集成代码分析服务 (完成)
  • 验收测试自动化(TBD)
  • 发布自动化(TBD)

环境搭建

通过 dokcer 安装 SonarQube

参考文档

  • 问题1:给 Elasticsearch 分配内存的配置问题
    解决方法为在宿主机执行:sysctl -w vm.max_map_count=262144(临时修改重启失效)
    永久修改: vim /etc/sysctl.conf,vm.max_map_count=262144。

  • 安装中文支持插件:应用市场查找 chinese

  • docker-compose up -d

  • 访问地址:http://192.168.0.111:9000/

docker-compose.yml

version: "3"

services:
  sonarqube:
    image: sonarqube:9.2.4-community
    depends_on:
      - db
    environment:
      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar
    volumes:
      - sonarqube_data:/opt/sonarqube/data
      - sonarqube_extensions:/opt/sonarqube/extensions
      - sonarqube_logs:/opt/sonarqube/logs
    ports:
      - "9000:9000"
  db:
    image: postgres:12
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar
    volumes:
      - postgresql:/var/lib/postgresql
      - postgresql_data:/var/lib/postgresql/data

volumes:
  sonarqube_data:
  sonarqube_extensions:
  sonarqube_logs:
  postgresql:
  postgresql_data:

Sonar 配置

  1. 修改默认用户名密码
  2. Java 代码分析 jdk 版本 11

mvn clean verify sonar:sonar -D"sonar.projectKey=maven-basic" -D"sonar.host.url=http://192.168.0.111:9000" -D"sonar.login=39b3bd857f2520c8fa964f7bd66afeb7c9c670d3"

Sonar 集成 Gitlab

  • Authenticate with GitLab - Sign in to SonarQube with your GitLab credentials.
  • Import your GitLab projects
  • Analyze projects with GitLab CI/CD
  • Report your Quality Gate status to your merge requests

docker 安装 Jenkins

  1. 在 docker-compose.yml 中添加:
jenkins:
    image: 'jenkins/jenkins:lts'
    container_name: jenkins
    restart: always
    ports:
      - '9002:8080'
      - '9003:50000'
    volumes:
      - '/srv/devops/jenkins_home:/var/jenkins_home'
  1. 执行:
chown -R 1000:1000 jenkins_home
docker-compose up -d jenkins
  1. 访问: http://192.168.0.111:9002
  2. 获得初始密码:cat jenkins_home/secrets/initialAdminPassword

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jX30tYCp-1641777275276)(…/assets/img/jenkins.png)]

sonar 集成 Jenkins

  1. Jenkins 中安装插件

    GitLab plugin for Jenkins - version 1.5.13 or later
    SonarQube Scanner plugin for Jenkins - version 2.11 or later

  2. 通过菜单:Jenkins Dashboard > Manage Jenkins > Manage Plugins 搜索并安装 SonarQube Scanner plugin.

  3. 通过 Jenkins Dashboard > Manage Credentials, 点击凭据域列表中的 Global 链接.

  4. 点击添加凭据 (credentials) 按钮,填写:

    类型: Secret Text
    范围: Global
    Secret: 需要在 SonarQube 中 User > My Account > Security 生成 token.

  5. 在 Jenkins 中通过菜单 Dashboard > Manage Jenkins > Configure System 找到 SonarQube Servers section 配置:

    勾选:Environment variables Enable injection of SonarQube server configuration as build environment variables
    Name: SonarQube 实例名.
    Server URL: SonarQube 实例 URL: http://192.168.0.111:9000. (localhost:9000 测试失败)
    Credentials: 选择第四步设置的凭据.

在 sonar 中配置项目通过 Jenkins 分析项目

  1. 在 sonarqube 中从 gitlab 导入项目:http://192.168.0.111/root/sonar-maven-multimodule

  2. 在 sonarqube 中添加项目并进行代码分析配置。注意:此处中文翻译有问题

  3. 在 jenkins 中添加流水线项目,在构建触发器(Build Triggers)下

  4. 勾选 Build when a change is pushed to GitLab. 记录 webhook URL,在GitLab中配置Webhook时使用。
    webhook URL:http://192.168.0.111:9002/project/sonar-maven-multimodule

  5. Enabled GitLab triggers 中选择 Push events.

  6. 点击高级Advanced…按钮,打开高级设置,找到 Secret token 段点击生成按钮记录Token, 配置 GitLab webhook 需要
    Token: f5b9fe1dda0eef5f57cc14f43f38ec3b

  7. 在流水线 Pipeline 设置中,确认下面的配置:(找不到?注意:流水线类型的Item才有)

    定义 Definition: Pipeline script from SCM
    配置管理工具 SCM: 在 Branches to build 填写项目主分支名 “*/main” ,仅构建一个主分支
    脚本路径 Script Path: Jenkinsfile

  8. 在 gitlab 仓库中创建 GitLab Webhook,在 Push 操作时触发 Jenkins 任务。

    在对应GitLab 仓库的 ‘设置>WebHooks’ 菜单下, 填写第 4 步及第 6 步生成的 URL 及 token.
    URL: Enter the URL you wrote down in the previous step.
    Secret Token: Enter the generated token you wrote down in the previous step.
    在触发源Trigger中确认勾选: 推送事件 (Push events), 点击添加按钮保存Webhook。

  9. 在项目中添加文件 Jenkinsfile 并提交:

        node {
        stage('SCM') {
            checkout scm
        }
        stage('SonarQube Analysis') {
            def mvn = tool 'Default Maven';
            withSonarQubeEnv() {
            sh "${mvn}/bin/mvn clean verify sonar:sonar -Dsonar.projectKey=root_sonar-maven-multimodule_AX44TXvC5VAHAZFrS7Vg"
            }
        }
        }
    
  10. 在 Jenkins 中 Dashboard > Global Tool Configuration 下 Maven installations 段,添加一个名为 Default Maven 的 mvn 工具。

docker 部署的 Jenkins 无法使用docker的问题

参考:https://blog.csdn.net/kikajack/article/details/79806520

services:
  jenkins-compose:
    image: jenkins
    privileged: true
    user: root
    ports:
     - "8088:8080"
     - "50000:50000"
    volumes:
     - /var/run/docker.sock:/var/run/docker.sock
     - /usr/bin/docker:/usr/bin/docker
     - /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
     - /home/demo/jenkins-compose:/var/jenkins_home

测试 docker 流水线

pipeline {
    agent { docker { image 'maven:3.8.4-openjdk-11-slim' } }
    stages {
        stage('build') {
            steps {
                sh 'mvn --version'
            }
        }
    }
}
上一篇:gitlab部署


下一篇:flowable 查询、完成、作废、删除 任务