svr1 AWS EC2 생성 docker 설치 : Mariadb 컨테이너 생성
svr2 AWS EC2 생성 후 docker 설치
- jdk, docker 설치, guestbook 소스 파일로 컨테이너 생성
- guestbook컨테이너로 도커이미지 생성(guestbookapp)
- 도커이미지 도커허브에 Push(업로드)
- 도커이미지 pull하여 실행하면 자동으로 실행이 되고, 똑같은 환경을 맞출 수 있음.
기존은 개발자가 수동으로 빌드까지 하고 이미지를 업로드하고, 이미지를 pull하여 같은 환경의 컨테이너를 생성했다면, 오늘은 Jenkins를 활용하여 자동 이미지 빌드 및 푸쉬 & 성공시 배포서버로 이동하는 것까지 실습할 예정이다.
guestbook은 jdk 8인데? svr이랑 안맞춰도 되나??
컨테이너 안에서 작동하는 것이기 때문에 상관 x
#!/bin/bash
yum install -y java-17-amazon-corretto
yum install -y git
yum install -y docker
systemctl start docker
systemctl enable docker
usermod -aG docker ec2-user
yum update -y
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
yum upgrade
yum install jenkins -y
systemctl start jenkins
#!/bin/bash
yum install -y docker
systemctl start docker
systemctl enable docker
usermod -aG docker ec2-user
docker container run -d \
--name=mydb \
--restart=always \
-e MYSQL_ROOT_PASSWORD=education \
-e MYSQL_DATABASE=guestbook \
-p 3306:3306 \
mariadb
[ec2-user@ip-172-31-44-84 ~]$ sudo systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)
Active: active (running) since 월 2024-01-15 01:44:32 UTC; 9s ago
Main PID: 5792 (java)
CGroup: /system.slice/jenkins.service
└─5792 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war --httpPort=8080
1월 15 01:44:05 ip-172-31-44-84.ap-northeast-1.compute.internal jenkins[5792]: {jenkins 비번 출력 부분}
1월 15 01:44:05 ip-172-31-44-84.ap-northeast-1.compute.internal jenkins[5792]: This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword
1월 15 01:44:05 ip-172-31-44-84.ap-northeast-1.compute.internal jenkins[5792]: *************************************************************
1월 15 01:44:05 ip-172-31-44-84.ap-northeast-1.compute.internal jenkins[5792]: *************************************************************
1월 15 01:44:05 ip-172-31-44-84.ap-northeast-1.compute.internal jenkins[5792]: *************************************************************
...
만약, 무언가의 오류(정말 다양한 오류 있음.. 예 : 스크립트 오타, 바운드 규칙 등)로 생성시 자동실행이 되지 않았다면???
자동실행에 넣어둔 파일의 설치여부를 확인한 뒤, self로 설치 명령어를 입력해야 한다. (스크립트 문에 있는 명령어로)
혹, 설치중에 에러로 인해 비정상적으로 정지되어 추가적인 설치가 되지 않을 수 있다.
그럴 때는 다른 Install이 진행되지 않으니까..
반드시 sudo kill -9 yum 을 눌러 설치에러가 난 yum을 멈춘 뒤, 다시 install을 진행하자!! (한참 걸림 ㅠㅠ)
주의!
EC2 생성 시 아웃바운드 규칙 편집 주의해야함.
아예 없어도 외부와 소통이 되지 않고, 특정 서버만 들어가 있을 경우, 그 포트로만 외부 소통이 가능하기 때문에
0.0.0.0/0으로 열어놓는 설정이 유지되어 있어야 함.
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
stage('File Copy'){
steps{
sh 'cp /etc/profile /tmp'
}
}
}
}
3차 Script
import java.text.SimpleDateFormat
def TODAY = (new SimpleDateFormat("yyyyMMdd")).format(new Date())
pipeline {
agent any
environment {
strDockerTag = "${TODAY}_${BUILD_ID}"
strDockerImage ="{도커 아이디}/{도커 레포이름}:${strDockerTag}"
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url:'https://github.com/{깃허브 유저이름}/{깃허브 레포이름}.git'
}
}
stage('Build') {
steps {
sh 'chmod u+x mvnw'
sh './mvnw clean package'
}
}
stage('Docker Image Build') {
steps {
script {
oDockImage = docker.build(strDockerImage, "--build-arg VERSION=${strDockerTag} -f Dockerfile .")
}
}
}
stage('Docker Image Push') {
steps {
script {
docker.withRegistry('', 'DockerHub_{도커유저이름}') {
oDockImage.push()
}
}
}
}
}
}
credentialsId: 'jenkins3' 같은 경우도 추후 깃허브 레포지토리를 private으로 만들었을 경우, stage('Checkout') steps 중괄호 안에 추가해야 한다.
pipeline {
agent any
stages {
stage("Slack Notification") {
steps {
slackSend(tokenCredentialId: 'slack-token'
, channel: '#jenkins'
, color: 'good'
, message: 'CICD 테스트 메세지')
}
}
}
}
pipeline {
agent any
stages {
stage("Slack Notification") {
steps {
slackSend(tokenCredentialId: 'slack-token'
, channel: '#jenkins'
, color: 'good'
, message: 'CICD 테스트 메세지')
}
}
}
post {
always {
slackSend(tokenCredentialId: 'slack-token'
, channel: '#jenkins'
, color: 'good'
, message: "빌드가 끝났습니다. ")
}
success {
slackSend(tokenCredentialId: 'slack-token'
, channel: '#jenkins'
, color: 'good'
, message: "빌드가 성공적으로 끝났습니다. ")
}
failure {
slackSend(tokenCredentialId: 'slack-token'
, channel: '#jenkins'
, color: 'danger'
, message: "빌드가 실패하였습니다.")
}
}
}
레포지토리 생성(guestbookapp) : https://github.com/{깃허브 유저이름}/{깃허브 레포이름}.git
레포지토리 설정
- 웹훅, 젠킨스 주소(http://52.69.224.147:8080/)참고하여 작성
- http://52.69.224.147:8080/github-webhook/
- 젠킨스와 호환여부 표시됨 (ping)
토큰 생성 방법 : 아이콘 -> settings -> Developer settings -> personal access tokens -> Tokens(classic) -> Generate new token
토큰 생성 입력 시
- Note : 토큰명(예 : CICD-token)
- Expiration : 사용기간(30일)
- Select scopes : repo, admin:repo_hook, user 클릭 & Generate token
- 생성되는 토큰 개별 저장!! (추후 사용 예정)
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'main', url:'https://github.com/{깃허브 유저이름}/{깃허브 레포이름}.git'
}
}
stage('Build') {
steps {
sh 'chmod u+x mvnw'
sh './mvnw clean package'
}
}
}
}
github에 새롭게 push를 하게 되면, Checkout(브랜치 변경), Build(메이븐 빌드, 클린)가 실행되는 것을 확인할 수 있다.
안된다면?? 현재 jenkins를 설치해 둔 서버에 git이 설치되어있는지, 연결되어있는지 확인해보자. 아니라면? 설치하고 해당 레포지토리랑 연결하면 지금빌드가 정상적으로 실행되는 것을 확인할 수 있을 것이다.(sudo yum install -y git)
117 cd guestbook_cicp
118 sudo usermod -aG docker jenkins
119 sudo systemctl restart jenkins
120 cd
121 sudo systemctl restart jenkins
122 sudo usermod -aG docker jenkins
123 sudo systemctl restart jenkins
cd src/main/resources/templates
vi index.html
cd ../../../../
git add .
git commit -m "2"
git push origin main
import java.text.SimpleDateFormat
def TODAY = (new SimpleDateFormat("yyyyMMdd")).format(new Date())
pipeline {
agent any
environment {
strDockerTag = "${TODAY}_${BUILD_ID}"
strDockerImage ="{도커아이디}/{도커 레포이름}:${strDockerTag}"
}
stages {
stage('Checkout') {
steps {
git branch: 'main', url:'https://github.com/{깃허브 유저이름}/{깃허브 레포이름}.git'
}
}
stage('Build') {
steps {
sh 'chmod u+x mvnw'
sh './mvnw clean package'
}
}
stage('Docker Image Build') {
steps {
script {
oDockImage = docker.build(strDockerImage, "--build-arg VERSION=${strDockerTag} -f Dockerfile .")
}
}
}
stage('Docker Image Push') {
steps {
script {
docker.withRegistry('', 'docker-auth') {
oDockImage.push()
}
}
}
}
}
}