재구축 실패 - app.yml의 "after_assets_precompile" 섹션 건너뛰기

방금 ./launcher rebuild app을 실행했는데 시스템 관련 파일에는 변경 사항이 없었습니다. 현재 discourse의 깜빡이는 점 화면에 멈춰 있습니다.

다음 항목들을 확인해 보았습니다:

  • docker ps에서 discourse 앱 이미지(정상적으로 보입니다).
  • Top 명령어로 활동 확인(정상적으로 보입니다)
  • sidekiq 상태를 볼 수 있음(정상적으로 보입니다)

그래서 앱을 다시 재빌드했습니다.

결과는 동일합니다.

Safe-mode을 사용해 보았습니다. 모든 것이 꺼졌습니다. 변화가 없습니다. 여전히 깜빡이는 점 화면이 표시됩니다.

소스 코드 모든 줄을 검토해 보았습니다. 사용할 수 없는 네 개의 js 파일이 있음을 확인했습니다. 해당 파일은 다음과 같습니다:

수많은 자바스크립트 파일이 누락되어 있습니다. 위에서 언급한 것들은 처음 발견된 파일들입니다.

초기 검토 결과:

  • 해당 파일들은 제 CDN 전송을 통해 사용할 수 없습니다.
  • CDN은 제 S3 버킷에서 가져옵니다.
  • 해당 파일들은 다른 모든 에셋이 저장된 제 S3 버킷에 없습니다.

재빌드 결과를 살펴보니 다음 사항을 확인할 수 있습니다.

  1. 4개 파일이 js 파일 확장자로 public/assets/에 생성되고 기록되었습니다.
  2. 4개 파일이 압축되어 br.js 파일 확장자로 저장되었습니다.

서버를 확인해 보니:

  1. 모든 4개 .js 파일은 제 서버에서 사용할 수 있습니다.
  2. .br.js 파일은 제 서버에서 사용할 수 없습니다.
  3. .br.js 파일은 제 S3 버킷에 없습니다.

재빌드 결과를 다시 살펴보니, 제 재빌드 과정에서 after_assets_precompile 활동이 실행되지 않는 것으로 보입니다. rake s3:upload_assets를 수동으로 실행하면 에셋이 S3로 마이그레이션되고 모든 것이 잘 작동합니다.

다음 항목들을 확인해 보았습니다:

  1. 제 yml 파일이 올바른 형식 검사에 통과합니다.

재빌드 과정에서 after_assets_precompile이 처리되지 않는 이유를 파악하기 위해 무엇을 확인해야 할까요?

참고: 저는 다음 버전을 실행 중입니다: 3.4.0.beta4-dev - 6a50b3d4b4

에셋 업로드를 위한 스탠사를 추가하셨나요?

업로드를 위한 S3 호환 객체 스토리지 제공자 구성

해당 rake 태스크를 거기서 찾아 컨테이너 안에서 실행할 수 있습니다(재빌드 시간을 절약하기 위함). 그리고 yml 파일을 편집한 후에는 재빌드를 수행하세요.

S3가 사이트에서 43일 동안 정상적으로 작동해 왔습니다. rake 명령어는 S3 설치의 일부로 해당 위치에 배치되었습니다.

사이트는 최소 30회 이상 재구축되었습니다. 그 과정에서 추가적인 플러그인과 컴포넌트를 도입했습니다. 이는 .js 파일이 S3 버킷에 추가되고 채워졌음을 의미합니다.

S3 컴포넌트는 훌륭하게 작동해 왔습니다. 파일이 S3로 마이그레이션되지 않은 문제는 이번이 처음입니다.

파일이 이동되지 않은 원인을 파악하기 위해 무엇을 조사할 수 있을까요?

after_assets_precompile이 실행되지 않을 수 있는 원인을 아는 분이 있을까요?

도와주세요!

재빌드 시 app.yml 파일의 다음 섹션이 건너뛰어집니다:

after_assets_precompile:
  - exec:
      cd: $home
      cmd:
        - sudo -E -u discourse bundle exec rake s3:upload_assets
        - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

재빌드 직후에는 다음 명령어를 수동으로 처리할 수 있습니다:

./launcher enter app
rake s3:upload_assets
rake s3:expire_missing_assets

명령어는 실행되어 필요한 파일들이 S3로 처리됩니다.

after_assets_precompile 코드에 echo 명령어를 추가했습니다.

      cmd:
        - echo "Beginning of precompile commands"
        - sudo -E -u discourse bundle exec rake s3:upload_

echo 문은 재빌드 출력에 전혀 표시되지 않습니다.

재빌드 단계는 app.yml 파일에서 이 섹션 앞뒤의 단계를 처리합니다. 모든 플러그인과 사용자 지정 명령어도 처리합니다.

해결을 위해 다음 단계를 수행해 보았습니다:

  1. 모든 플러그기 제거
  2. 모든 구성 요소 비활성화
  3. 모든 discourse 로그 파일 검토. 오류 표시를 찾지 못함.
  4. 기본 시스템 로그 파일 검토. 오류 표시를 찾지 못함.

재빌드 프로세스가 이 섹션을 건너뛰는 이유가 무엇인지 아는 분이 있을까요?

테스트로 after_assets_precompile 명령어를 커스텀 명령어 섹션으로 이동해 보았습니다.

run:
  - exec: echo "Beginning of custom commands"
  ## 첫 번째 가입 시 'From' 이메일 주소를 설정하려면 주석을 해제하고 변경하세요:
  ## 첫 번째 가입 이메일을 받은 후 해당 줄을 다시 주석 처리하세요. 한 번만 실행하면 됩니다.
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  ## 작업 중 웹사이트를 비밀번호로 보호하는 명령어입니다. 프로덕션 환경에서는 제거하세요.
  - exec:
      cd: $home
      cmd:
        - echo "Beginning of precompile commands"
        - sudo -E -u discourse bundle exec rake s3:upload_assets
        - sudo -E -u discourse bundle exec rake s3:expire_missing_assets
  - exec: echo "End of custom commands"

명령어는 문제 없이 정상적으로 작동했습니다. 이는 환경 접근 권한이나 보안 문제를 배제할 수 있음을 의미합니다.

런처 프로세스가 재빌드 과정에서 after_assets_precompile 코드를 건너뛰고 있습니다.

해결 방법을 아시는 분 있으신가요?

정확히는 모르겠는데, 4시간 전에 재빌드했는데 아무 문제없이 잘 됐어요.

yml 파일에 공백이나 들여쓰기 오류가 있을 수 있습니다. 검증기를 찾아서 확인해 보세요: [validate yaml]

이것은 최상위 키가 아니라 hooks 아래에 위치해야 합니다. 예를 들어 다음과 같이 설정해야 합니다:

hooks:
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

첫 번째 게시물에 이미 언급된 내용입니다. app.yml 파일은 올바른 들여쓰기로 유효성 검사를 마쳤습니다.

@supermathie - 정말 훌륭하시네요, 놀라운 눈력입니다. 코드 들여쓰기가 두 공백이 아니라는 것을 단 하나의 스니펫만으로, 더 광범위한 섹션과 비교하여 알아채셨어요. 감사합니다.

두 공백을 추가했고, 그로 인해 문제가 해결되었습니다.

이전에 app.yml 파일을 yml 검사기로 검사한 적이 있습니다. 테스트 도구는 파일의 구조적 무결성은 문제없다고 알려주었지만, 기능적으로 잘못된 부분은 알려주지 못했습니다.

올바른 코드 스니펫은 다음과 같습니다:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-adplugin
          - git clone https://github.com/discourse/discourse-affiliate
          - git clone https://github.com/discourse/discourse-subscriptions
          - git clone https://github.com/discourse/discourse-yearly-review
          - git clone https://github.com/discourse/discourse-whos-online
          - git clone https://github.com/discourse/discourse-data-explorer
  # set internal files for cdn
  after_assets_precompile:
    - exec:
        cd: $home
        cmd:
          - echo "Beginning of precompile commands"
          - sudo -E -u discourse bundle exec rake s3:upload_assets
          - sudo -E -u discourse bundle exec rake s3:expire_missing_assets

app.yml 파일에 대해 문서화하자면, 최상위 키는 다음과 같습니다:

  • templates:
  • params:
  • env:
  • volumes:
  • hooks:
  • run:

나머지 모든 항목은 들여쓰기되어야 합니다.

가장 단순한 오류가 가장 짜증을 유발할 수 있습니다. 두 공백 때문에 제 인생의 여섯 시간이 사라졌습니다.

제 왕국을 두 공백과 바꾸고 싶네요.

저도 항상 이런 일이 일어납니다.

제 또 다른 최애는 잘못된 파일을 편집하거나, 잘못된 컴퓨터에서 올바른 파일을 편집하는 것입니다.