순서 대로 작성은 할 것인데 생각의 흐름 대로 적어
글에 두서가 없을 수 있습니다.
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

sudo usermod -aG docker [계정명을 기입하시오]
cat /etc/group | grep docker
or
sudo groupadd docker
sudo usermod -aG docker $USER
sudo newgrp docker
CI/CD : Continuous Integration/Continuous Delivery
spring boot 3.2.x 버전의 서버를 돌리므로
jdk17 버전의 jenkins를 사용한다.
추후에 DooD 를 사용하기 위해 jenkins의 볼륨을 마운트 해줘야 하는데 jenkins를 껐다켤때마다 다시 옵션을 설정해줘야 하는 번거로움이 있다.
이를 모두 기억하기 힘드니까 도커 컴포즈 파일로 만들어서 빌드한다.
그리고 여러개의 도커 컴포즈 파일을 만들 수 있으므로
composeFiles라는 디렉토리를 만들어서 관리하도록 하고
그 안에 docker-compose.jenkins.yml 을 만들어 준다.
version: "3.8"
services:
jenkins:
container_name: jenkins
image: jenkins/jenkins:jdk17
restart: unless-stopped
user: root
ports:
- 9090:8080
volumes:
- /home/ubuntu/jenkins:/var/jenkins_home
- /home/ubuntu/.ssh:/root/.ssh
- /var/run/docker.sock:/var/run/docker.sock
+04.24 추가) 계속 젠킨스 컨테이너 내 도커를 설치했을 때 다음부터 접속이 안되는 문제가 있어서 서버를 몇 번 초기화했다. /home/ubuntu/.ssh:/root/.ssh를 마운트 하면서 진행하는데 이 부분에서 문제가 발생하는 것이 아닌지 의심중 ->
추가) - docker.sock

docker.sock 은 항상 명령을 받을 준비를 한다. 얘를 컨테이너가 사용하기 위해 볼륨으로 마운트 해주는 것
$ docker compose -f dockerFiles/docker-compose.jenkins.yml up -d --build
실행했으면 브라우저에서 접속해보기
-> $ docker ps -a 로 로그 확인해보고 켜졌는지 확인
-> 안되면 ec2 인스턴스 보안그룹에서 포트 설정 확인하기
-> 안되면 ec2 방화벽 설정 해주기 $ sudo ufw status 확인해보기
접속했다면
$ docker logs jenkins 를 입력해서
설치를 위한 비밀번호 복사한 후 사이트에 붙여넣고 기본(권장) 설치로 설치하기


우리는 CI/CD를 구축하는데
Pipeline으로 구축하겠다
->
1. 빌드하는데 각 단계별로 모니터링 가능하면서
2. 에러가 어디서 발생했는지 쉽게 볼 수 있고
3. 스크립트를 짜서 관리가 쉽다.
단점 : 스크립트를 짤 줄 알아야 한다.
item을 생성할 때 pipeline으로 생성해준다.

Pipeline script 는 웹 페이지 상에서 스크립트를 작성해서 적용시키는 방식이고
밑에 SCM 은 jenkinsfile로 스크립트 명령어를 관리하는 방식을 채택한다는 뜻.
우리는 웹에다 바로 적자
pipeline {
agent any
stages {
stage('Clone') {
steps{
git branch: '{변경 감지 할 브랜치}', credentialsId: '{credential 아이디}', url: '{web-hook 보내는 git 리포지토리 주소 ex) ~~.git}'
sh "sed -i 's/{docker-compose.yml에서 암호화된 JASYPT_KEY}/{암호화 전 키}/g' docker-compose.yml"
sh "cat docker-compose.yml"
}
}
stage('Build'){
steps{
dir('backend/farmyo') {
sh "chmod +x gradlew"
sh "./gradlew clean build"
}
}
}
stage('Deploy') {
steps{
// 이전에 실행된 컨테이너를 중지하고 삭제합니다.
sh "docker stop farmyo-backend || true"
sh "docker rm farmyo-backend || true"
sh "docker stop farmyo-frontend || true"
sh "docker rm farmyo-frontend || true"
// 이전에 빌드된 이미지를 삭제합니다.
sh "docker rmi farmyo_pipeline-farmyo-frontend || true"
sh "docker rmi farmyo_pipeline-farmyo-backend || true"
sh "docker ps -a || true"
sh "docker images || true"
sh "docker compose build --no-cache"
sh "docker compose up -d"
}
}
}
post {
success {
script {
def Author_ID = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
def Author_Name = sh(script: "git show -s --pretty=%ae", returnStdout: true).trim()
mattermostSend (color: 'good',
message: "빌드 성공 ^_^ v : ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\n(<${env.BUILD_URL}|Details>)",
endpoint: '{deploy 알림을 받을 Mattermost 채널 주소}',
channel: '{알림 받을 채널 명}'
)
}
}
failure {
script {
def Author_ID = sh(script: "git show -s --pretty=%an", returnStdout: true).trim()
def Author_Name = sh(script: "git show -s --pretty=%ae", returnStdout: true).trim()
mattermostSend (color: 'danger',
message: "빌드 실패 ㅜ_ㅜ : ${env.JOB_NAME} #${env.BUILD_NUMBER} by ${Author_ID}(${Author_Name})\n(<${env.BUILD_URL}|Details>)",
endpoint: '{deploy 알림을 받을 Mattermost 채널 주소}',
channel: '{알림 받을 채널 명}'
)
}
}
}
}
jenkins 에서는 git에 수정사항을 Webhook을 통해서 감지하게 되는데
여기서 해당 repository 의 코드를 받아와야 한다.
그러기 위해서는 git 접근 권한을 줘야 한다.
-> repository가 public 이면 굳이 권한까지 필요는 없다고 함
그래도 일단 적용 해보자 ( private로 할 수 있으니까 )



해당 토큰 값을 복사해둔다. 중요!!
jenkins 에서



++ 추가 
나는 이 플러그인이 안깔려 있어서 파이프 라인이 GUI 로 안보였음
jenkins에서 설치 안되어있으면 설치하시길
webhook 용 토큰을 repo, repo_hook 옵션을 체크 해주면서 하나 만들어 주자

그리고 jenkins에 credentials로 등록해준다.
webhook token 등록

여기서 password 는 webhook 토큰 생성시 나오는 값 복붙하기.
jenkins 환경설정에서 github server 등록해주기

프로젝트에서 webhook 을 받도록 설정

webhook을 보낼 repository에 들어가서


이렇게 설정 해주면

초록색 체크 표시가 뜬다. 그러면 CI 구축 완료
+) 추가
Personal Access Token 생성은 여기서 해준다.

Project Access Token은 이렇게 생성한다.


기한은 2달정도로 잡고 권한은 일단 필요해 보이는거 선택했다.

jenkins 에서 gitlab 플러그인을 설치한다.