ㅁ 젠킨스
- 젠킨스는 소프트웨어 빌드, 테스트, 배포를 자동화하는 오픈소스 CI/CD 도구입니다.
- 인스턴스 기존거는 선생님이 다 삭제했다.
- 새로 만들어서 해본다. 인스턴스 시작을 누른다.
- 빌드할때는 꼭 도커 안써도 된다. 컨테이너 안쓰고 그냥 배포해도 된다.
근데 그런 환경 구축하는게 훨씬 편하니까 도커를 설치한거다.
- 인스턴스 이름에 lsw-gdcampus-svr을 줬다.
- os는 우분투, ami는 2번째꺼 22.04를 선택했다.
- 이창이 뜨는데 그냥 변경 확인 누른다.
- 인스턴스 유형은 기본으로 선택되어 있는 t2.micro를 한다.
- 새 키 페어 생성을 누른다.
- 키 페어 이름으로 lsw-gd-keypair를 줬다.
- 키 페어 유형은 RSA, 프라이빗 키 파일 형식은 .pem으로 했다.
- 키 페어 생성을 누르면 다운로드 된다.
- 다운받은 lsw-gd-keypair를 d드라이브로 옮겼다.
- 네트워크 설정에서 편집을 누른다.
- vpc는 172.16.0.0/16으로, 서브넷은 CIDR이 172.16.16.0/24를 선택했다.
- 방화벽(보안 그룹)은 생성한다. 보안그룹 생성을 선택하고 보안 그룹 이름으로 lsw-gd-sg를 줬다.
- 아래로 내려서 보안그룹 규칙 추가를 누른다.
- 위처럼 2개를 추가했다. HTTP, Oracle-RDS를 하고 둘다 0.0.0.0/0을 줬다.
- 맨 밑의 고급 세부 정보를 연다.
- 맨 밑의 사용자 데이터 - 선택사항에 수업때 했던 대로 쉘 스크립트를 복사해 넣는다.
#!/bin/bash
sudo apt-get update -y
sudo apt-get install ca-certificates curl -y
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update -y
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
sudo usermod -aG docker ubuntu
sudo docker run -d --name oracle11g -e ORACLE_PASSWORD=1234 -p 1521:1521 gvenzl/oracle-xe:11
- 위 쉘 스크립트는 Ubuntu 서버에 Docker를 설치하고, Oracle 11g 데이터베이스 컨테이너를 실행하는 내용입니다.
(근데 사실 선생님이 만든 ec2의 디비 서버를 써서 이건 안씀. 그냥 만든거.)
1. sudo apt-get update -y
- APT 패키지 목록을 업데이트합니다.
- -y 옵션은 사용자 입력 없이 자동으로 "yes"를 선택하도록 합니다.
2. sudo apt-get install ca-certificates curl -y
- ca-certificates: SSL/TLS 인증서의 신뢰할 수 있는 목록을 제공하는 패키지입니다.
- curl: URL을 가져오거나 데이터를 전송할 때 사용하는 명령어입니다.
- Docker 설치에 필요한 파일을 가져오려면 이 두 패키지가 필요합니다.
3. sudo install -m 0755 -d /etc/apt/keyrings
- 디렉토리 /etc/apt/keyrings를 생성합니다.
- -m 0755는 권한 설정으로, 사용자 읽기/쓰기/실행, 그룹 및 다른 사용자 읽기/실행 권한을 부여합니다.
4. sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
- Docker 공식 GPG 키를 다운로드하여 /etc/apt/keyrings/docker.asc 파일로 저장합니다.
- -f: 실패 시 에러 출력 안 함
- -s: 진행 상태 출력 안 함
- -S: 에러 시 에러 메시지 출력
- -L: 리다이렉션된 URL 따라감
5. sudo chmod a+r /etc/apt/keyrings/docker.asc
- GPG 키 파일에 모든 사용자에게 읽기 권한을 부여합니다.
6. echo ... | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- Docker 공식 리포지토리를 APT 소스 리스트에 추가합니다.
- dpkg --print-architecture: 시스템의 아키텍처 출력 (예: amd64)
- $(. /etc/os-release && echo "$VERSION_CODENAME"): Ubuntu 버전 코드네임 출력 (예: focal, jammy)
- stable: Docker의 안정 버전 패키지를 사용하도록 설정
7. sudo apt-get update -y
- 새로운 리포지토리가 추가되었으므로 패키지 목록을 다시 업데이트합니다.
8. sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
- Docker의 주요 패키지들을 설치합니다:
- docker-ce: Docker 엔진(Community Edition)
- docker-ce-cli: Docker 명령어 인터페이스
- containerd.io: 컨테이너 런타임
- docker-buildx-plugin: Docker 빌드 확장 기능
- docker-compose-plugin: Docker Compose 지원
9. sudo usermod -aG docker ubuntu
- ubuntu 사용자에게 docker 그룹에 추가합니다.
- 이를 통해 sudo 없이도 Docker 명령을 실행할 수 있게 됩니다.
-aG: 기존 그룹을 유지하면서 그룹 추가
10. sudo docker run -d --name oracle11g -e ORACLE_PASSWORD=1234 -p 1521:1521 gvenzl/oracle-xe:11
- Oracle 11g 데이터베이스 컨테이너를 실행합니다.
- -d: 백그라운드에서 컨테이너 실행
- --name oracle11g: 컨테이너 이름을 oracle11g로 지정
- -e ORACLE_PASSWORD=1234: 데이터베이스의 비밀번호를 설정합니다.
- -p 1521:1521: 호스트의 1521 포트와 컨테이너의 1521 포트를 매핑합니다.
(Oracle 데이터베이스의 기본 포트는 1521입니다.) - gvenzl/oracle-xe:11: Oracle 11g 이미지 사용
- 인스턴스 시작을 눌렀따.
- 이러면 이제 정상적으로 되었다면 도커 설치하고 오라클 컨테이너까지 생성이되어있어야 한다.
ㅁ 추가적으로
- 인바운드 규칙 편집에서 현재 우리 애플리케이션 포트번호가 9999라서 저걸 했다.
9999에, 0.0.0.0/0을 하고 규칙저장을 했다.
- 디비는 별도로 만들어져있으니까 그걸 쓰면 된다. 새롬나들어야되면 컨테이널 만들든 서버에 깔든 디비를 서버에 구축하고 테이블 만들어서 준비를 해야되는데 지금은 할 필요가 없는거.
- 우리꺼 applicaiton.propetiertis에서 디비 관련 설정만 ㅏㅂ꿔주면 되는듯.
ㅁ docker ps
- 오라클이 설치되어 있다.
ㅁ docker inspect oracle11g
- 172.17.0.2다.
(근데 의미 없음. 선생님이 만든 ec2 디비 오라클 컨테이너 디비 서버를 application.proeperieteis에 써서.)
- 깃에 도커파일도 넣어야 한다.
도커파일은 다른사람이 main에 올렸다.
- 디비 . sql developer는 아무것도 안했다. ㅆ"ㅐㅁ이 ec2해서 열어놔서 공용디비 쓰면서 어플리케이션 프로퍼티에다가 쌤 공용 디비 번호를 넣었잖아. 그래서 그건 안건드려도 되는데 나중에 그거 닫고 우리가 우리 개인거쓰면 바꿔줘야한다.
- 어플리케이션프로퍼티스도 수정 안했다.
- 파이프라인 스크립트 master에서 main으로 수정했다. 또 깃허브 주소 우리걸로 바꿨다.
==[이하 가저온거]========
- 젠킨스로가기전에
- 버츄얼박스의 우분투 킨다.
ㅁ ngrok http http://localhost:8080
- 입력했다.
- ㅂ복사는 ctrl shift pausebreak키. ctrl c는 꺼져버림.
이 창이 꺼지면 안되나 봄. 듀플리케이트 하든지. 저 복사를 하든지.
- 비짓 사이트하면 어제 우리가 설치해놓은 젠킨스가 뜬다.
admin, 1234를 뜬다.
- 이렇게 뜬다 로그인하면. 어제한 test prjocet가 보인다.
=====[위까지 가져온거]=================
- add webhook을 눌렀다.
- 패이로드 url에 앞에는 ngrok의 그걸 쓰고, 뒤에는 /github-webhook/을 붙였다.
- add webhook 누른다.
= 젠킨스는 저장소에 한사람 것만 웹훅에 연결해야 한다. 충돌날 수 있으니까.
- ec2 서버도 서버 한대로만 배포할 거면 한명만 하면 된다.
- 버츄얼박스의 우분투에서 ngrok http http://localhost:8080 을 하면 아래와 같이 나온다.
https://3be4-14-36-141-71.ngrok-free.app/ -> http://localhost:8080
근데 이것도 한사람만 하면 된다. 한사람이 ec2 인스턴스 만들고 개인키도 등록해놓고, 다른사람이 젠킨스에 로그인할 때는 다른사람이 설정한 젠킨스의 아이디와 비번 admin, 1234로 로그인해서 / 위에서 한 설정들도 한사람이 하면 된다.
- 근데 저장소 웹훅 설정은 저장소관리자가 나라서 내가 해야 한다.
이때 내 버츄얼박스에서 나온 ngrok 주소가 아니라, 다른사람의 주소인 https://5b8f-14-36-141-71.ngrok-free.app/ 를 입력해야한다. 그 뒤에 /github-webhook/를 해줘야 한다.
- 다른사람은 이 웹훅 설정은 안했다. 그래서 커밋푸쉬 깃허브에 한게 젠킨스에서 자동으로 pull되어서 배포까지 되진 않는다.
다른사람은 지금빌드를 눌러줘야 한다.
파이프라인
import java.text.SimpleDateFormat
def TODAY = (new SimpleDateFormat("yyyyMMdd")).format(new Date())
pipeline {
agent any
environment {
strDockerTag = "${TODAY}_${BUILD_ID}"
strDockerImage ="gdlsw/gdcampus:${strDockerTag}"
}
stages {
stage('Github Pull') {
steps {
git branch: 'main', url:'https://github.com/LSW-20/gdcampus.git'
}
}
stage('Build') {
steps {
sh 'chmod u+x mvnw'
sh './mvnw clean package -Dmaven.test.skip=true'
}
}
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()
}
}
}
}
stage('Staging Deploy') {
steps {
sshagent(credentials: ['Staging-PrivateKey']) {
sh "ssh -o StrictHostKeyChecking=no ubuntu@43.202.47.169 docker container rm -f gdcampus"
sh "ssh -o StrictHostKeyChecking=no ubuntu@43.202.47.169 docker container run \
-d \
-p 80:9999 \
-v /home/ubuntu/upload:/app/upload \
--name=gdcampus \
${strDockerImage} "
}
}
}
}
}
- 바로 위 스샷 에서 잘못된점. master가 아니라 main이어야 함.
- 43.202.47.169는 EC2의 공인 IPv4주소다.
- gdlsw는 도커허브 닉네임인가 아이디다.
아래 LSW-20은 깃허브 닉네임이다.
- 컨테이너가 서버가 되는데 그 안에서 동작시키면 컨테이너의 포트가 9999가 된다. 접속할때는 80으로 해주면 된다.
애플리케이션은 컨테이너 안에서 동작하기 때문에 9999번으로 ㄷㅇ작하는데, 접속할때는 80으로 하겠다.
- 여기서 컨테이너 내부 포트번호를 9999로 해서 브라우저에서 url로 접속할 때 뒤에 :9999안하고 공인 ipv4주소만으로도 갈 수있다.
ㅁ 젠킨스
- 새로운 item을 누른다.
- 깃허브 훅을 체크한다.
- 아래 파이프라인에 위에 pipeline.txt를 붙여넣는다.
- 그리고 저장.
- 저장하면 이렇게 뜬다.
- 저장하고나서 이제 두개 인증을 만들어줘야 한다.
도커에 로그인할때 사용할 인증 docekr-auth. 이름은 다르게 해도 되는데 지금 코드에 저렇게햇으니 저렇게 만들거고,
staging-rprivatekey도 만들거다.
- 대시보드에 왔다.
- 왼쪽 메뉴에서- jenkins 관리 - credentials에서 globals 파란색 글자 누르고,
add credentails 버튼을 누른다.
도커는 username과 패스워드로 인증하는 방식을 쓸거다.
- 크레덴셜스 클릭
- 그런데 이미 만들어져 있다.
- 처음 aws에서 ec2 만들 때 개인키를 새로 생성하지 않고 전에 쓰던 lsw-keypair.pem을 썼으면 여기선 안건드려도 되는데, 난 ec2만들 때 개인키를 새로 생성했었따.
- add 대신 replace 파란색 버튼이 있따. 누르고 개인키를 저렇게 붙여놓고 save했다.
- save하면 아래와 같이 뜬다. 잘 된거다.
ubuntu
Usage
This credential has not been recorded as used anywhere. Note: usage tracking requires the cooperation of plugins and consequently may not track every use.
우분투
사용
이 자격 증명은 어디에서도 사용된 것으로 기록되지 않았습니다.
참고: 사용 추적은 플러그인의 협력이 필요하므로 모든 사용을 추적하지 못할 수 있습니다.
[아래는 퍼온거]
- 암튼 오류 해결하기 위해.
jenkins 서버에서 다음 명령어를 써준다. 버츄얼박스의 우분투에다가. ngrok 창이 꺼지지 않게 듀플리케이트해서 한다.
sudo usermod -aG docker jenkins
sudo service jenkins restart
- 젠킨스도 명령을 sudo없이 실행하게끔 docker 그룹에 포함시켜준다.
[위는 퍼온거]
- 위에 2줄을 수업시간때 했다. 그래서 지금은 안했따.
- 일단은 내 ec2와 내 젠킨스에서 지금빌드로 되는지 확인하기 위해 지금 빌드를 눌렀떠니 오류.
- pipeline.txt가 main이어ㅑㅇ하는데 master였다.
- 구성에서 main으로 바꾸고 저장했다.
- 다시 지금빌드를 보니 된다.
- 도커허브에서도 확인해본다.
이미지가 올라갔다.
- 새로만든 ec2 공인 ipv4주소로 로그인해본다.
- 파이프라인에서 -p 80:9999를 해놨기 때문에 뒤에 :9999가 없어도 들어가진다.
- 어쨌든 되는건 확인했다.
- 깃허브 저장소에서 애드웹훅 누른다.
- 위에는 내 주소다.
다른사람걸로 해도 되지만 다른사람과 내 진도가 똑같으니 내걸로 해본다.
- 페이로드url을 작성하고 add webhook을 누른다.
- 그럼 이렇게 뜬다.
- 새로고침 한다.
- 체크표시로 바뀌었다.
- 방금 만들어서 deliver이 됐다고 표시돼서 할 필요는 없지만,
그래도 redeliver시켜본다. 저 파란색 글씨를 누르낟.
- 여기서 recent deliveries를 누르낟.
- ...를 누른다.
- 여기서 redeliver를 누른다.
- 그럼 redelivery된걸 볼 수 있다.
젠킨스와 깃허브간에 통신이 잘 된단 얘기다.
- sts에서 메인페이지의 문구를 바꾸고 gdcampus 저장소 main에 커밋&푸쉬했다.
- 내가 sts에서 작업하고 깃허브로 커밋&푸쉬한 사항을, 젠킨스에서 pull로 깃허브에서 내려받고, 빌드해서 jar파일 만들고, 도커 이미지 만들고, 도커허브에 푸쉬한다.
- 젠킨스에서 staging deploy는 운영 전 최종 테스트를 위해 스테이징 서버에 코드를 배포하는 단계입니다.
- 근데 또 젠킨스에서 마지막 단계에서 안넘어간다.
- aws의 ec2에 또 연결이 안된다. 다른사람건 된다.
- 다른사람건 되니까 깃허브에서 웹훅을 바꿔본다.
edit을 누른다.
- 다른사람건 되니까 깃허브에서 웹훅을 바꿔본다.
https://3be4-14-36-141-71.ngrok-free.app/github-webhook/ 에서 (내거)
https://5b8f-14-36-141-71.ngrok-free.app/github-webhook/ 로 바꾼다. (다른사람거)
- 그리고 recente deleveries - 제일 위에거 오른쪽의 ... - redeliver를 눌러서 통신이이 잘 되는지 확인한다.
- redelivery가 뜬다. 통신은 잘 된다.
- 내 aws ec2 서버가 연결이 안되서 다른사람 걸로 깃허브의 웹훅에 연결했다.
- 그리고 메인페이지를 수정하고 커밋&푸쉬했다.
- 다른사람 젠킨스 경로로 url에 들어가서 admin, 1234로 로그인하면 커밋중인게 보인다.
- 다 완료되었다.
- 그사람의 ec2의 공인 ipv4 주소(http://43.200.255.252/)로 들어가보면 들어가진다.
메인페이지의 수정사항('구디아카데미 로그인' 앞뒤로 별 없애기)도 반영되어있다.
- vpc느 aws안에 우리만 쓸 네트워크를 만드는거다. 다른회사에서 쓰면안되니까. aws 안에서 우리만 쓰는 공간을 만든다 극 ㅔvpc다.
- vpc3개있는건 학원에서해준거고 기본으로 ㅁ나들면 1개있다.
- 서브넷은 a인걸 보통 하면 된다. 가용영역이 a, b, c이렇게 나뉘어 있다.
- vpc는 바로쓸수잇는게 아니라 서브넷을 만들어줘야한다. 하나으 ㅣ큰네트워크를 서브넷으로 쪼개서 쓰는거다.
거기다 ec2나 다른서비스를 만든다.
- 서브넷에서 할당되는건 사설 ip다.
- 프라이빗 서브넷은 다른사람이 못들어간다. 외부에선.
- ec2 인스턴스 접속 내거가 안되어서 다시 만들었다. 잘 된다.
- 디비서버는 보통은 따로 만드는데, 테스트용으로는 지금의 ec2 서버에 오라클 디비를 만들어도 된다.
- 디비도 젠킨스도 로컬에 두고 ngrok써서 해도 된다.
버츄얼박스에서 지금 우분투 하나만 있죠. 엔지락으로 연결해서.
지금 하나는 젠킨스용으로, 하나는 디비용으로 쓰는거죠.
저거 복사하면 돼요. 엔지락을 무료로 쓸때는 포트를 하나밖에 못 써서 두개를 하는거.
- 실제 배포하는 서버만 aws의 서버를 쓰는거죠. 그건 외부에서 접속이 되어야하니까.
- 물론 배포서버도 버츄얼박스에 써도 된다. 그럼 엔지락으로 배포해도 되니까. 근데 그러진 말고 aws로 한다.
- 제일 편한건 다 aws에 두고 쓰는건데 비용이 신경 쓰이니까. 다른건 다 로컬에 두고 배포 서버만 ec2로 사용을 하면 된다.
- 이건 도메인과 인증서를 사서 선생님이 해보신 사이트다.
- Gabia에서 1년에 500원에 도메인을 샀다. 가비아 말고도 딴데도 많이 있다.
도메인을 가서 내가 원하는 도메인을 검색하면 나오는데 왠만하면 다 등록이 되어 있다.
- 인증서는 옛날에는 샀어야 하는데 요즘에는 3개월 무료. 그 후엔 바꿔야 하는 걸로 있따.
- 구매하면 보통 하루정도 지나야 도메인을 쓸 수 있다.
- 그럼 산 거에다가 ip를 연결시켜놓으면 된다.
dns 관리에서 내가 산걸 선택하고 dns 설정으로 가서 호스트는 www, 주소에는 aws의 공인ipv4 주소를 입력하면 된다.
- 근데 이제 인증서는 안되어있는 상태다. 인증서는 사든지 무료인증서를 사든지. 3개월마다 갱신해야하는걸. 그럼 https로 서비스할 수 있다.
>> Let's encrypt 인증서 설치를 위한 프로그램 설치
amazon-linux-extras install epel
yum install cerbot
yum install certbot
>> 인증서 발급요청 : 서버가 동작중이어야하고 80번 포트가 개방돼 있어야 함.
certbot certonly --standalone -d pre.goodee.co.kr
cd /etc/letsencrypt/live
cd pre.goodee.co.kr/
>> Spring Boot에서 사용하기 위해 인증서를 pkcs12형식으로 파일 변경. 패스워드 설정하고 해당 패스워드를
application.properties 파일에 등록해야함. name은 임의로 설정
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name ttp
- application.properties
#SSL
server.ssl.key-store=classpath:keystore.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=비밀번호
>> Let's encrypt 인증서는 3개월마다 갱신해야함.
- 실제로 갱신하지않고 갱신 가능한지 테스트함.
certbot --dry-run renew
- 모든 인증서 갱신 : 특정 인증서를 갱신하려면 -d 도메인
certbot renew
openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out keystore.p12 -name ttp
- 가비아에서 그 연결을 해놓고 배포서버에서 이걸 하면 된다.
- 배포서버에 certbot이라는 패키지를 설치하고, (sudo apt install certbot)
그리고 내가가 원하는 도메인을 적어주는 거다. (certbot certonly --standalone -d www.cloudwave.shop)
그럼 cd로 저렇게 가면 저런게 있다.
가면 키가 있을건데 스프링 부트에서 쓰려면 인증서를 pkcs12형식으로 파일을 변경해야 한다.
- 이렇게해서 생성된 keystore.p12로 만들어진 파일을 소스의 클래스패스에다가 추가해야 한다.
- resources/application.properites와 같은 레벨로 keystore.p12 파일을 끌어다 놓고,
application.properties에 아래 3줄을 추가한다.
server.ssl.key-store=classpath:keysotre.p12
server.ssl.key-type=PKDC12
server.ssl.key-password=P@ssw0rd
- 원래는 t2micro인데 t2small쓰면 계속쓰면 한달에 2만원 정도. 계속 썼을 때 얘기고 잠깐 테스트하고 지우면 얼마 안나와요. 근데 여기 안에 있는 서비스를 모르는 상태에서 써버리면 비용이 많이 나올 수 있는데 필요한 것만 쓰고 지우면 얼마 안든다.
'배포 > AWS' 카테고리의 다른 글
4. 젠킨스로 배포 (1) | 2024.12.11 |
---|---|
3. CI/CD - Jenkins, GitHub, Eclipse (0) | 2024.12.10 |
2. AWS EC2(우분투)에 배포하기 (1) | 2024.12.10 |
1. aws 개념 (1) | 2024.12.10 |