1. 수정사항
원래는 docker 안에 jenkins가 있고, jenkins에서 docker로 접속하는 방식을 택했다. 근데 ECR에 push하기 위해서는 jenkins에서 docker를 실행해야 한다. 그래서 docker-compose.yml 파일을 조금 수정한다.
/home/ec2-user/compose/docker-compose.yml
version: "3"
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:lts
user: root
ports:
- "8081:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /home/ec2-user/compose/jenkins:/var/jenkins_home
- /usr/bin/docker:/usr/bin/docker
sonarqube:
image: sonarqube:lts
container_name: sonarqube
ports:
- "9000:9000"
volumes:
- sonarqube_conf:/opt/sonarqube/conf
- sonarqube_data:/opt/sonarqube/data
- sonarqube_extensions:/opt/sonarqube/extensions
- sonarqube_logs:/opt/sonarqube/logs
volumes:
sonarqube_conf:
sonarqube_data:
sonarqube_extensions:
sonarqube_logs:
이렇게 하면 ec2에 깔린 docker와 jenkins의 docker를 연동할 수 있게 되어서 exec -it jenkins bash로 들어가서 docker ps를 해도 잘 실행된다.
그다음, ecr push
plugin
docker pipeline
amazon ecr
aws global configuration
https://betterprogramming.pub/how-to-push-a-docker-image-to-amazon-ecr-with-jenkins-ed4b042e141a
shell은 아래와 같이.
pipeline {
agent any
tools{
gradle '6.9'
}
stages{
stage('Ready'){
steps{
sh "echo 'Ready'"
}
}
/*stage('SonarQube Analysis'){
steps{
withSonarQubeEnv('sonar-server'){
sh './gradlew sonarqube -Dsonar.projectKey=devops -Dsonar.host.url=http://34.68.210.18:9000 -Dsonar.login=aa312f8be5bc0e85894f4b8c7f11ef1f8899a2eb'
}
}
}
stage('SonarQube Quality Gate'){
steps{
timeout(time: 1, unit: 'MINUTES') {
script{
echo "Start~~~~"
def qg = waitForQualityGate()
echo "Status: ${qg.status}"
if(qg.status != 'OK') {
echo "NOT OK Status: ${qg.status}"
updateGitlabCommitStatus(name: "SonarQube Quality Gate", state: "failed")
error "Pipeline aborted due to quality gate failure: ${qg.status}"
} else{
echo "OK Status: ${qg.status}"
updateGitlabCommitStatus(name: "SonarQube Quality Gate", state: "success")
}
echo "End~~~~"
}
}
}
}*/
stage('Spring Boot Clean & Build'){
steps{
sh "chmod +x gradlew;"
sh "./gradlew clean;"
sh "./gradlew build -x test;"
}
} // build 시 test 없이 진행하고, test는 추후에 거르기 위해 이렇게 이용함.
stage('Gradle Junit Test') {
steps {
sh "chmod +x gradlew; ./gradlew test"
}
} // test를 이용해서 확인함.
stage('JUnit Test Publish') {
steps {
junit '**/build/test-results/test/*.xml'
}
} // Junit 테스트 결과를 젠킨스 프로젝트 첫 화면에서 볼 수 있게 결과물을 출력한다. 이렇게 해주면 알아서 결과물을 보여준다.
stage('Docker push image'){
steps{
script{
docker.withRegistry('https://202364957862.dkr.ecr.us-east-2.amazonaws.com', 'ecr:us-east-2:aws-ecr'){
def app = docker.build("202364957862.dkr.ecr.us-east-2.amazonaws.com/ci")
app.push("latest")
}
}
}
}
stage('Clean'){
steps{
sh "chmod +x gradlew;"
sh "./gradlew clean;"
}
}
}
}
// build - JUnit - SonarQube - docker build, push - kubernetes deploy 이렇게 됨.
// stages는 1개만.
// gradlew 실행은 ./으로
// gradlew 권한 해결
// $ 표시는 injection 문제가 있기 때문에 '''를 이용해 주석처리.
// stage 이름 겹치면 안 됨/
// stage 안에 여러개를 넣고 싶으면 stage 내에 stages 넣기