Docker와 Jenkins를 이용한 CI/CD 환경을 구축해보려고 한다.
SpringBoot 어플리케이션을 AWS EC2 Linux에 올려놓은 상태이다.
먼저 CI/CD에 대해 알아보자.
✅ 빌드/테스트 자동화 과정
CI는 개발자를 위한 자동화 프로세스인 '지속적인 통합'을 의미한다.
코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 레포지토리에 병합된다. 따라서 여러 명의 개발자가 동시에 어플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌하는 문제를 이 방법으로 해결할 수 있다.
✅ 배포 자동화 과정
CD는 '지속적인 배포' 또는 '지속적인 서비스 제공'을 의미한다.
지속적인 배포란 개발자의 변경 사항을 레포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 것을 의미한다.
CI/CD를 적용하면, 빌드/테스트/배포를 자동화할 수 있고 에러를 미리 방지할 수 있기 때문에 생산성이 높아진다!
CI/CD 환경을 구축하기 위한 도구이다. 빌드, 테스트, 배포 프로세스를 자동화하여 소프트웨어 품질과 개발 생산성을 높일 수 있다.
먼저 Docker를 이해하려면, 컨테이너에 대한 개념부터 알아야 한다.
가상화, 가상머신과 도커의 비교는 아래 블로그를 참조하자.
https://m.blog.naver.com/complusblog/220980996544
AWS EC2 환경에 접속 후, 아래 명령어로 Docker 설치
$ sudo yum install docker -y
Docker 실행
$ sudo service docker start
Docker 그룹에 sudo 추가 (인스턴스 접속 후 바로 도커 제어할 수 있도록)
$ sudo usermod -aG docker ec2-user
$ docker pull jenkins/jenkins:lts
🚨 위의 명령어를 실행하는 도중 오류를 만났다.
위에서 Docker 그룹에 사용자를 추가했지만 재접속해야 변경 사항이 적용된다고 한다.
아래 명령어를 통하여 다운로드 받은 image를 container로 띄울 수 있다.
$ docker run -d -p 9090:8080 -v/jenkins:/var/jenkins_home --name jenkins -u root jenkins/jenkins:lts
🚨 로컬 포트로 8080번을 사용했더니 ec2에 8080포트를 사용하고 있는 것이 있어서 오류가 발생했다.
-> 로컬 포트를 9090번으로 바꿔주고 보안그룹-인바운드 정책에 9090번을 추가해준다.
ec2 인스턴스의 퍼블릭 IPv4 주소:9090 또는 퍼블릭 IPv4 DNS:9090로 접속이 가능하다.
정상적으로 접속이 되면 다음과 같은 화면을 볼 수 있다.
패스워드는 도커 컨테이너 안의 특정 파일에 존재한다.
아래 명령어를 통하여 패스워드를 확인할 수 있다.
$ docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
🚨 오류를 만났다.
ec2 인스턴스가 불안해서 생긴 문제 같아서 인스턴스 중지, 시작 후 다시 도커를 시작했다.
계정을 만들고 젠킨스를 시작한다.
$ docker start [컨테이너ID or 컨테이너Name]
$ docker stop [컨테이너ID or 컨테이너Name]
$ docker rm [컨테이너ID or 컨테이너Name]
젠킨스에서 잡(Job)을 생성하는 방식은 크게 프리스타일과 파이프라인 두 가지로 나뉜다.
프리스타일은 GUI기반으로 젠킨스 잡을 구성할 수 있다. 따라서 간단한 작업에 적합하고 복잡한 작업에는 적절하지 않다.
파이프라인은 일련의 배포 과정을 코드로 작성할 수 있따. 이 코드는 Jenkinsfile이라고 불리는 파일로 관리할 수 있어, Git을 통한 버전관리도 가능하다. 스테이지(Stage)라는 단위로 각 작업에 소요되는 시간, 실패 여부를 시각화하여 확인할 수 있다.
파이프라인도 문법에 따라 크게 Scripted와 Declarative 두 가지로 나뉜다.
Scripted 문법은 Declarative에 비해 유연성이나 확장성이 높지만, 복잡도와 유지 보수 난이도가 더 높다.
최근 CI/CD 기조는 Declarative 스타일로 많이 이동되고 있다고 한다.
깃허브에 푸시를 할 때 자동으로 젠킨스가 실행될 수 있도록 깃허브 웹훅을 설정해준다.
젠킨스 주소/github-webhook/
application/json
pipeline {
agent any
stages {
stage('Github') {
steps {
git branch: 'main', url: 'https://github.com/Chatting-Bar/Chatting-Bar-Server.git'
}
}
stage('Build') {
steps {
dir('Chatting-Bar-Server')
sh "./gradlew build"
}
}
stage('Deploy') {
steps {
dir('Chatting-Bar-Server/build/libs') {
sshagent(credentials: ['github_access_token']) {
sh 'scp chatbar-0.0.1-SNAPSHOT.jar ec2-user@ip-172-31-42-72'
sh 'nohup java -jar chatbar-0.0.1-SNAPSHOT.jar &'
}
}
}
}
}
}