使用Jenkins Pipeline在GCP上构建与SonarQube集成并将结果通知到Slack的CI/CD环境

首先

本篇是「2021年CI/CD冒险日历」的第12天。我们在这个日历的第一天使用了GCP的Cloud Build来搭建了一个CI/CD环境,并发布了Spring Boot应用程序的构建和部署。但是这次我们将尝试用一种略有不同的配置来搭建CI/CD环境。

建立CI/CD环境设置

以下是本次所建立的CI/CD环境配置:

image.png

■概要
※Jenkins将使用Pipeline进行以下操作:
1. 在将代码推送到GitHub后,Jenkins将执行SonarQube的静态分析。
2. Jenkins将执行构建和测试。
3. 使用在Google Cloud Platform上搭建的CI/CD环境来构建和部署Spring Boot应用,并将其部署到Cloud Run上(通过在Jenkins中使用Curl命令执行Cloud Build的Webhook来实现)。
4. 最后,将Jenkins的结果通知到Slack中。

另外,所使用的材料仍然是用Java 8编写的Spring Boot + H2DB的Rest API示例。

试着构建

1. 建立构建服务器

maven integrationのインストール.png

2. 建立SonarQube服务器

除了构建服务器之外,还要构建SonarQube服务器。SonarQube是在GCP市场上注册的产品。由于可以通过几次点击轻松地构建,因此以下是关于Jenkins设置的详细信息。

安装SonarQube Scanner for Jenkins插件2-1

sqon.png

从Jenkins系统设置中注册SonarQube服务器信息。

image.png

3. Jenkins和Slack的协作设置

我将设置Jenkins和Slack的集成。由于这篇文章写得非常清楚易懂,我参考了它进行了设置。但是这次我还会额外添加以下内容,以便从Pipeline调用Slack API。

安装3-1 Slack通知插件。

Slack Notification.png

4. 创建 Cloud Build 的构建触发器

trigger.png

5. 创建Jenkinsfile

pipeline {
  agent any
  stages {
    stage('SonarQube Analysis') {
      steps {
        script {
          def mvn = tool 'My Maven'
          withSonarQubeEnv() {
            sh "${mvn}/bin/mvn sonar:sonar"
          }
        }
      }
    }
    stage('Build & Test') {
      steps {
        sh "mvn test"
      }
    }
    stage('Create Container Image & Deploy') {
      steps {
        sh "curl -X POST -d '{}' 'https://cloudbuild.googleapis.com/v1/projects/PROJECT_NAME/triggers/Webhook-for-jenkins:webhook?key=KEY&secret=SECRET'"
      }
    }
  }
  post {
    // Allureレポートを入れてみたがうまく動かないので後で対応
    always {
      script {
        allure([
          includeProperties: false,
          jdk: '',
          properties: [],
          reportBuildPolicy: 'ALWAYS',
          results: [[path: 'target/allure-results']]
        ])
      }
    }
    success {
      slackSend color: "good", message: "Build Successful $JOB_NAME. See $BUILD_URL"
    }
    failure {
      slackSend color: "danger", message: "Build Failure $JOB_NAME. See $BUILD_URL"
    }
  }
}

6. 创建Dockerfile

# Spring BootアプリをビルドするためMaven/Java8のDockerイメージを利用
FROM maven:3.5-jdk-8-alpine AS builder

# ビルド時のワークディレクトリの設定
WORKDIR /app
COPY pom.xml .
COPY src ./src

# 成果物(jarファイル)を作成(CompileとTestはJenkinsで行うためSkip)
RUN mvn package -Dmaven.test.skip

# Spring Bootアプリの実行環境にopenjdk:8-jre-alpineを利用
FROM openjdk:8-jre-alpine

COPY --from=builder /app/target/Spring-Boot-RESTful-API-Test-Sample-1.0.0-SNAPSHOT.jar /app.jar

# Docker Run時にjavaコマンドでSpring Bootを起動(Embedded Tomcatを起動)
CMD ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app.jar"]

7. 创建 cloudbuild.yaml 文件

steps:
# Dockerイメージの作成
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/spring-boot-restful-api-test:$COMMIT_SHA', '.']
# DockerイメージをContainer RegistryへPush
- name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/spring-boot-restful-api-test:$COMMIT_SHA']
# Clourd RunへDockerイメージをデプロイ
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: gcloud
  args:
  - 'run'
  - 'deploy'
  - 'spring-boot-restful-api-test'
  - '--image'
  - 'gcr.io/$PROJECT_ID/spring-boot-restful-api-test:$COMMIT_SHA'
  - '--region'
  - 'asia-northeast1'
images:
- 'gcr.io/$PROJECT_ID/spring-boot-restful-api-test:$COMMIT_SHA'

确认动作

我会随意修改任何文件并将其推送到GitHub,然后进行操作确认。

スクリーンショット 2021-12-12 020800.png
image.png
image.png
aaaa.png
aasa.png

附录 (fù lù)

ソースリポジトリ ※5年前くらいにCircle CI、CodeCov、Slack連携するのに作ったお試しリポジトリになります

以上就是。

广告
将在 10 秒后关闭
bannerAds