使用Jenkins Pipeline在GCP上构建与SonarQube集成并将结果通知到Slack的CI/CD环境
首先
本篇是「2021年CI/CD冒险日历」的第12天。我们在这个日历的第一天使用了GCP的Cloud Build来搭建了一个CI/CD环境,并发布了Spring Boot应用程序的构建和部署。但是这次我们将尝试用一种略有不同的配置来搭建CI/CD环境。
建立CI/CD环境设置
以下是本次所建立的CI/CD环境配置:
■概要
※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. 建立构建服务器
2. 建立SonarQube服务器
除了构建服务器之外,还要构建SonarQube服务器。SonarQube是在GCP市场上注册的产品。由于可以通过几次点击轻松地构建,因此以下是关于Jenkins设置的详细信息。
安装SonarQube Scanner for Jenkins插件2-1
从Jenkins系统设置中注册SonarQube服务器信息。
3. Jenkins和Slack的协作设置
我将设置Jenkins和Slack的集成。由于这篇文章写得非常清楚易懂,我参考了它进行了设置。但是这次我还会额外添加以下内容,以便从Pipeline调用Slack API。
安装3-1 Slack通知插件。
4. 创建 Cloud Build 的构建触发器
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,然后进行操作确认。
附录 (fù lù)
ソースリポジトリ ※5年前くらいにCircle CI、CodeCov、Slack連携するのに作ったお試しリポジトリになります
以上就是。