GitHub Actions에서 "Check SKIP_DB_AND_REDIS bootability" 단계 실패

최근 추가된 “Check SKIP_DB_AND_REDIS bootability” 단계가 내 플러그인 중 하나에서 실패하는 문제가 발생했습니다.

SKIP_DB_AND_REDIS 부팅 실패. Rails 부팅 과정에서 데이터베이스가 접근되지 않도록 확인하십시오.

로컬에서 재현하려면 SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"를 실행하십시오.

위 방법을 시도해 보았지만 로컬에서는 문제를 재현할 수 없었습니다. 테스트가 통과했습니다.

실패한 GitHub Actions 단계의 스택 트레이스를 이용하면 어떤 코드가 원인이었는지 정확히 파악할 수 있을 것 같습니다.

문제가 된 코드

컨트롤러 중 하나에서 ActiveRecord의 속성 목록을 가져오는 상수를 선언했습니다:

REWARD_FIELDS = Reward.attribute_names.excluding("id", "created_at", "updated_at")

이런 식으로 작성하면 안 되는 것 같습니다.

하지만 이 검증을 로컬에서 시뮬레이션할 수 있다면 GitHub Actions를 통해 시행착오를 반복하지 않아도 되므로 훨씬 나았을 것입니다. 따라서 다음 명령을 실행하는 것 외에 다른 방법이 있을 것입니다:

SKIP_DB_AND_REDIS=1 RAILS_DB='nonexistent' bin/rails runner "puts 'booted successfully'"

흥미롭네요, 보고해 주셔서 감사합니다!

상당히 구체적인 사항이라, 저희가 이전에 고려하지 못했을 가능성이 있습니다.

로컬 설치 환경에서 이 줄을 false로 변경해 보실 수 있을까요:

그리고 다시 재현 명령어를 실행해 보시겠어요?

그렇게 하면 문제가 성공적으로 재현된다면, 해당 schema_cache_dump 설정을 제어할 수 있는 ENV를 추가하는 방안을 검토해야 할 것입니다.

그것은 효과가 없었습니다. db/schema_cache.yml 파일을 삭제해도 마찬가지였습니다.

아래 두 가지를 시도해 보실 수 있을까요?

데이터베이스를 설정하기 위해 다른 env를 사용하는 개발 모드:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=‘nonexistent’ bin/rails runner “puts ‘booted successfully’”

플러그인이 로드된 테스트 모드:

LOAD_PLUGINS=1 RAILS_ENV=test SKIP_DB_AND_REDIS=1 RAILS_DB=‘nonexistent’ bin/rails runner “puts ‘booted successfully’”

아니요, 여전히 성공합니다.

플러그인 코드가 로드되는지 확인하기 위해 “puts DiscourseKofi::Engine.to_s”를 사용했고, 이름이 출력되었습니다. 그러나 데이터베이스 연결을 생성하는 클래스를 참조했을 때(“puts DiscourseKofi::Admin::AccountsController.to_s”) 마침내 실패했습니다.

따라서 로컬에서는 GitHub Action에서와 달리 플러그인 코드가 완전히 로드되지 않는 것으로 보입니다.

실패하는 전체 명령어:

LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"

LOAD_PLUGINS=1을 제거하거나 RAILS_DB=nonexistent를 사용하면 실패하지 않았습니다.

수정합니다. LOAD_PLUGINS는 중요하지 않았습니다.

즉, 다음 명령은 실패합니다:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::AccountsController.to_s"
-> 실패

다음은 실패하지 않았습니다:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts 'booted successfully'"
-> 실패하지 않음

데이터베이스에 접근하지 않는 클래스를 참조한 경우에도 실패하지 않았습니다:

SKIP_DB_AND_REDIS=1 DISCOURSE_DEV_DB=nonexistent bin/rails runner "puts DiscourseKofi::Admin::PaymentsController.to_s"
-> 실패하지 않음

알겠습니다. 문제를 로컬에서 재현하기 위한 올바른 명령어는 다음과 같습니다:

CI=true RAILS_ENV=test LOAD_PLUGINS=1 SKIP_DB_AND_REDIS=1 RAILS_DB=nonexistent bin/rails runner "puts 'booted successfully'"

이 모든 환경 변수가 중요합니다. RAILS_ENV=development에서는 동작하지 않았습니다. test 모드에서 CI=trueLOAD_PLUGINS=1이 없으면 모든 플러그인 클래스가 로드된 것으로 보이지 않습니다.