favicon Jay Lee DevLog

728x90
300x250

이전 글까지 진행하고 나서 소스를 업데이트하면,

pod가 업데이트가 되지 않는 모습을 확인할 수 있다.

 

이유는 argocd는 같은 tag인 경우에는 업데이트가 되더라도

배포를 진행하지 않기 때문이다.

 

이를 해결하려면, docker image를 만들때 tag를 달아서 push 해주면 된다.

이를 위한 방법에 대해 알아보자.


1. docker push 하는 yaml 파일에서 수정하는 방법

먼저 제일 간단한 방법이다.

docker image가 push 되는 과정을 내가 만든 기준으로 간단하게 나열하면,

docker-publish.yml -> k8s-deployment.yaml -> argocd-application.yaml 정도로 볼 수 있다.

여기서 docker-publish에서 k8s-deplument.yaml 파일의 내용을 새로 만든 tag 달린 image로 바꿔주면 해결 된다.

 

먼저, docker-publish.yml 파일에서 k8s-deployment.yaml 파일의 내용을 변경하는 부분을 추가하자.

# Deployment YAML의 이미지 태그 변경
    - name: Update image tag in deployment YAML
      run: |
        sed -i "s|image: jungjinlee90/github_jj:.*|image: jungjinlee90/github_jj:${{ env.SHA_SHORT }}|" kubernetes/k8s-deployment.yaml

그냥 sed로 태그 값 바꿔주는 코드다. 

 

# Git 커밋 & 푸시
    - name: Commit and push updated manifest
      run: |
        git config user.name "github-actions[bot]"
        git config user.email "github-actions[bot]@users.noreply.github.com"
        git add kubernetes/k8s-deployment.yaml
        git commit -m "Update image tag to ${{ env.SHA_SHORT }}"
        git push origin main

git에 바뀐 k8s-deployment.yaml를 업로드하는 로직이다.

전체 내용은 이렇다.

이제 업데이트 잘 되는지 확인해보자.

 

위와 같은 에러가 발생했다.

이유는 git update를 위한 repo에 접근할 권한이 없기 때문이다.

 

2. 자동으로 권한 부여 하기

자동으로 권한을 부여하기 위해서는 아래의 과정을 거쳐서 토큰을 등록해줘야 한다.

- 유저네임 클릭 -> Settings -> Developer Settings -> Personal Access token -> Tokens(Classic) -> New Personal Access Token(Classic) -> Repo만 체크, expire date 설정 후 생성

 

 

 

 

 

- 다시 github Settings -> Secrets and Variables -> Actions -> 아래와 같이 위에서 얻은 토큰값 입력 후 적용

 

이후 다시 docker-publish.yml 파일을 수정해줘야 한다.

Git 커밋 & 푸시 부분과 persist-credentails: false를 추가 및 수정해줘야 한다.

steps:
    - name: Checkout Repository
      uses: actions/checkout@v2
      with:
        persist-credentials: false  # token 방식 적용을 위해

# Git 커밋 & 푸시
    - name: Commit and push updated manifest
      env: 
        GH_TOKEN: ${{ secrets.GH_PUSH_TOKEN }}
      run: |
        git config user.name "github-actions[bot]"
        git config user.email "github-actions[bot]@users.noreply.github.com"

        # 기존 origin 제거하고 재설정
        git remote remove origin
        git remote add origin https://x-access-token:${GH_TOKEN}@github.com/jungjin-lee90/pf.git
      
        git add kubernetes/k8s-deployment.yaml
        git commit -m "Update image tag to ${{ env.SHA_SHORT }}"
        git push origin main

이제 다시 해보자.

error 부분은 수정된 모습이다.

 

이제 최종적으로 pod에 반영이 되는지 확인해보자.

kubectl get pods -n default # default는 네임스페이스 이름

 

아니 이게 뭔지..

action을 확인하니 계속 action을 반복 수행하는 모습이 발견됐다.

뭔가 설정이 잘못됐나보다.

일단 수동으로 다 종료하고

원인을 파악해보자..

 

commit을 하면 자동으로 CI/CD를 진행하는데, 밑에서 처럼

deployment를 수정하고 commit을 하는 바람에 무한루프에 빠진거다..

[skip ci] 옵션을 추가하면 git action을 안하게 할 수 있다.

아래처럼 수정하고 다시 실행.

# Git 커밋 & 푸시
    - name: Commit and push updated manifest
      env:
        GH_TOKEN: ${{ secrets.GH_PUSH_TOKEN }}
      run: |
        git config user.name "github-actions[bot]"
        git config user.email "github-actions[bot]@users.noreply.github.com"

        # 기존 origin 제거하고 재설정
        git remote remove origin
        git remote add origin https://x-access-token:${GH_TOKEN}@github.com/jungjin-lee90/pf.git

        git add kubernetes/k8s-deployment.yaml
        git commit -m "Update image tag to ${{ env.SHA_SHORT }} [skip ci]" # 여기서 무한 루프에 빠진다. commit 하면 자동으로 CI/CD 진행하기 때문 [skip ci]로 git action skip
        git push origin main

 

확인해보면,

위와 같이 새로운 pod가 생성이 되고,

새로운 pod가 생성 완료되면서 기존에 my-app pod는 삭제된 모습을 볼 수 있다.

 

지금까지 k8s 클러스터 생성부터 Git Action을 이용한 CI, ArgoCD를 이용한 CD까지 알아봤다.

간단해 보이지만, 수많은 에러가 발생했었고,

정리하면서 하려니 기본적인 부분도 놓치는 것들이 조금 있었다.

 

이번 시리즈를 진행하면서 다시 한번 k8s, CI/CD에 대해 다시 한번 이해하고 복습할 수 있었다.

관련된 전체 코드는 https://github.com/jungjin-lee90/pf 에서 확인 가능하다.

728x90
반응형

+ Recent posts

/ /

Contact

📧 dlwjdwls60@naver.com


블로그에 내용이 있으면 해당 글을 보여주며, 없으면 내용이 복사된 채로 ChatGPT로 연결됩니다.