Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Deploy / Failed to push image to ghcr #561

Closed
jessie129j opened this issue Jul 22, 2023 · 3 comments · Fixed by #562
Closed

Deploy / Failed to push image to ghcr #561

jessie129j opened this issue Jul 22, 2023 · 3 comments · Fixed by #562
Assignees

Comments

@jessie129j
Copy link
Contributor

Error: buildx failed with: ERROR: failed to solve: failed to push ghcr.io/****/**********:latest: unexpected status: 403 Forbidden

@jessie129j jessie129j self-assigned this Jul 22, 2023
jessie129j added a commit that referenced this issue Jul 22, 2023
@jessie129j jessie129j changed the title Deploy / CI - buildx bug Deploy / Failed to push image to ghcr Jul 22, 2023
@jessie129j jessie129j linked a pull request Jul 22, 2023 that will close this issue
jessie129j added a commit that referenced this issue Jul 22, 2023
@jessie129j
Copy link
Contributor Author

요약

서버 배포 과정에서 이슈가 발생했고, 기존 배포 로직을 조금 변경하여 이슈를 해결했습니다. 배포 방법은 이전과 마찬가지로 server 브랜치에 push하시면 됩니다.

배포 시 사용했던 깃허브 토큰이 더이상 필요하지 않습니다. repository secrets와 PAT(personal access token)을 삭제하셔도 됩니다.

기존 서버 배포 방식

깃허브에서 개인 또는 organization은 ghcr(github container registry)라는 저장소를 사용할 수 있습니다.

서버 배포 파이프라인이 실행되면 다음과 같은 단계를 거칩니다.

  1. ghcr에 로그인합니다. 이 때 GHCR_TOKEN_{{username}} 시크릿이 필요합니다.
  2. 서버를 빌드하여 docker 이미지를 생성합니다.
  3. 생성된 이미지를 ghcr에 push합니다.
  4. AWS EC2 인스턴스에 설치된 github actions runner가 ghcr에 로그인합니다.
  5. 이미지를 pull하여 실행시킵니다. 결과적으로 컨테이너가 생성되고 실행됩니다.

이슈

문제가 생긴 부분은 이부분입니다.

  1. 생성된 이미지를 ghcr에 push합니다.

로그는 다음과 같습니다.

# ...
#13 exporting to image
#13 pushing layers 0.4s done
#13 ERROR: failed to push ghcr.io/whaleap/during-budget_server_01:latest: unexpected status: 403 Forbidden
------
 > exporting to image:
------
ERROR: failed to solve: failed to push ghcr.io/whaleap/during-budget_server_01:latest: unexpected status: 403 Forbidden
Error: buildx failed with: ERROR: failed to solve: failed to push ghcr.io/whaleap/during-budget_server_01:latest: unexpected status: 403 Forbidden

시도한 방법

  1. PAT 재발급 + secrets 업데이트

    => 해결x

  2. 파이프라인 수정(https://stackoverflow.com/questions/72248956/github-action-with-docker-makes-error-exporting-to-image-403-forbidden-error

    permissions:
          contents: read
          packages: write

    => 해결x

  3. repository - workflow permissions 설정(https://stackoverflow.com/questions/75897093/error-buildx-failed-with-error-failed-to-solve-failed-to-push-ghcr-io-unex)

    => 해결x

  4. organization - packages - manage action access 설정(https://github.com/actions/runner/issues/1039#issuecomment-1019972535)

    => 해결x

해결한 방법

ghcr 대신 docker hub에 이미지를 push, pull해서 서버를 배포하는 방식으로 변경했습니다.

새로운 서버 배포 파이프라인 단계는 다음과 같습니다. 진하게 표시된 부분이 변경 사항입니다.

  1. docker hub에 로그인합니다. 이 때 DOCKER_PASSWORD 시크릿이 필요하지만 따로 관리하실 필요는 없습니다.
  2. 서버를 빌드하여 docker 이미지를 생성합니다.
  3. 생성된 이미지를 docker hub에 push합니다.
  4. AWS EC2 인스턴스에 설치된 github actions runner가 docker hub에 로그인합니다.
  5. 이미지를 pull하여 실행시킵니다. 결과적으로 컨테이너가 생성되고 실행됩니다.

Docker Hub 🐳

image

  • 듀링 계정으로 도커 허브에 가입하고 시크릿 레포를 생성했습니다.

  • 도커 허브 무료 플랜은 이미지 pull 횟수가 6시간 동안 200번으로 제한되어 있는데, 큰 지장은 없을 것 같습니다.

  • 도커 허브 로그인 시 필요한 access key는 secrets에 등록된 상태로, 따로 관리할 필요는 없습니다. 기존에 사용하시던 repository secrets와 PAT(personal access token)는 삭제하셔도 됩니다.

  • 기존 파이프라인이 5일 전에는 문제 없이 돌아갔었던 터라 정확한 문제 원인을 파악하지 못했다는 아쉬움이 남지만 지금은 이 방법이 최선인 것 같습니다.

@jessie129j
Copy link
Contributor Author

원인 발견 🎉

며칠 전에 organization 이름이 바뀌었는데 배포할 때 ghcr 저장소 이름을 수정하지 않아서 생기는 문제였습니다!...ㅠㅠ!
기존 파이프라인을 보존해뒀으니 일단 도커 허브 사용하고 문제가 생기면 다시 ghcr 사용하면 될 것 같습니다

@jessie129j
Copy link
Contributor Author

jessie129j commented Jul 22, 2023

아니 근데:thinking:

  • 레포 이름이 바뀌었는데 ghcr.io/whaleap에 로그인은 대체 어떻게 성공한 것인가...
  • 레포 이름을 바꾼다고 이전 레포 ghcr 저장소가 바로 삭제되지는 않는 것으로 추측됨

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant