인수 테스트
젠킨스 파이프라인에서의 인수 테스트
1. 개발자가 변경한 코드를 깃허브에 push 한다.
2. 젠킨스가 변경을 감지하여 빌드를 시작하고, 단위 테스트를 수행한다.
3. 젠킨스가 빌드를 완료하여 도커 이미지를 생성한다.
4. 젠킨스가 생성한 이미지를 레지스트리로 push 한다.
5. 젠킨스가 스테이징 환경을 구성하고 도커 컨테이너를 실행한다.
6. 스테이징 환경의 도커 호스트가 이미지를 pull 하여 컨테이너를 실행한다.
7. 젠킨스가 스테이징 환경에서 실행 중인 앱을 대상으로 인수 테스트를 실행한다.
빌드에 사용할 컨테이너 설정
1. Dockerfile-jnlp를 작성한다.
FROM jenkins/jnlp-agent-docker
USER root
COPY entrypoint.sh /entrypoint.sh
RUN chown jenkins:jenkins /entrypoint.sh
RUN chmod +x /entrypoint.sh
RUN curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" \
&& chmod 755 kubectl \
&& mv kubectl /bin
USER jenkins
ENTRYPOINT ["/entrypoint.sh"]
2. Dockerfile-dind를 작성한다.
이때 자가 서명 인증서를 사용한다. registry.crt 부분이 자가 서명 인증서이다.
FROM docker:latest
COPY registry.crt /usr/share/ca-certificates/registry/registry.crt
RUN echo "registry/registry.crt" >> /etc/ca-certificates.conf
RUN update-ca-certificates
3. Dockerfile-builder 파일을 작성한다.
우분투 위에 openjdk-17-jdk를 설치하는 명령이 작성되어 있다.
FROM ubuntu:22.04
RUN apt update
RUN apt install -y openjdk-17-jdk
4. 빌드한다.
성공적으로 빌드하고 나면 두 번째와 같은 파일이 생성된 것을 확인할 수 있다.
gradlew build
5. 도커 이미지를 빌드한다. 아래는 Dockerfile의 내용이다.
FROM openjdk:17
COPY build/libs/calculator-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
6. 아래 명령어를 입력하여 테스트해본다.
curl "localhost:8765/sum?a=12&b=35"
작업용 임시 파이프라인 만들기
1. 기존에 설정한 파이프라인에서 Poll SCM 옵션을 잠시 끈다.
2. 젠킨스에서 아이템을 만들어서 다음의 pipeline script를 입력한다.
pipeline {
agent {
kubernetes {
yaml'''
apiVersion: v1
kind: Pod
spec:
containers:
- name: jnlp
image: sheayun/jnlp-agent-sample
env:
- name: DOCKER_HOST
value: "tcp://localhost:2375"
- name: dind
image: sheayun/dind
command:
- /usr/local/bin/dockerd-entrypoint.sh
env:
- name: DOCKER_TLS_CERTDIR
value: ""
securityContext:
privileged: true
- name: builder
image: sheayun/jenkins-agent-jdk-17
command:
- cat
tty: true
'''
}
}
environment {
REGISTRY_URI = 'registry-service.registry.svc.cluster.local:30100'
REGISTRY_TAG = '1.0'
}
stages {
stage("Checkout") {
steps {
git url: 'git@github.com:ncherryu/calculator.git',
branch: 'main',
credentialsId: 'github-credentials'
}
}
stage("Compile") {
steps {
script {
container('builder') {
sh "./gradlew compileJava"
}
}
}
}
stage("Unit Test") {
steps {
script {
container('builder') {
sh "./gradlew test"
publishHTML(target: [
reportDir: 'build/reports/tests/test',
reportFiles: 'index.html',
reportName: 'JUnit Report'
])
}
}
}
}
stage("Code Coverage") {
steps {
script {
container('builder') {
sh "./gradlew jacocoTestReport"
publishHTML(target: [
reportDir: 'build/reports/jacoco/test/html',
reportFiles: 'index.html',
reportName: 'JaCoCo Report'
])
sh "./gradlew jacocoTestCoverageVerification"
}
}
}
}
stage("Static Analysis") {
steps {
script {
container('builder') {
sh "./gradlew checkstyleMain"
publishHTML(target: [
reportDir: 'build/reports/checkstyle',
reportFiles: 'main.html',
reportName: 'Checkstyle Report'
])
}
}
}
}
stage("Package") {
steps {
script {
container('builder') {
sh "./gradlew build"
}
}
}
}
stage("Docker Build") {
steps {
script {
dockerImage = docker.build "calculator"
}
}
}
stage("Docker Push") {
steps {
script {
docker.withRegistry("https://${REGISTRY_URI}") {
dockerImage.push("${REGISTRY_TAG}")
}
}
}
}
}
}
3. 빌드를 수행하고 결과를 확인한다.
'데브코스' 카테고리의 다른 글
[18주차 - DAY2] 오픈소스 기여(1) (0) | 2024.06.25 |
---|---|
[17주차 - DAY4] CD 파이프라인 (0) | 2024.06.20 |
[17주차 - DAY3] 인수 테스트 (1) | 2024.06.19 |
[17주차 - DAY2] CI 파이프라인 (0) | 2024.06.18 |
[17주차 - DAY1] 쿠버네티스 사용 방법 정리 (0) | 2024.06.17 |