# 최신 빌드가 깨졌습니다

**URL:** https://meta.discourse.org/t/latest-rebuild-broken/134962
**Category:** Self-hosting
**Created:** [12월 3, 2019, 11:06오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962 "2019-12-03T11:06:55Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 3, 2019, 11:06오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/1 "2019-12-03T11:06:56Z")

</div>

오래된 시스템이 있는데, 이전에는 문제가 없었습니다. 항상 완전한 재빌드를 통해 업그레이드를 수행했으며, 내장된 업그레이드 기능을 사용한 적이 없습니다.

최근에 apt-get upgrade를 실행하고 Docker를 19.03.5로 업그레이드한 후 재빌드를 시도했는데, 지금은 깨져 버렸습니다. 시스템은 Ubuntu 16.04.6입니다.

재빌드 스크립트는 다음과 같습니다:

```plaintext
cd /var/discourse || exit
sudo git pull
sudo docker stop maphub_forum
sudo docker rm maphub_forum
sudo ./launcher rebuild maphub_forum

```

전체 로그는 다음과 같습니다:  
[diag.txt](https://meta.discourse.org/uploads/short-url/jYj2dBMPFJBAXRvyvr4bFeZD4dh.txt) (518.9 KB)

---

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 3, 2019, 11:14오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/2 "2019-12-03T11:14:12Z")

</div>

Docker `18.09.9`로 다운그레이드했지만 문제는 동일합니다.

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [12월 3, 2019, 11:49오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/3 "2019-12-03T11:49:00Z")

</div>

@j.jaffeux `Discourse.redis`를 `stable`과 `beta`에 백포트해야 할까요? 여러 플러그인에 하위 호환성을 위한 코드를 추가하는 것보다 그게 더 쉬울 것 같습니다.

---

<div class="post-metadata">

### Author: ![j.jaffeux](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/j.jaffeux/32/60297_2.png) [@j.jaffeux](https://meta.discourse.org/u/j.jaffeux)
#### Post date: [12월 3, 2019, 11:52오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/4 "2019-12-03T11:52:41Z")

</div>

네, 큰 문제가 안 생기길 바랐는데, 아마 그럴 것 같습니다. 다만 커밋이 여러 개입니다.

---

<div class="post-metadata">

### Author: ![j.jaffeux](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/j.jaffeux/32/60297_2.png) [@j.jaffeux](https://meta.discourse.org/u/j.jaffeux)
#### Post date: [12월 3, 2019, 1:30오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/5 "2019-12-03T13:30:08Z")

</div>

베타와 안정판으로 백포트했습니다. 문제가 발생하면 알려주세요.

---

<div class="post-metadata">

### Author: ![hosna](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hosna/32/99969_2.png) [@hosna](https://meta.discourse.org/u/hosna)
#### Post date: [12월 3, 2019, 3:30오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/7 "2019-12-03T15:30:04Z")

</div>

@j.jaffeux 이제 대시보드에서 업데이트를 할 수 없습니다:

```plaintext
/var/www/discourse/plugins/docker_manager/lib/docker_manager/git_repo.rb:23:in `upgrade_version'
/var/www/discourse/plugins/docker_manager/lib/docker_manager/git_repo.rb:27:in `upgrading?'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:42:in `block in repos'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:29:in `map!'
/var/www/discourse/plugins/docker_manager/app/controllers/docker_manager/admin_controller.rb:29:in `repos'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:196:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rendering.rb:30:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:42:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:135:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/callbacks.rb:41:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/rescue.rb:22:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:33:in `block in process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `block in instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications/instrumenter.rb:24:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/notifications.rb:180:in `instrument'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/instrumentation.rb:32:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal/params_wrapper.rb:245:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.1/lib/active_record/railties/controller_runtime.rb:27:in `process_action'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/abstract_controller/base.rb:136:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionview-6.0.1/lib/action_view/rendering.rb:39:in `process'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiling_methods.rb:104:in `block in profile_method'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:191:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_controller/metal.rb:252:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:51:in `dispatch'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:33:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:18:in `block in <class:Constraints>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:48:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:19:in `block in <class:Constraints>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/mapper.rb:48:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:49:in `block in serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/journey/router.rb:32:in `serve'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/routing/route_set.rb:837:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-protection-2.0.7/lib/rack/protection/frame_options.rb:31:in `call'
/var/www/discourse/lib/middleware/omniauth_bypass_middleware.rb:68:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/head.rb:12:in `call'
/var/www/discourse/lib/content_security_policy/middleware.rb:12:in `call'
/var/www/discourse/lib/middleware/anonymous_cache.rb:274:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/cookies.rb:648:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:27:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activesupport-6.0.1/lib/active_support/callbacks.rb:101:in `run_callbacks'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/callbacks.rb:26:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/actionable_exceptions.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/debug_exceptions.rb:32:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/show_exceptions.rb:33:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/logster-2.4.1/lib/logster/middleware/reporter.rb:43:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:38:in `call_app'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/rack/logger.rb:28:in `call'
/var/www/discourse/config/initializers/100-quiet_logger.rb:18:in `call'
/var/www/discourse/config/initializers/100-silence_logger.rb:31:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/remote_ip.rb:81:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/request_id.rb:27:in `call'
/var/www/discourse/lib/middleware/enforce_hostname.rb:17:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/executor.rb:14:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/actionpack-6.0.1/lib/action_dispatch/middleware/host_authorization.rb:77:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.3/lib/mini_profiler/profiler.rb:296:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus/rack/middleware.rb:57:in `call'
/var/www/discourse/lib/middleware/request_tracker.rb:176:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/engine.rb:526:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `public_send'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/railties-6.0.1/lib/rails/railtie.rb:190:in `method_missing'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:605:in `process_client'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:700:in `worker_loop'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:548:in `spawn_missing_workers'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/lib/unicorn/http_server.rb:144:in `start'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/unicorn-5.5.1/bin/unicorn:128:in `<top (required)>'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `load'
/var/www/discourse/vendor/bundle/ruby/2.6.0/bin/unicorn:23:in `<main>'

```

---

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 3, 2019, 5:20오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/9 "2019-12-03T17:20:01Z")

</div>

고맙습니다, 이제 완벽하게 작동합니다!

---

<div class="post-metadata">

### Author: ![hosna](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/hosna/32/99969_2.png) [@hosna](https://meta.discourse.org/u/hosna)
#### Post date: [12월 3, 2019, 8:24오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/10 "2019-12-03T20:24:22Z")

</div>

이 문제가 새로운 업데이트와 관련이 있는 건가요?

---

<div class="post-metadata">

### Author: ![gerhard](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/gerhard/32/119479_2.png) [@gerhard](https://meta.discourse.org/u/gerhard)
#### Post date: [12월 3, 2019, 9:15오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/11 "2019-12-03T21:15:03Z")

</div>

컨테이너를 다시 빌드해야 합니다.

```plaintext
cd /var/discourse
git pull
./launcher rebuild app

```

최신 변경 사항이 Discourse보다 먼저 업데이트되어 `Discourse.redis`를 찾지 못하므로 docker\_manager를 깨뜨린다고 확신합니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12월 3, 2019, 9:23오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/12 "2019-12-03T21:23:49Z")

</div>

> [@gerhard](#):
>
> 최신 변경 사항이 Discourse보다 먼저 업데이트되어 `Discourse.redis`를 찾지 못하므로 docker\_manager가 깨질 것이라고 꽤 확신합니다.

하지만 `git pull; ./launcher rebuild app`을 실행하면 문제가 해결되죠?

저는 [새로운 컨테이너 이미지가 릴리스될 때 업그레이드를 수행하는 클라이언트 목록](https://www.literatecomputing.com/automatic-rebuilds-when-they-are-needed/)을 가지고 있습니다. 보통 (1) 새로운 컨테이너가 필요하고 (2) 새로운 베타 버전이 릴리스된 직후에 해당 업그레이드를 수행합니다.

미래를 신뢰할 수 있게 예측하는 능력이 다소 제한적이라는 점은 알고 있지만, 곧 새로운 베타 버전이 릴리스될 것으로 예상합니까?

---

<div class="post-metadata">

### Author: ![j.jaffeux](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/j.jaffeux/32/60297_2.png) [@j.jaffeux](https://meta.discourse.org/u/j.jaffeux)
#### Post date: [12월 5, 2019, 10:45오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/13 "2019-12-05T10:45:22Z")

</div>

오늘 또는 다음 주 초에 베타 버전을 출시할 예정입니다

---

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 26, 2019, 12:44오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/14 "2019-12-26T00:44:50Z")

</div>

다시 고장이 났습니다. git pull + 재빌드 후 전체 로그:

[discourse.txt](https://meta.discourse.org/uploads/short-url/hk50Azqg3R5Txdjj2R5sH6Bsnam.txt) (24.4 KB)

---

<div class="post-metadata">

### Author: ![Falco](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/falco/32/179432_2.png) [@Falco](https://meta.discourse.org/u/Falco)
#### Post date: [12월 26, 2019, 2:00오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/15 "2019-12-26T02:00:53Z")

</div>

현재 “stable” 분기는 깨져 있습니다.

---

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 26, 2019, 9:29오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/16 "2019-12-26T21:29:45Z")

</div>

간단한 요약: tests-passed로 해결했고, 1일간의 다운타임이 발생했습니다.

상세 내용: 저는 이 소프트웨어가 오늘날 인터넷에서 작성된 가장 높은 품질의 오픈소스 소프트웨어 중 하나라고 생각합니다. 견고한 비즈니스 모델과 훌륭한 팀을 갖추고 있죠. 그런데 왜 업그레이드 메커니즘이 이렇게나 깨져 있는 걸까요?

1. 앱 내 업그레이드 기능으로 인해 너무 많은 다운타임이 발생해, 아예 사용하지 않고 항상 재빌드(rebuild)를 하기로 결정했습니다.
2. 하지만 이 스레드에서 볼 수 있듯이, 최근 2번 중 2번 모두 재빌드도 매우 깨진 앱을 만들어냈습니다. 이는 제가 혼자서는 절대 해결할 수 없었던 상황이었고, 여기 추천받은 대로 "tests-passed"로 돌아가는 것 외에는 다른 방법이 없었습니다.

이렇게 잘 작성된 소프트웨어에서 업그레이드 메커니즘이 왜 이렇게나 깨져 있는 걸까요? 내장된 업그레이드 메커니즘으로 5년 이상 아무 문제 없이 돌아가는 워드프레스 사이트가 많은데, 왜 이런 일이 발생하는 걸까요?

재빌드는 항상 git 브랜치를 기반으로 이루어지고, 릴리스는 git과 전혀 관련이 없다면, Discourse에서 릴리스를 제공하는 의미가 무엇일까요?

제게는 릴리스란 git 태그나 zip 파일이어야 합니다. 왜 현대적인 패키지 매니저에서 할 수 있듯이 2.3.x 버전으로 재빌드를 할 수 없는 걸까요?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12월 26, 2019, 10:35오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/17 "2019-12-26T22:35:08Z")

</div>

결론적으로, `tests-passed`는 discourse.org가 서버에 배포하는 버전으로, `stable`보다 더 철저히 테스트되어 안정적입니다. `tests-passed`를 유지하면 문제가 덜 발생할 것입니다. `stable`을 실행하려면, 프로덕션 환경에서 업그레이드를 실행하기 전에 스테이징 서버를 통해 업그레이드를 테스트하는 등 `tests-passed`를 실행하는 것보다 더 많은 작업이 필요하다는 점을 이해해야 합니다.

---

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 26, 2019, 11:05오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/18 "2019-12-26T23:05:59Z")

</div>

안정적이고 신뢰할 수 있는 것을 원합니다.

> `tests-passed`는 [discourse.org](http://discourse.org/)가 서버에 배포하는 버전으로, `stable`보다 테스트가 더 잘 되어 있고 더 안정적입니다.

이 버전을 계속 사용할 것입니다. 여전히 매우 이상한 점이 두 가지 있습니다:

- 실제로 안정적이라면 왜 `stable`이 아니라 `test-passed`라고 부르는 걸까요? "stable"은 일종의 "legacy"로 이름이 바뀌어야 합니다.
- 릴리스 시스템이 여전히 이해가 되지 않습니다. Git 브랜치에서 빌드하는 것이라면, 릴리스를 하는 목적은 무엇인가요? 예를 들어 2.4.x가 성숙할 때까지 2.3.x를 계속 사용하길 원하는데, Discourse의 모델에서는 이것이 전혀 불가능하다고 생각합니다.

---

<div class="post-metadata">

### Author: ![RGJ](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/rgj/32/523185_2.png) [@RGJ](https://meta.discourse.org/u/RGJ)
#### Post date: [12월 26, 2019, 11:06오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/19 "2019-12-26T23:06:54Z")

</div>

> [@pfaffman](#):
>
> `stable`보다 테스트가 더 잘 되어 있고 더 안정적입니다. `tests-passed`를 유지하면 문제가 적을 것입니다. `stable`을 실행하려는 경우, 프로덕션 환경에서 업그레이드를 실행하기 전에 업그레이드를 테스트하기 위해 스테이징 서버를 실행하는 것처럼 `tests-passed`를 실행하는 것보다 더 많은 작업이 필요하다는 점을 이해해야 합니다.

정중히 말씀드리지만, 저는 이에 동의하지 않습니다. `stable`은 매우 안정적이고, 글자 그대로 '안정적’입니다. Rubygems가 의존성을 업데이트하면서 `tests-passed`와 `stable` _모두_가 깨졌고, 이를 해결하는 것은 [수정 사항](https://github.com/discourse/discourse/commit/b445e0e76a70c0b51a2e8223911f0ec9e09315a7)을 [백포트](https://github.com/discourse/discourse/commit/a6701d8710ea870a59cefdd3edc590261103029e)하는 것뿐이었습니다.

참고로, `gem update` 명령에서 rubygems를 특정 버전으로 고정(pinning)했다면 이를 피할 수 있었습니다. `gem update --system 3.0.6`을 사용했으면 안전했을 것입니다.

`stable`이 `tests-passed`보다 더 오래 깨져 있었다는 사실은 그저 우연이며, 제가 기억하는 바로는 처음 있는 일입니다.

> [@zsero](#):
>
> 예를 들어, 2.4.x가 성숙할 때까지 2.3.x를 유지하고 싶지만, Discourse의 모델로는 이것이 전혀 불가능하다고 생각합니다.

우리는 6년 넘게 수백 개의 Discourse 인스턴스에서 `stable`을 기본값으로 유지해 왔으며, 큰 문제 없이 운영해 왔습니다.

---

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 26, 2019, 11:55오후 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/20 "2019-12-26T23:55:33Z")

</div>

이 스레드만 봐도 stable 버전이 rebuild 후 깨진 상태로 남아 있는 경우가 여러 번 있었으니, 처음 있는 일이 아닙니다. discourse.org의 상용 인스턴스가 test-passed 상태라면, 저는 그쪽에 맞춰 진행할 것입니다.

> 우리는 6년 넘게 수백 개의 Discourse 인스턴스에서 stable을 기본값으로 사용해 왔으며, 심각한 문제 없이 운영해 왔습니다.

stable을 고수하는 것과 2.3.x 버전을 고수하는 것은 매우 다른 개념입니다. 예를 들어 stable은 2.4.x가 충분히 성숙할 때까지 2.3.x에 머무르지 못하게 합니다. 또한 프로덕션 환경의 모든 구성 요소를 고려할 때, 저는 x.x.3 또는 x.x.4가 나올 때까지 업그레이드를 미루는 방식을 선호합니다. 현재로서는 이것이 불가능하다고 생각합니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [12월 27, 2019, 12:59오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/21 "2019-12-27T00:59:21Z")

</div>

> [@RGJ](#):
>
> 우리는 6년 넘게 수백 개의 Discourse 인스턴스에서 stable을 기본값으로 유지하며 이 방식을 사용해 왔고, 심각한 문제는 없었습니다.

그것이 사실이라는 것은 압니다. 하지만 당신은 평균적인 Discourse 관리자가 아니에요. 😉 당신은 저를 여러 번 구해 주셨고, 저는 원칙적으로 당신이 하시는 모든 말을 두 번씩 읽어서 기억할 수 있도록 하려고 하지만, 여전히 대부분의 일반 사용자에게는 tests-passed 버전을 유지하는 것이 가장 안전하다고 생각합니다.

> [@zsero](#):
>
> 예를 들어, 모든 것을 프로덕션 환경에 적용할 때, 저는 x.x.3 또는 x.x.4 버전이 나올 때까지 업그레이드를 하지 않는 것을 선호합니다. 저는 이것이 현재는 불가능하다고 생각합니다.

태그 대신 git 커밋 ID를 사용할 수 있습니다.

---

<div class="post-metadata">

### Author: ![zsero](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zsero/32/64016_2.png) [@zsero](https://meta.discourse.org/u/zsero)
#### Post date: [12월 27, 2019, 1:19오전 UTC](https://meta.discourse.org/t/latest-rebuild-broken/134962/22 "2019-12-27T01:19:47Z")

</div>

> [@pfaffman](#):
>
> tag 대신 git commit id를 사용할 수 있습니다.

하지만 그렇게 하더라도 stable 버전이 깨진 상황에서는 문제를 해결해 주지 못할 텐데요? 두 경우 모두 문제가 되었던 것은 누락된 백포트(backport)였고, 어떤 git commit id에서도 동일하게 누락될 것이라고 생각합니다.

따라서 Discourse에는 Wordpress처럼 zip 파일을 다운로드하거나 yarn/pip/gem 같은 패키지 매니저를 사용하여 설치하는 의미의 "릴리스(release)"라는 것이 존재하지 않습니다. 이는 Discourse가 외부 패키지의 라이브 버전을 항상 사용하여 "재빌드(rebuilt)"되기 때문이며, 정식 릴리스가 이루어지지 않기 때문입니다.

[다음 페이지](https://meta.discourse.org/t/latest-rebuild-broken/134962.md?page=2)
