저번 Jenkins 사용기는 Freestyle Project를 사용해서 브랜치에 Merge 시 자동 빌드와 자동 배포 작업을 진행했다.
다만 Freestyle Project는 제약이 많기 때문에 보통 Pipeline을 사용한다고 한다.
Freestyle Project VS Pipeline
Freestyle Project는 일렬로 진행되는 파이프라인이라고 이해하면 된다.
Jenkins에서 기본적인 틀을 제공해주며, 각 단계별 설정을 해주면 완성된다.
따라서 진입장벽이 낮고 쉽게 사용할 수 있으나
틀을 제공해주기 때문에 커스터마이징이 제한적이고, 병렬처리가 미지원되며, 다수의 Repository와 연계한 사용이 불가능하다고 한다.
반면 Pipeline은 작업과정이 일렬로 진행될 수도 있고 다음처럼 병렬로 진행될 수도 있다.
어떤 절차로 진행할 지 코드로 작성한다.
따라서 Freestyle Project 방식에 비해 커스터마이징이 가능하다. 보이는 것처럼 병렬처리가 지원되며, 다수의 Repository와 연계하여 사용 가능하다.
하지만 코드로 절차를 작성해야 하기에 Freestyle Project에 비해 어렵다.
Pipeline 코드 작성
Pipeline 코드를 작성하는 법은 Declarative와 Scripted 방식이 있다.
둘 다 Groovy 문법 기반으로 Scripted 방식이 Declarative 방식에 비해 조금 더 어렵지만 더욱 효과적이고 기능이 풍부하다고 한다.
(스크립트 최상단에 pipeline이라고 되어 있으면 Declarative, node가 있으면 Scripted 방식으로 작성된 것이다.)
나는 Declarative 방식으로 실습했다.
pipeline {
agent any
environment {
// Credentials ID
credentialsId = 'KimMunjin'
}
stages {
stage('Prepare') {
agent any
steps {
script {
git branch: 'dev',
credentialsId: credentialsId,
url: 'https://github.com/AnonymousZB14/USports_BE.git'
}
}
post {
failure{
error "Fail Cloned Repository"
}
}
}
stage('Build') {\
agent any
steps {
sh 'chmod +x gradlew'
sh './gradlew clean build -x test'
}
post{
failure{
error 'Fail Build'
}
}
}
stage('Deploy') {
agent any
steps {
script {
sshPublisher(
continueOnError: false,
failOnError: true,
publishers: [
sshPublisherDesc(
configName: 'usports',
transfers: [
sshTransfer(
sourceFiles: 'build/libs/*.jar',
removePrefix: 'build/libs',
remoteDirectory: '/app/usports'
)
],
execCommand: 'sh /home/ubuntu/app/usports/start_server.sh'
)
]
)
}
}
post{
failure{
error 'Fail Deploy'
}
}
}
}
}
Jenkinsfile.groovy라는 파일로 프로젝트의 root 디렉토리 아래에 추가했다.
(작성법을 잘 몰라서 여러 블로그들과 ChatGPT를 이용하여 작성했다.)
Credential을 설정하고, Git 에서 Clone 후 빌드, EC2로 배포하는 Freestyle project 과정을 그대로 옮겼다.
(파일 전송과 관련하여 플러그인을 사용했지만 scp 명령어를 통해 jar 파일을 ec2로 전송하는 방식이 더 좋은 것 같다.)
(테스트 부분에서 문제가 생겨서 우선 제외하고 빌드했다. 당연히 테스트가 진행되는 것이 옳다.)
웹에서의 설정
Pipeline 방식은 Freestyle Project 과정과 다르게 웹에서 설정할 부분이 거의 없다.
우선 Pipeline 이라는 플러그인을 설치하자.
그 이후 앞서 Freestyle Project처럼 GitHub Project 경로와 언제 빌드를 시작할 지 설정한다. Freestyle Project 처럼 webhook이 들어왔을 때 빌드가 진행되도록 하였다.
그 이후 Pipeline 설정에서 Pipeline script from SCM을 설정한다.
SCM 설정의 종류
Pipeline Script : 젠킨스 웹 내에서 스크립트를 작성하여 관리한다.
Pipeline script from SCM : 프로젝트 내에서 Jenkinsfile에 스크립트를 작성하여 관리한다.
나는 dev 브랜치를 설정했으며, 마지막에 Script 경로를 지정하면 된다.
빌드시 스크립트에서 설정했던 단계 별로 진행 시간 등을 확인이 가능하다.
이번 팀프로젝트에서는 브랜치 전략도 각 기능별 개발 브랜치와 dev 브랜치, master 브랜치만 사용했고, 여러 Repository를 사용한 것도 아니라서 Freestyle Project 방식과 크게 차이가 있지 않았다.
다만 결국 많이 사용되는 것은 Pipeline 방식이니 조금 더 Script 작성에 능숙해질 필요성을 느낀다.
출처
Jenkins에서 CI 프로세스를 정의하는 2가지 방법
Freestyle Project
l-sanghyeup.medium.com
https://seongwon.dev/DevOps/20220717-CICD%EA%B5%AC%EC%B6%95%EA%B8%B02/
[DevOps] Jenkins를 통한 CI/CD 구축기 2편 (Backend CI/CD 구축)
🔗 연관 게시글 CI/CD란? [DevOps] Jenkins를 통한 CI/CD 구축기 1편 (Jenkins 설치) [DevOps] Jenkins를 통한 CI/CD 구축기 2편 (Backend CI/CD 구축) [DevOps] Jenkins를 통한 CI/CD 구축기 3편 (Frontend CI/CD 구축) [DevOps] Jenkins
seongwon.dev
https://velog.io/@rnqhstlr2297/Jenkins-%EA%B0%9C%EB%85%90%EA%B3%BC-%EC%82%AC%EC%9A%A9
Jenkins의 개념
Jenkins의 개념
velog.io
'개발 지식 기록 > 프로젝트~' 카테고리의 다른 글
Amazon EC2 인스턴스 생성 (0) | 2024.01.13 |
---|---|
Jenkins 사용기(Freestyle project) (0) | 2023.12.31 |