mirror of
https://github.com/spring-projects/spring-petclinic.git
synced 2025-07-21 23:35:50 +00:00
added ci for testing
This commit is contained in:
parent
516722647a
commit
c29fdbf3f0
5 changed files with 262 additions and 2 deletions
|
@ -5,6 +5,7 @@ plugins {
|
||||||
id 'org.graalvm.buildtools.native' version '0.9.28'
|
id 'org.graalvm.buildtools.native' version '0.9.28'
|
||||||
id 'io.spring.javaformat' version '0.0.41'
|
id 'io.spring.javaformat' version '0.0.41'
|
||||||
id "io.spring.nohttp" version "0.0.11"
|
id "io.spring.nohttp" version "0.0.11"
|
||||||
|
id 'jacoco'
|
||||||
}
|
}
|
||||||
|
|
||||||
apply plugin: 'java'
|
apply plugin: 'java'
|
||||||
|
@ -14,7 +15,13 @@ apply plugin: 'io.spring.javaformat'
|
||||||
gradle.startParameter.excludedTaskNames += [ "checkFormatAot", "checkFormatAotTest" ]
|
gradle.startParameter.excludedTaskNames += [ "checkFormatAot", "checkFormatAotTest" ]
|
||||||
|
|
||||||
group = 'org.springframework.samples'
|
group = 'org.springframework.samples'
|
||||||
|
|
||||||
|
//project always has the property version
|
||||||
|
if (project.findProperty('version') != 'unspecified') {
|
||||||
|
version = findProperty('version')
|
||||||
|
} else {
|
||||||
version = '3.2.0'
|
version = '3.2.0'
|
||||||
|
}
|
||||||
|
|
||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_17
|
sourceCompatibility = JavaVersion.VERSION_17
|
||||||
|
@ -80,3 +87,5 @@ checkFormatAotTest.enabled = false
|
||||||
|
|
||||||
formatAot.enabled = false
|
formatAot.enabled = false
|
||||||
formatAotTest.enabled = false
|
formatAotTest.enabled = false
|
||||||
|
|
||||||
|
test.finalizedBy(jacocoTestReport)
|
||||||
|
|
119
jenkins-build/Jenkinsfile
vendored
Normal file
119
jenkins-build/Jenkinsfile
vendored
Normal file
|
@ -0,0 +1,119 @@
|
||||||
|
String buildVersion
|
||||||
|
String environment='CI'
|
||||||
|
String buildName='spring-petclinic-aws'
|
||||||
|
String ciBucketName='xchu-jenkins-artifacts-build-us-east-1'
|
||||||
|
String rcBucketName='xchu-jenkins-artifacts-rc-us-east-1'
|
||||||
|
String awsCred='lab-aws'
|
||||||
|
String awsRegion='lab-aws'
|
||||||
|
|
||||||
|
pipeline {
|
||||||
|
stages {
|
||||||
|
stage ('Choose Version') {
|
||||||
|
steps {
|
||||||
|
// calculate version from git tags and commit history
|
||||||
|
sh 'rm -rf generated'
|
||||||
|
sh 'mkdir generated'
|
||||||
|
echo 'Choosing Version'
|
||||||
|
sh 'chmod 755 ./jenkins-build/build-info'
|
||||||
|
sh './jenkins-build/build-info'
|
||||||
|
script {
|
||||||
|
def buildProperties = readProperties file: "${env.WORKSPACE}/generated/BUILD_INFO.txt"
|
||||||
|
buildVersion = buildProperties.get('build.version')
|
||||||
|
branchName = buildProperties.get('git.branch.name')
|
||||||
|
cloudFormationFile="./generated/cloud-formation-${buildVersion}.yaml"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Validate CF') {
|
||||||
|
steps{
|
||||||
|
sh "mv jenkins-build/cloud-formation.yaml ${cloudFormationFile}"
|
||||||
|
sh 'ls'
|
||||||
|
withAWS(credentials:"${awsCred}", region:"${awsRegion}"){
|
||||||
|
cfnValidate(file:"${cloudFormationFile}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Compile') {
|
||||||
|
steps{
|
||||||
|
sh "./gradlew clean build -x test -Pversion=${buildVersion} -DrootProjectName=${buildName}"
|
||||||
|
//make the jar file name cohesive
|
||||||
|
}
|
||||||
|
stage('Tests') {
|
||||||
|
parallel unitTest: {
|
||||||
|
stage ('unitTest') {
|
||||||
|
timeout(time: 5, unit: 'MINUTES') {
|
||||||
|
sh './gradlew test'
|
||||||
|
echo 'Unittest done'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
checkstyle: {
|
||||||
|
stage ('checkStyle') {
|
||||||
|
sh './gradlew validate'
|
||||||
|
echo 'checkStyle done'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
codeCoverage: {
|
||||||
|
stage ('codeCoverage') {
|
||||||
|
sh './gradlew jacocoTestReport'
|
||||||
|
echo 'Code coverage test done'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Publish to S3'){
|
||||||
|
steps{
|
||||||
|
withAWS(credentials:"${awsCred}", region:"${awsRegion}"){
|
||||||
|
//Upload application code
|
||||||
|
s3Upload(bucket:"${ciBucketName}", file: "build/libs/${buildName}-${buildVersion}.jar", path:"${buildName}/${buildVersion}/")
|
||||||
|
//Upload CloudFormation
|
||||||
|
s3Upload(bucket:"${ciBucketName}", file: "${cloudFormationFile}", path:"${buildName}/${buildVersion}/")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Publish to RC - If main branch'){
|
||||||
|
when {
|
||||||
|
branch 'main'
|
||||||
|
}
|
||||||
|
steps{
|
||||||
|
withAWS(credentials:"${awsCred}", region:"${awsRegion}"){
|
||||||
|
//Upload application code to release candidate
|
||||||
|
s3Upload(bucket:"${rcBucketName}", file: "build/libs/${buildName}-${buildVersion}.jar", path:"${buildName}/${buildVersion}/")
|
||||||
|
|
||||||
|
//Upload CloudFormation to release candidate
|
||||||
|
s3Upload(bucket:"${rcBucketName}", file: "${cloudFormationFile}", path:"${buildName}/${buildVersion}/")
|
||||||
|
|
||||||
|
//Upload Build_info to release candidate
|
||||||
|
s3Upload(bucket:"${rcBucketName}", file: "${env.WORKSPACE}/generated/BUILD_INFO.txt", path:"${buildName}/${buildVersion}/")
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage('Publish Report Html') {
|
||||||
|
steps {
|
||||||
|
echo 'Publishing unittest report...'
|
||||||
|
publishHTML([allowMissing: true,
|
||||||
|
alwaysLinkToLastBuild: true,
|
||||||
|
keepAll: true,
|
||||||
|
reportDir: 'build/reports/tests/test',
|
||||||
|
reportFiles: 'index.html',
|
||||||
|
reportName: 'Unittest Report',
|
||||||
|
reportTitles: 'The unittest report'])
|
||||||
|
echo 'Publishing jacoco report...'
|
||||||
|
publishHTML([allowMissing: true,
|
||||||
|
alwaysLinkToLastBuild: true,
|
||||||
|
keepAll: true,
|
||||||
|
reportDir: 'build/reports/jacoco/test/html',
|
||||||
|
reportFiles: 'index.html',
|
||||||
|
reportName: 'Jacoco Coverage Report',
|
||||||
|
reportTitles: 'The coverage report by jacoco'])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
post {
|
||||||
|
always {
|
||||||
|
archiveArtifacts artifacts: 'generated/**'
|
||||||
|
echo 'Cleaning up...'
|
||||||
|
cleanWs()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
50
jenkins-build/build-info
Normal file
50
jenkins-build/build-info
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
baseVersion="0.0.0"
|
||||||
|
revisionsSince="0"
|
||||||
|
|
||||||
|
echo "Available" tags
|
||||||
|
git tag -l
|
||||||
|
|
||||||
|
if semver $(git tag -l) &>/dev/null
|
||||||
|
then
|
||||||
|
baseVersion=$(semver $(semver $(git tag -l)) | tail -n1)
|
||||||
|
echo "Base Version is now: $baseVersion"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$baseVersion" = "0.0.0" ]
|
||||||
|
then
|
||||||
|
revisionsSince=$(git rev-list --count HEAD)
|
||||||
|
else
|
||||||
|
revisionsSince=$(git rev-list "$baseVersion"..HEAD --count)
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Calculating Version."
|
||||||
|
calculatedVersion="$baseVersion-$revisionsSince"
|
||||||
|
|
||||||
|
branchName=$(git rev-parse --abbrev-ref HEAD | tr / -)
|
||||||
|
|
||||||
|
echo $branchName
|
||||||
|
|
||||||
|
if [ "$branchName" != "master" ]
|
||||||
|
then
|
||||||
|
calculatedVersion="$calculatedVersion-$branchName"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "New version is $calculatedVersion"
|
||||||
|
|
||||||
|
semVersion=$(semver "$calculatedVersion" | tail -n1)
|
||||||
|
|
||||||
|
if [ "$1" = "package" ]
|
||||||
|
then
|
||||||
|
echo "Forcing package.json to version $semVersion"
|
||||||
|
npm --no-git-tag-version -f version $semVersion
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p generated
|
||||||
|
echo "build.version=$calculatedVersion" > ./generated/BUILD_INFO.txt
|
||||||
|
echo "git.branch.name=$branchName" >> ./generated/BUILD_INFO.txt
|
||||||
|
echo "git.commit.hash=$(git rev-parse HEAD)" >> ./generated/BUILD_INFO.txt
|
||||||
|
echo "git.commit.short=$(git rev-parse --short HEAD)" >> ./generated/BUILD_INFO.txt
|
||||||
|
|
82
jenkins-build/cloud-formation.yaml
Normal file
82
jenkins-build/cloud-formation.yaml
Normal file
|
@ -0,0 +1,82 @@
|
||||||
|
AWSTemplateFormatVersion: '2010-09-09'
|
||||||
|
Description: Deploy an EC2 instance to run the Petclinic app.
|
||||||
|
Parameters:
|
||||||
|
ArtifactPath:
|
||||||
|
Type: String
|
||||||
|
Description: The path to the jar file.
|
||||||
|
AppFile:
|
||||||
|
Type: String
|
||||||
|
Description: The name of the jar file.
|
||||||
|
LatestAmiId:
|
||||||
|
Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
|
||||||
|
Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
|
||||||
|
ServerPort:
|
||||||
|
Type: Number
|
||||||
|
Default: 8080
|
||||||
|
Description: The port on which the server will listen.
|
||||||
|
|
||||||
|
Resources:
|
||||||
|
InstanceSecurityGroup:
|
||||||
|
Type: 'AWS::EC2::SecurityGroup'
|
||||||
|
Properties:
|
||||||
|
GroupDescription: Allow http to instance
|
||||||
|
SecurityGroupIngress:
|
||||||
|
- IpProtocol: tcp
|
||||||
|
FromPort: !Ref ServerPort
|
||||||
|
ToPort: !Ref ServerPort
|
||||||
|
CidrIp: 0.0.0.0/0
|
||||||
|
|
||||||
|
InstanceRole:
|
||||||
|
Type: 'AWS::IAM::Role'
|
||||||
|
Properties:
|
||||||
|
AssumeRolePolicyDocument:
|
||||||
|
Version: '2012-10-17'
|
||||||
|
Statement:
|
||||||
|
- Effect: Allow
|
||||||
|
Principal:
|
||||||
|
Service:
|
||||||
|
- ec2.amazonaws.com
|
||||||
|
Action:
|
||||||
|
- 'sts:AssumeRole'
|
||||||
|
Policies:
|
||||||
|
- PolicyName: AccessArtifact
|
||||||
|
PolicyDocument:
|
||||||
|
Version: '2012-10-17'
|
||||||
|
Statement:
|
||||||
|
- Effect: Allow
|
||||||
|
Action:
|
||||||
|
- 's3:GetObject'
|
||||||
|
Resource:
|
||||||
|
- !Sub 'arn:aws:s3:::${ArtifactPath}/*.jar'
|
||||||
|
|
||||||
|
InstanceProfile:
|
||||||
|
Type: 'AWS::IAM::InstanceProfile'
|
||||||
|
Properties:
|
||||||
|
Roles:
|
||||||
|
- !Ref InstanceRole
|
||||||
|
|
||||||
|
EC2Instance:
|
||||||
|
Type: 'AWS::EC2::Instance'
|
||||||
|
Properties:
|
||||||
|
InstanceType: t2.micro
|
||||||
|
ImageId: LatestAmiId # Amazon Linux 2 AMI in us-east-1
|
||||||
|
SecurityGroups:
|
||||||
|
- !Ref InstanceSecurityGroup
|
||||||
|
IamInstanceProfile: !Ref InstanceProfile
|
||||||
|
UserData:
|
||||||
|
Fn::Base64: !Sub |
|
||||||
|
#!/bin/bash
|
||||||
|
yum update -y
|
||||||
|
yum install -y java-17-amazon-corretto-devel
|
||||||
|
aws s3 cp s3://${ArtifactPath}/${AppFile} /home/ec2-user/
|
||||||
|
java -jar /home/ec2-user/${AppFile} --server.port=${ServerPort}
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
InstanceId:
|
||||||
|
Description: The Instance ID
|
||||||
|
Value: !Ref EC2Instance
|
||||||
|
WebsiteURL:
|
||||||
|
Description: URL to access the Java application
|
||||||
|
Value: !Sub "http://${EC2Instance.PublicIp}:${ServerPort}"
|
||||||
|
Export:
|
||||||
|
Name: ServerURL
|
|
@ -1 +1 @@
|
||||||
rootProject.name = 'spring-petclinic'
|
rootProject.name = System.getProperty('rootProjectName')?:'spring-petclinic'
|
||||||
|
|
Loading…
Reference in a new issue