이전 포스팅에 이어 Jenkins Item을 Pipeline을 사용하여 구축하는 과정을 기록하였습니다.
이전 포스팅에서 Freestyle Project로 CI/CD를 구축해보려 했는데,
Pipeline과의 차이가 궁금해서 찾아보게 되었다. [참고1]
간단히 정리해보면 다음과 같다.
Freestyle Project
jenkins에서 기본 틀을 정해주고 안에 빈칸을 채우는 형식이다.
장점
- 기본 틀이 정해져 있기 때문에 진입 장벽이 낮다
- 기존 사용 사례가 많아 참고할 자료가 비교적 풍부하다
단점
- 커스터마이징이 제한적이다
- 테스트 혹은 빌드 등의 작업에서 병렬처리 미지원
- 다수의 형상관리 Repository와 연계하여 사용할 수 없다
Pipeline
한곳에서부터 작업을 시작해서 일렬로 혹은 여러 갈래로 뻗어져 나갔다가 다시 한쪽으로 모이면서 마무리 되는 방식의 작업 흐름
🌟 Freestyle Project도 일렬로만 처리되는 Pipeline이라고 할 수 있다고 합니다. 하지만 파이프라인 구조를 마음대로 변경하거나 하는 추가적인 커스터마이징을 할 수 없기 때문에 특별한 이유가 없다면, Pipeline으로 관리하는 것이 낫다고 합니다
장점
- 커스터마이징의 폭이 넓다
- 테스트 혹은 빌드 등의 작업에서 병렬처리 지원
- 다수의 형상관리 Repository와 연계하여 사용할 수 있다
단점
- 진입장벽이 비교적 높다
- 기존 사용사례가 적어 웹상에 참고할 자료가 적다
Pipeline으로 구축하기로 하고 [참고2] 블로그를 참고하여 구축했다.
나의 경우도 jenkins 인스턴스(Amazon Linux 2), 배포서버 인스턴스(Amazon Linux 2) 이렇게 두 대가 있고
파이프라인 구조는 다음과 같다.
1. 코드 github에 push
2. 저번 포스팅에서 설정한 github webhook이 jenkins 인스턴스에 요청을 보냄
3. jenkins 파이프라인 실행
3-1. docker build
3-2. docker image push
3-3. jenkins 인스턴스에서 배포서버 인스턴스로 ssh 접속
3-4. 배포서버 인스턴스 docker image pull
3-5. 배포서버 인스턴스 docker image run
3-6. 배포서버 인스턴스 기존에 같은 컨테이너는 종료
4. jenkins에서 메일 또는 슬랙으로 결과를 전송
Jenkins 파이프라인
먼저, 젠킨스의 공식 문서에서 파이프라인에 대한 내용을 학습했다. (젠킨스 공식문서)
(제가 해석한 거라 틀린 부분이 있을 수 있어요! 잘못 해석한 내용이 있다면 댓글로 알려주시면 감사하겠습니다😀)
젠킨스 파이프라인은 지속적 통합 배포 파이프라인을 젠킨스에서 할 수 있는 플러그인이다.
파이프라인은 간단한 것부터 복잡한 배포 파이프라인을 Pipeline DSL을 통해 "코드로" 설계할 수 있도록 해준다.
Pipeline DSL은 Declarative Pipline과 Scripted Pipeline으로 정의되는데,
Scripted Pipline은 Groovy syntax에서 한계가 있다고 한다.
파이프라인은 다음 세 가지 방식 중 하나로 만들 수가 있다고 한다.
1. Blue Ocean - 파이프라인 UI, 그래프로 표현
2. Classic UI
3. In SCM - source control repository
Prerequisites
1. 젠킨스 2.x 혹은 이후 버전
2. 파이프라인 플러그인 ("suggested plugins"으로 설치했으면 설치되어 있다고 한다)
공식 문서에 Declarative Pipeline로 많이 작성되어 있는 것 같아서 Declarative Pipeline으로 진행했다.
파이프라인 생성
Dashboard > 새로운 Item > Pipeline 선택 후 OK를 누르고
Pipeline 부분을 먼저 작성했다. (이 파이프라인 코드 아마 안돼서 scm인가 그걸로 했다ㅠ)
pipeline {
agent any
stages {
stage('Git Clone') {
steps {
echo 'Clone'
git url: 'git@github.com:이름/레포명.git',
branch: 'clone할 브랜치 명',
credentialsId: 'jenkins-github' // 해당 레포와 연동된 credentails
}
post {
success {
echo 'Success'
}
failure {
error 'Fail'
}
}
}
}
}
이렇게 작성하면, EC2인스턴스에 var/lib/jenkins/workspace/만든파이프라인 에 들어가보면 복사가 된 것을 확인할 수 있다.
깃 url을 ssh로 안하고 https로 쓰면 에러가 난다ㅠ
플러그인에서 도커 파이프라인 설치
젠킨스 관리 > 플러그인 관리 > Docker, Docker Pipeline을 설치한다.
Docker Hub도 Credentail을 등록해 주어야 한다.
username-password로, username은 docker hub id, password는 dockerhub 비밀번호, Id는 credential id 가 된다.
도커 권한을 젠킨스에게 주기 위해 아래의 명령어를 실행 후
sudo usermod -a -G docker jenkins
sudo systemctl restart jenkins
로 재부팅
파이프라인 코드
pipeline {
agent any
environment {
registryCredential = 'credential id'
}
stages {
// git에서 repository clone
stage('Prepare') {
steps {
checkout scm
}
post {
success {
echo 'Successfully Cloned Repository'
}
failure {
error 'This pipeline stops here...'
}
}
}
stage('Bulid Docker') {
agent any
steps {
echo 'Bulid Docker'
script {
sh 'sudo docker build --tag 도커이미지이름:태그 .'
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Push Docker') {
agent any
steps {
echo 'Push Docker'
script {
sh 'sudo docker push 도커이미지이름:태그'
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('SSH new-dd-env SERVER EC2') {
steps {
echo 'SSH'
sshagent(['jenkins-ssh']) {
sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'sudo docker pull 도커이미지이름:태그'"
sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'sudo docker run --name 컨테이너명 -d -p 3000:3000 도커이미지이름:태그'"
sh "exit"
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
}
}
원인은 정확히 모르겠는데 도커 빌드가 sudo로 하지 않으면 yarn build에서 막혀서 진행이 안되는 에러가 있었다.
그래서 sh sudo docker build 로 변경해주었는데 아래와 같은 에러가 발생했다.

해결방법은 아래와 같다
$ sudo visudo
## Now add the below lines in your sudoers file :
jenkins ALL=(ALL) NOPASSWD: ALL
$service jenkins start
ssh agent plugin 설치
https://royleej9.tistory.com/m/entry/Jenkins-SSH-%EC%82%AC%EC%9A%A9-pipeline-SSH-Agent
** server EC2 인스턴스 패스워드 설정 에러
https://velog.io/@dldydrhkd/Permission-denied-publickeygssapi-keyexgssapi-with-mic
$ sudo passwd ec2-user
Changing password for user ec2-user.New password:
Retype new password:
출처: https://ryumso86.tistory.com/26 [렴소네 블로그:티스토리]
ssh agent plugin을 사용하여 접속할 때, password를 입력해주어야 했는데, shell script에서 password를 자동으로 입력하기 위해
sshpass라는 것을 사용했다.
설치는 이 링크에 나와있는 방법을 참고하여 아래의 명령어로 설치를 했다. https://stackoverflow.com/questions/21569003/installing-sshpass-on-amazon-linux-ami-based-ec2-instance
sudo amazon-linux-extras install epel -y
sudo yum-config-manager --enable epel
sudo yum install sshpass
이러한 방식으로 사용하면 된다.
sshpass -p 비번 ssh ec2-user@xx.xxx.xx.x(=ip주소)
파이프라인으로 테스트를 해볼 수 있는데 파이프라인 스크립트는 다음과 같다
pipeline {
agent any
stages {
stage('SSH SERVER EC2') {
steps {
echo 'SSH'
sshagent(['jenkins-ssh']) {
sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'whoami'"
}
}
}
}
}
++ 추가로
Blue Ocean UI로 진행해보고 싶어서 Blue Ocean UI를 설치해 보았는데 jenkinsfile이 없는 경우에 스텝하나 만들고 커밋하는 과정에서 에러 나서 그냥 Classic UI 에서 파이프라인을 만들었다. Classic UI로 파이프라인 만들고 나중에 뭔가 추가하거나 정돈된 UI로 보고 싶을 때 Blue Ocean을 사용해야겠다ㅠㅠ
Blue Ocean 설치
플러그인 매니저 > blue ocean 검색 > Blue Ocean 선택 후 설치
나머지 리스트들은 굳이 다운로드 할 필요가 없다고 한다.
🌟도커 허브에서 Jenkins를 사용하는 경우에는 Blue Ocean이 제공되지 않는 것 같다.
Blue Ocean으로 젠킨스 실행하기

1. 위의 버튼을 눌러서 전환하거나
2. 젠킨스 서버 url/blue로 접근하면 된다.
Blue Ocean Navigation Bar
- Jenkins: Dashboard로 이동
- Pipeline: Dashboard로 이동. 만약 이미 Dashboard에 있다면, 페이지를 리로드한다. Pipeline run details페이지와는 다름
- Administration: Classic UI의 Manage Jenkins 페이지로 이동
- Go to classic icon: Classic UI로 전환
Creating a Pipline
블루 오션은 젠킨스에서 파이프라인을 쉽게 만들 수 있게 해준다고 한다.
파이프라인은 source control에 존재하는 젠킨스 파일로부터 만들어지거나, 블루 오션 파이프라인 에디터로 새로운 파이프라인으르 만들 수 있다고 한다.
Setting up your Pipeline project
블루오션 대시보드에서 New Pipeline버튼을 클릭한다.
아직 생성한 파이프라인이 없다면 Welcome to Jenkins라는 창이 뜨면서 Create a new Pipeline 버튼이 나올 수 있으니 그걸 클릭하면 된다고 한다.
파이프라인 프로젝트를 만드는 방법은 세가지가 있는데
1. Standard Git Repository
2. repository on GitHub or GitHub Enterprise
3. repository on Bitbucket Cloud or Bitbucket Server
나의 경우 GitHub이기 때문에 GitHub로 진행하였다.
내 깃헙에서 access token 생성 후 Repository를 선택한다.

++ 구축 후기
서버 비용 때문에 이렇게 구현했다.

Reference
[참고1]
[참고2]
https://kanoos-stu.tistory.com/55
[참고3]
https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_sshpass_%EC%82%AC%EC%9A%A9%EB%B2%95
'Server > DevOps' 카테고리의 다른 글
Jenkins Pipeline 사용법 (0) | 2022.08.25 |
---|---|
CI/CD (Github Actions와 Jenkins 비교) (0) | 2022.08.25 |
[AWS] Jenkins CI/CD 구축하기_(1) (0) | 2022.08.25 |
[AWS] EC2 Docker 설치 및 컨테이너 실행 (+NGINX) (0) | 2022.08.25 |
[AWS] EC2 생성 및 접속 (0) | 2022.08.25 |
이전 포스팅에 이어 Jenkins Item을 Pipeline을 사용하여 구축하는 과정을 기록하였습니다.
이전 포스팅에서 Freestyle Project로 CI/CD를 구축해보려 했는데,
Pipeline과의 차이가 궁금해서 찾아보게 되었다. [참고1]
간단히 정리해보면 다음과 같다.
Freestyle Project
jenkins에서 기본 틀을 정해주고 안에 빈칸을 채우는 형식이다.
장점
- 기본 틀이 정해져 있기 때문에 진입 장벽이 낮다
- 기존 사용 사례가 많아 참고할 자료가 비교적 풍부하다
단점
- 커스터마이징이 제한적이다
- 테스트 혹은 빌드 등의 작업에서 병렬처리 미지원
- 다수의 형상관리 Repository와 연계하여 사용할 수 없다
Pipeline
한곳에서부터 작업을 시작해서 일렬로 혹은 여러 갈래로 뻗어져 나갔다가 다시 한쪽으로 모이면서 마무리 되는 방식의 작업 흐름
🌟 Freestyle Project도 일렬로만 처리되는 Pipeline이라고 할 수 있다고 합니다. 하지만 파이프라인 구조를 마음대로 변경하거나 하는 추가적인 커스터마이징을 할 수 없기 때문에 특별한 이유가 없다면, Pipeline으로 관리하는 것이 낫다고 합니다
장점
- 커스터마이징의 폭이 넓다
- 테스트 혹은 빌드 등의 작업에서 병렬처리 지원
- 다수의 형상관리 Repository와 연계하여 사용할 수 있다
단점
- 진입장벽이 비교적 높다
- 기존 사용사례가 적어 웹상에 참고할 자료가 적다
Pipeline으로 구축하기로 하고 [참고2] 블로그를 참고하여 구축했다.
나의 경우도 jenkins 인스턴스(Amazon Linux 2), 배포서버 인스턴스(Amazon Linux 2) 이렇게 두 대가 있고
파이프라인 구조는 다음과 같다.
1. 코드 github에 push
2. 저번 포스팅에서 설정한 github webhook이 jenkins 인스턴스에 요청을 보냄
3. jenkins 파이프라인 실행
3-1. docker build
3-2. docker image push
3-3. jenkins 인스턴스에서 배포서버 인스턴스로 ssh 접속
3-4. 배포서버 인스턴스 docker image pull
3-5. 배포서버 인스턴스 docker image run
3-6. 배포서버 인스턴스 기존에 같은 컨테이너는 종료
4. jenkins에서 메일 또는 슬랙으로 결과를 전송
Jenkins 파이프라인
먼저, 젠킨스의 공식 문서에서 파이프라인에 대한 내용을 학습했다. (젠킨스 공식문서)
(제가 해석한 거라 틀린 부분이 있을 수 있어요! 잘못 해석한 내용이 있다면 댓글로 알려주시면 감사하겠습니다😀)
젠킨스 파이프라인은 지속적 통합 배포 파이프라인을 젠킨스에서 할 수 있는 플러그인이다.
파이프라인은 간단한 것부터 복잡한 배포 파이프라인을 Pipeline DSL을 통해 "코드로" 설계할 수 있도록 해준다.
Pipeline DSL은 Declarative Pipline과 Scripted Pipeline으로 정의되는데,
Scripted Pipline은 Groovy syntax에서 한계가 있다고 한다.
파이프라인은 다음 세 가지 방식 중 하나로 만들 수가 있다고 한다.
1. Blue Ocean - 파이프라인 UI, 그래프로 표현
2. Classic UI
3. In SCM - source control repository
Prerequisites
1. 젠킨스 2.x 혹은 이후 버전
2. 파이프라인 플러그인 ("suggested plugins"으로 설치했으면 설치되어 있다고 한다)
공식 문서에 Declarative Pipeline로 많이 작성되어 있는 것 같아서 Declarative Pipeline으로 진행했다.
파이프라인 생성
Dashboard > 새로운 Item > Pipeline 선택 후 OK를 누르고
Pipeline 부분을 먼저 작성했다. (이 파이프라인 코드 아마 안돼서 scm인가 그걸로 했다ㅠ)
pipeline {
agent any
stages {
stage('Git Clone') {
steps {
echo 'Clone'
git url: 'git@github.com:이름/레포명.git',
branch: 'clone할 브랜치 명',
credentialsId: 'jenkins-github' // 해당 레포와 연동된 credentails
}
post {
success {
echo 'Success'
}
failure {
error 'Fail'
}
}
}
}
}
이렇게 작성하면, EC2인스턴스에 var/lib/jenkins/workspace/만든파이프라인 에 들어가보면 복사가 된 것을 확인할 수 있다.
깃 url을 ssh로 안하고 https로 쓰면 에러가 난다ㅠ
플러그인에서 도커 파이프라인 설치
젠킨스 관리 > 플러그인 관리 > Docker, Docker Pipeline을 설치한다.
Docker Hub도 Credentail을 등록해 주어야 한다.
username-password로, username은 docker hub id, password는 dockerhub 비밀번호, Id는 credential id 가 된다.
도커 권한을 젠킨스에게 주기 위해 아래의 명령어를 실행 후
sudo usermod -a -G docker jenkins
sudo systemctl restart jenkins
로 재부팅
파이프라인 코드
pipeline {
agent any
environment {
registryCredential = 'credential id'
}
stages {
// git에서 repository clone
stage('Prepare') {
steps {
checkout scm
}
post {
success {
echo 'Successfully Cloned Repository'
}
failure {
error 'This pipeline stops here...'
}
}
}
stage('Bulid Docker') {
agent any
steps {
echo 'Bulid Docker'
script {
sh 'sudo docker build --tag 도커이미지이름:태그 .'
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('Push Docker') {
agent any
steps {
echo 'Push Docker'
script {
sh 'sudo docker push 도커이미지이름:태그'
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
stage('SSH new-dd-env SERVER EC2') {
steps {
echo 'SSH'
sshagent(['jenkins-ssh']) {
sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'sudo docker pull 도커이미지이름:태그'"
sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'sudo docker run --name 컨테이너명 -d -p 3000:3000 도커이미지이름:태그'"
sh "exit"
}
}
post {
failure {
error 'This pipeline stops here...'
}
}
}
}
}
원인은 정확히 모르겠는데 도커 빌드가 sudo로 하지 않으면 yarn build에서 막혀서 진행이 안되는 에러가 있었다.
그래서 sh sudo docker build 로 변경해주었는데 아래와 같은 에러가 발생했다.

해결방법은 아래와 같다
$ sudo visudo
## Now add the below lines in your sudoers file :
jenkins ALL=(ALL) NOPASSWD: ALL
$service jenkins start
ssh agent plugin 설치
https://royleej9.tistory.com/m/entry/Jenkins-SSH-%EC%82%AC%EC%9A%A9-pipeline-SSH-Agent
** server EC2 인스턴스 패스워드 설정 에러
https://velog.io/@dldydrhkd/Permission-denied-publickeygssapi-keyexgssapi-with-mic
$ sudo passwd ec2-user
Changing password for user ec2-user.New password:
Retype new password:
출처: https://ryumso86.tistory.com/26 [렴소네 블로그:티스토리]
ssh agent plugin을 사용하여 접속할 때, password를 입력해주어야 했는데, shell script에서 password를 자동으로 입력하기 위해
sshpass라는 것을 사용했다.
설치는 이 링크에 나와있는 방법을 참고하여 아래의 명령어로 설치를 했다. https://stackoverflow.com/questions/21569003/installing-sshpass-on-amazon-linux-ami-based-ec2-instance
sudo amazon-linux-extras install epel -y
sudo yum-config-manager --enable epel
sudo yum install sshpass
이러한 방식으로 사용하면 된다.
sshpass -p 비번 ssh ec2-user@xx.xxx.xx.x(=ip주소)
파이프라인으로 테스트를 해볼 수 있는데 파이프라인 스크립트는 다음과 같다
pipeline {
agent any
stages {
stage('SSH SERVER EC2') {
steps {
echo 'SSH'
sshagent(['jenkins-ssh']) {
sh "sshpass -p 비번 ssh -o StrictHostKeyChecking=no ec2-user@ip주소 'whoami'"
}
}
}
}
}
++ 추가로
Blue Ocean UI로 진행해보고 싶어서 Blue Ocean UI를 설치해 보았는데 jenkinsfile이 없는 경우에 스텝하나 만들고 커밋하는 과정에서 에러 나서 그냥 Classic UI 에서 파이프라인을 만들었다. Classic UI로 파이프라인 만들고 나중에 뭔가 추가하거나 정돈된 UI로 보고 싶을 때 Blue Ocean을 사용해야겠다ㅠㅠ
Blue Ocean 설치
플러그인 매니저 > blue ocean 검색 > Blue Ocean 선택 후 설치
나머지 리스트들은 굳이 다운로드 할 필요가 없다고 한다.
🌟도커 허브에서 Jenkins를 사용하는 경우에는 Blue Ocean이 제공되지 않는 것 같다.
Blue Ocean으로 젠킨스 실행하기

1. 위의 버튼을 눌러서 전환하거나
2. 젠킨스 서버 url/blue로 접근하면 된다.
Blue Ocean Navigation Bar
- Jenkins: Dashboard로 이동
- Pipeline: Dashboard로 이동. 만약 이미 Dashboard에 있다면, 페이지를 리로드한다. Pipeline run details페이지와는 다름
- Administration: Classic UI의 Manage Jenkins 페이지로 이동
- Go to classic icon: Classic UI로 전환
Creating a Pipline
블루 오션은 젠킨스에서 파이프라인을 쉽게 만들 수 있게 해준다고 한다.
파이프라인은 source control에 존재하는 젠킨스 파일로부터 만들어지거나, 블루 오션 파이프라인 에디터로 새로운 파이프라인으르 만들 수 있다고 한다.
Setting up your Pipeline project
블루오션 대시보드에서 New Pipeline버튼을 클릭한다.
아직 생성한 파이프라인이 없다면 Welcome to Jenkins라는 창이 뜨면서 Create a new Pipeline 버튼이 나올 수 있으니 그걸 클릭하면 된다고 한다.
파이프라인 프로젝트를 만드는 방법은 세가지가 있는데
1. Standard Git Repository
2. repository on GitHub or GitHub Enterprise
3. repository on Bitbucket Cloud or Bitbucket Server
나의 경우 GitHub이기 때문에 GitHub로 진행하였다.
내 깃헙에서 access token 생성 후 Repository를 선택한다.

++ 구축 후기
서버 비용 때문에 이렇게 구현했다.

Reference
[참고1]
[참고2]
https://kanoos-stu.tistory.com/55
[참고3]
https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_sshpass_%EC%82%AC%EC%9A%A9%EB%B2%95
'Server > DevOps' 카테고리의 다른 글
Jenkins Pipeline 사용법 (0) | 2022.08.25 |
---|---|
CI/CD (Github Actions와 Jenkins 비교) (0) | 2022.08.25 |
[AWS] Jenkins CI/CD 구축하기_(1) (0) | 2022.08.25 |
[AWS] EC2 Docker 설치 및 컨테이너 실행 (+NGINX) (0) | 2022.08.25 |
[AWS] EC2 생성 및 접속 (0) | 2022.08.25 |