갬미의 성장일기
Day 65 - CICD 본문
오늘 배운 내용
- CICD
CICD
어제 만든 cicd.yaml 파일은 docker image build까지 였다
오늘은
- 도커 이미지 푸쉬
- 자동 배포
- war 파일 백업
- 도커 이미지 백업
까지 구현하였다
1. 도커 이미지 푸쉬
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker Push
run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/m-dev:tomcat-latest
secrets에 변수를 저장해두고 가져와야한다
repo > settings > Secrets > Actions
토큰 만들기
토큰은 한번만 보여지니 꼭 복사해둬야한다 > 이를 Secrets > Actions에 저장한다
was container deployment 파일을 수정한다
1. image - latest 이미지를 받아오도록
2. imagePullPolicy: Always
apiVersion: apps/v1
kind: Deployment
metadata:
name: was
spec:
replicas: 3
selector:
matchLabels:
app: was
template:
metadata:
labels:
app: was
spec:
containers:
- name: was
image: gymin97/m-dev:tomcat-latest
imagePullPolicy: Always
ports:
- containerPort: 8080
initContainers:
- name: init-redis
image: busybox:1.28
command: ['sh', '-c', "until nslookup redis-svc.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for redis-svc; sleep 2; done"]
- name: init-mysql-svc
image: busybox:1.28
command: ['sh', '-c', "until nslookup db-0.mysql-svc.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mysql-svc; sleep 2; done"]
2. 자동 배포
이거만 주고 냅다 git push를 해도 was 서버가 자동 배포되지 않는다
kubectl rollout restart deployment/was
--> git push시 업데이트 됨
이걸 yaml에 포함해야한다
지금 클러스터와 연결이 되어있지않기 때문에 먼저 연결하고 위 명령어를 넣는다
- name: Get GKE Credentials
uses: google-github-actions/get-gke-credentials@v0.7.0
with:
cluster_name: gymin
location: us-central1-c
project_id: annular-magnet-343008
credentials: ${{ secrets.GKE_SERVICE_KEY }}
- name: Was-delpoy restart
run: kubectl rollout restart deployment/was
Get GKE Credentials
- name: Get GKE Credentials
with:
cluster_name: # 클러스터 이름
location: # 클러스터 위치
project_id: # 프로젝트 이름
credentials: # 서비스 어카운트 - JSON 그대로 넣거나 base64로 인코딩 / 너무 길어서 secret 이용
context_name: # cluster connect code (안해도 됨)
gke 서비스 어카운트 만들기
key > add key json 다운로드
3. war 파일 백업
지금은 빌드가 될 때마다 cicd 실행 후 사라진다
클라우드 object storage에 백업받되, 같은 이름의 파일이 백업되면 덮어쓰기 되니까 이름이 겹치지 않게 하여 빌드 파일이 생길때 마다 백업되게 한다
이건 조별로 과제를 주셔서 다양한 방법이 나왔더
1. 시간을 war파일명으로
2. 시간을 folder로하고, 그 안에 war
3. 커밋메세지를 war파일명으로
4. github action env 사용 GITHUB_SHA 앞 7글자를 war파일명으로
나는 우분투 date 명령어를 이용해 y-m-d-H-M으로 war파일이 저장되게 하였다
시간으로 이름을 바꾸신 다른분들은 github action 기본환경변수를 이용하여 시간으로 저장되도록 활용하셨다
- name: filename change
run: |
DATE=$(date +%y-%m-%d-%H:%M)
mv ./build/libs/*.war ./build/libs/$DATE.war
- name: Cloud Storage Uploader
uses: google-github-actions/upload-cloud-storage@v0.9.0
with:
credentials: ${{ secrets.GKE_STORAGE_KEY }}
path: ./build/libs/
parent: false
destination: war-backup
glob: '*.war'
조직마다 커밋메세지 규칙을 주고 앞의 5글자를 war 백업 파일명에 활용한다고 해도 좋을 것 같다!
4. 도커 이미지 백업
도커파일도 마찬가지로 계속 latest로 태깅되어 올라가기 때문에 도커 이미지도 백업해놓을 필요가 있다
1. 하나의 dockerfile로 빌드를 두번하고 모두 올리자
CICD 에서 배포할때는 latest 버전을 사용하도록 이건 계속 덮어쓰기 하고
백업용 이미지는 파일명을 다르게하여 덮어쓰기 되지 않도록한다
cicd.yaml 도커부분 수정
- name: copy war file
run: |
cp ./build/libs/*.war ./Dockerfile
docker build \
-t ${{ secrets.DOCKERHUB_USERNAME }}/m-dev:tomcat-latest \
-t ${{ secrets.DOCKERHUB_USERNAME }}/tomcat-backup:tomcat-$(date +%y-%m-%d-%H-%M) ./Dockerfile
docker images
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker Push
run: |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/m-dev --all-tags
docker push ${{ secrets.DOCKERHUB_USERNAME }}/tomcat-backup --all-tags
원래는 build와 push 모두에 $(date +%y-%m-%d-%H-%M) 태그를 주었는데 분단위로 들어가다보니까 build 후 push 되기 직전 분이 바뀌면 이미지가 없다고 push되지 않았다
일단 --all-tags를 주었는데 $(date +%y-%m-%d-%H-%M)를 변수로 처리하고싶은데 잘 안되었다 ..
근데 이방법도 좋은것 같아서 ,, 나름 .. 만족.. ㅜ 근데 알고싶다
같은 레포지토리에 백업파일과 latest 파일을 같이 올리면 지저분해질것같아 백업용 레포지토리를 파놓고 백업 이미지는 거기에 업로드 했다
이미지 이름을 $(date +%y-%m-%d-%H-%M)로 준 이유는 war 백업을 $(date +%y-%m-%d-%H-%M)로 했기 때문이다 나중에 되돌리기 할때 둘이 매칭하기 쉬우라고 이렇게 했다
+ 커밋메세지를 같이 넣어도 좋을 것 같다!
build이미지 이름을 바꾸는 아이디어도 시간, 커밋메세지, 커밋횟수,,등 다양했다
전체 yml파일
# This is a basic workflow to help you get started with Actions
name: test2
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
branches: [ main ]
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v3
- name: install jdk
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '11'
cache: 'gradle'
- name: chmod gradle
run: chmod +x ./gradlew
- name: build
run: ./gradlew build --no-daemon
- name: check build
run: ls ./build/libs
# docker setup
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: docker ps
run: docker ps
- name: copy war file
run: |
cp ./build/libs/*.war ./Dockerfile
docker build \
-t ${{ secrets.DOCKERHUB_USERNAME }}/m-dev:tomcat-latest \
-t ${{ secrets.DOCKERHUB_USERNAME }}/tomcat-backup:tomcat-$(date +%y-%m-%d-%H-%M) ./Dockerfile
docker images
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Docker Push
run: |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/m-dev --all-tags
docker push ${{ secrets.DOCKERHUB_USERNAME }}/tomcat-backup --all-tags
- name: Get GKE Credentials
uses: google-github-actions/get-gke-credentials@v0.7.0
with:
cluster_name: gymin
location: us-central1-c
project_id: annular-magnet-343008
credentials: ${{ secrets.GKE_SERVICE_KEY }}
- name: Was-delpoy restart
run: kubectl rollout restart deployment/was
- name: filename change
run: mv ./build/libs/*.war ./build/libs/$(date +%y-%m-%d-%H-%M).war
- name: Cloud Storage Uploader
uses: google-github-actions/upload-cloud-storage@v0.9.0
with:
credentials: ${{ secrets.GKE_STORAGE_KEY }}
path: ./build/libs/
parent: false
destination: war-backup
glob: '*.war'
오늘의 회고
- git action 테스트한다고 action 창이 난리가 났다 ㅋㅋㅋㅋㅋ 웃김 생각보다 쉽지않아서 계속해보면 재미있을것 같기도 하다 !
- 이제 곧 세미프로젝트를 시작하는데 넘 떨린다 ... 잘할수있을까,,!
'Cloud > Cloud 공부일기' 카테고리의 다른 글
Day 67 - CICD (eks) (0) | 2022.04.15 |
---|---|
Day 66 - CICD (eks) (0) | 2022.04.14 |
Day 64 - Cloud network IAM, CICD (0) | 2022.04.12 |
Day 63 - Cloud network (0) | 2022.04.11 |
Day 62.5 - AWS 3tier 구성하기 (0) | 2022.04.11 |