favicon Jay Lee DevLog

728x90
300x250

구축까지 다 해놓고 보니 

항상 문제가 생기는 부분은 여러 인원이 비슷한 시간대에 push를 하면 발생하는 문제다.

이럴 경우에 현재 상태로는 무조건 난리가 날거라서

이 부분에 대해 좀 수정했다.

 

name: Docker Image CI/CD

on:
  push:
    branches:
      - main  # main 브랜치에 코드가 푸시될 때 실행

concurrency:  # 동시 push 방지를 위해 이전 워크플로우는 취소하도록 추가.
  group: deploy-${{ github.ref }}
  cancel-in-progress: true

jobs:
  build-and-push:
    runs-on: ubuntu-latest

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

    - name: Log in to Docker Hub
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }} # 위에서 만든 username 값
        password: ${{ secrets.DOCKERHUB_TOKEN }} # 위에서 만든 Token 값

    # tag 달기 추가
    - name: Get short SHA
      id: vars
      run: echo "SHA_SHORT=$(git rev-parse --short HEAD)" >> $GITHUB_ENV # set-output 사용 종료로 인한 변경

    # 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

    # 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"

        # 변경사항 stash
        git stash push -m "temp-changes" || echo "No changes to stash"

        # 최신 상태로 rebase
        git pull --rebase https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git main

        # stash 복원
        git stash pop || echo "Nothing to pop"

        # 변경사항 커밋 및 푸시
        git add kubernetes/k8s-deployment.yaml
        git commit -m "Update image tag to ${{ env.SHA_SHORT }} [skip ci]" || echo "No changes to commit" # 여기서 무한 루프에 빠진다. commit 하면 자동으로 CI/CD 진행하기 때문 [skip ci]로 git action skip
        git push https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git HEAD:main

    - name: Build Docker Image with Version Tag
      run: |
        echo "Building Docker Image with tag: ${{ secrets.DOCKERHUB_USERNAME }}/github_jj:${{ env.SHA_SHORT }}"
        docker build --pull --no-cache -t ${{ secrets.DOCKERHUB_USERNAME }}/github_jj:${{ env.SHA_SHORT }} .

    - name: Push Docker Image to Docker Hub
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/github_jj:${{ env.SHA_SHORT }}

 

동시성을 보장하기 위해서, 새로운 push가 발생하면

기존 workflow는 취소되도록 추가했고,

 

git push 전에 소스를 최신 소스와 맞춰주는 작업도 추가해뒀다.

 

이러고 나서 동시에 2번의 push를 진행하면,

다음과 같이 test1이 종료되고 

test2가 진행되는 모습을 확인할 수 있다.

 

캡쳐는 못했는데, 실제로 보면 앞선 action을 기다리고 있다는 메시지가 뜨기도 한다.

 

728x90
반응형

+ Recent posts

/ /

Contact

📧 dlwjdwls60@naver.com


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