728x90
어딜 찾아봐도 sh shell을 이용해서 파이프라인을 구축을하였다.
즉 , EC2서버에 jenkins를 올려서 사용한것 같다. 하지만 나는 다른방법으로 구축을 해보았다.
Plain하게 window환경에서 jenkins를 설치하고 github에서 변경사항이 발생할 시 webwook을 이용해서
작동하게 해놓았다.
위에 있는 Jenkins 위치만 변경해주면 내가 만든 pipe라인과 흡사한 구조를 갖게된다.
1.GitHub access token 생성
2.GitHub 개인 레포지토리 webhook설정
- Payload URL - 젠킨스 서버 주소에 /github-webhook/ 경로를 추가하여 입력합니다.
- http://locahost:8080를 입력하시면 정상적으로 동작하지 않습니다.
- http://public-ip:8080 같이 공개 IP를 사용하는 경우에도 정상적으로 동작하지 않습니다.
- ngrok 어플리케이션을 통해 외부에서 접근할 수 있는 도메인을 사용합니다.
- Content type - application/json 타입을 사용합니다.
3. Gredentials 만들기
- 패스워드 영역에 GitHub 비밀번호가 아닌 액세스 토큰 정보를 입력합니다.
- GitHub 연결시 UserName과 Password로 만든 Credential만 사용 가능한 경우가 있습니다.
- Credential 관련 이슈 - jenkinsci/ghprb-plugin#534
4.젠킨스 파이프라인 프로젝트 생성
- 파이프라인 설정Permalink 체크 박스를 선택합니다.
- GitHub project
- GitHub hook trigger for GITScm polling
- 아래 스크립트를 Pipeline 스크립트 영역에 붙여넣습니다. (Declarative 방식)
- Github에서 다운받을 브랜치와 레포지토리 정보를 입력합니다.
- 이전 단계에서 만든 github_access_token Credential을 추가합니다.
5. 파이프라인 생성에 성공하였으면 Build Now 버튼을 눌러 빌드를 실행합니다.
docker push 중 denied: requested access to the resource is denied 다음과 같은오류가 발생하였다
해결방안
- docker login -u "아이디" -p "비번!" docker.io 해당하는명령어를 입력해주면 정상적으로 작동 !
작동순서를 간단하게 요약하자면
- 깃허브 main 브랜치에 변경사항 발생
- 깃허브가 웹훅을 Jenkins 서버에 전달
- Jenkins 서버는 main 브랜치를 pull 받아 gradle을 통해 test 및 build 명령 실행
- Gradle이 test 및 build 수행 후 Jar 파일 생성
- 생성된 Jar 파일을 Docker image로 build
- 생성된 Docker image를 Dockerhub로 전송
- Jenkins가 SSH를 통해 API 서버가 존재하는 EC2 Instance에 접속, SSH 상에서 Dockerhub를 통해 image를 pull
- 계속해서 SSH 상에서 Docker를 통해 컨테이너 실행
전체 다올리면 너무 방대하니 ... build 부분과 ssh서버 접속 및 push하는 부분 소스코드
Window 환경 Jenkins 파이프라인
Docker build
// gradle build
stage('Bulid Gradle') {
agent any
steps {
echo 'Bulid Gradle'
dir ('.'){
bat """
./gradlew clean build --exclude-task test
"""
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
Docker push
저는 ssh접속하는데 시간이 꽤걸렸습니다. bat으로 들어가는 방법이 서칭을 해도 잘 나오질 않더군요 ...
// docker push
stage('docker push') {
agent any
steps {
echo 'docker push'
bat """
ssh -T -i "authorized_keys.pem" ec2 ssh 클라이언트 접속주소 whoami
"""
bat """
ssh -T -i "authorized_keys.pem" docker pull kimminwoo1234/simple-spring-boot:5
ec2 ssh 클라이언트 접속주소
"""
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
EC2 위에 jenkins 를 올려 사용한 shell script파일
pipeline {
agent any
environment {
imagename = "이미지이름"
registryCredential = 'docker-hub'
dockerImage = ''
}
stages {
stage('Prepare') {
steps {
echo 'Clonning Repository'
git url: '깃헙주소',
branch: 'main',
credentialsId: 'github'
}
post {
success {
echo 'Successfully Cloned Repository'
}
failure {
error 'This pipeline stops here...'
}
}
}
stage('Bulid Gradle') {
steps {
echo 'Bulid Gradle'
dir('.'){
sh '''
cd /var/jenkins_home/workspace/jobhunt/devTest
chmod +x gradlew
./gradlew clean build
'''
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Bulid Docker') {
steps {
echo 'Bulid Docker'
sh"""
cd /var/jenkins_home/workspace/jobhunt/devTest
docker build -t kimminwoo1234/simple-spring-boot:6 .
"""
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Push Docker') {
steps {
echo 'Push Docker'
sh"""
docker login -u 아이디 -p 비밀번호
docker push kimminwoo1234/simple-spring-boot:6
"""
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Docker Run') {
steps {
echo 'Pull Docker Image & Docker Image Run'
sshagent (credentials: ['ssh']) {
sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker pull kimminwoo1234/simple-spring-boot:6'"
sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker ps -q --filter name=simple-spring-boot'"
sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker rm -f \$(docker ps -aq --filter name=simple-spring-boot)'"
sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker run -d --name simple-spring-boot -p 8888:8080 --restart=unless-stopped kimminwoo1234/simple-spring-boot:6'"
sh "ssh -o StrictHostKeyChecking=no 우분투@ip주소 'docker rmi -f \$(docker images -q -f dangling=true)'"
}
}
}
}
}
728x90
'Docker,Jenkins' 카테고리의 다른 글
Docker 다양한 명령어 정리 (0) | 2023.03.31 |
---|---|
가상서버에 Docker 설치 (0) | 2023.03.30 |
jenkins cicd react+spring boot 배포중 발생한 issue 모음 (0) | 2023.01.03 |
EC2 위에 Jenkins를 띄우고 CICD를 자동화 하는방법 (0) | 2023.01.02 |
내 웹페이지를 다른 컴퓨터에서 접속하는 방법 (JSP, 포트포워딩,) (0) | 2022.10.17 |