# Разработка тем в стиле CI/CD

**URL:** https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714
**Category:** Development
**Created:** [21.Апрель.2020 09:30:03 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714 "2020-04-21T09:30:03Z")
**Posts on this page:** 12
**Page:** 1

<div class="post-metadata">

### Author: ![zcuric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zcuric/32/292837_2.png) [@zcuric](https://meta.discourse.org/u/zcuric)
#### Post date: [21.Апрель.2020 09:30:03 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/1 "2020-04-21T09:30:03Z")

</div>

Привет!  
У вас есть предложения, как подойти к развертыванию тем в рамках CI/CD? Клиент ожидает новые выпуски тем каждые две недели, и мы хотели бы автоматизировать этот процесс. Мы используем Discourse в Docker.

Мы хотим избежать ручной установки при каждом выпуске.

Кстати, не уверен, что это баг, но кажется, что ветка не сохраняется при первой установке темы. (Нужно перепроверить, чтобы подтвердить).

Спасибо.

---

<div class="post-metadata">

### Author: ![fzngagan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/fzngagan/32/259349_2.png) [@fzngagan](https://meta.discourse.org/u/fzngagan)
#### Post date: [21.Апрель.2020 09:52:46 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/2 "2020-04-21T09:52:46Z")

</div>

> [@zcuric](#):
>
> Есть ли у вас предложения, как подойти к развёртыванию тем в стиле CI/CD? Клиент ожидает новые выпуски тем каждые две недели, и мы хотели бы поставлять темы в автоматизированном процессе. Мы используем Discourse Docker.

Это уже реализовано. Если вы установите тему через репозиторий Git, вы сможете обновить её до последней версии одним кликом.

---

<div class="post-metadata">

### Author: ![zcuric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zcuric/32/292837_2.png) [@zcuric](https://meta.discourse.org/u/zcuric)
#### Post date: [21.Апрель.2020 10:09:32 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/3 "2020-04-21T10:09:32Z")

</div>

Я знаю это, но мы не хотим делать это таким способом.

Мы хотим иметь динамический процесс без вмешательства в администрирование Discourse. Я думал использовать команду тем: [discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/master/lib/tasks/themes.rake)

```plaintext
docker exec -it app rails themes:install -- # данные темы

```

Не уверен, может ли эта команда читать файлы. Например, файл theme.yaml, который содержал бы информацию о теме для установки.  
Этот файл можно было бы развернуть в общую папку, и команда docker могла бы читать его оттуда, устанавливая тему или внося обновления.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [21.Апрель.2020 10:19:55 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/4 "2020-04-21T10:19:55Z")

</div>

@markvanlan недавно выполнил работу, которая может быть вам полезна

> <https://github.com/discourse/discourse/commit/f07c4a781c6c054e5d2dc05ab6c0fd0b6cbb0645>

Информация об использовании приведена в комментариях здесь:

> <https://github.com/discourse/discourse/blob/f07c4a781c6c054e5d2dc05ab6c0fd0b6cbb0645/lib/tasks/themes.rake#L5-L26>

---

<div class="post-metadata">

### Author: ![zcuric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zcuric/32/292837_2.png) [@zcuric](https://meta.discourse.org/u/zcuric)
#### Post date: [21.Апрель.2020 10:24:49 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/5 "2020-04-21T10:24:49Z")

</div>

@david спасибо, но мне не совсем понятно, можно ли указать путь к файлу как аргумент. Сработает ли это?

```plaintext
bin/rake themes:install -- theme.yaml

```

Может, стоит попробовать.

---

<div class="post-metadata">

### Author: ![david](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/david/32/157490_2.png) [@david](https://meta.discourse.org/u/david)
#### Post date: [21.Апрель.2020 10:29:46 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/6 "2020-04-21T10:29:46Z")

</div>

Я думаю, вам нужно передать это через STDIN, например:

```plaintext
cat theme_config.yml | bin/rake themes:install

```

Но я не проверял это. Дайте знать, если у вас получится 🙂

---

<div class="post-metadata">

### Author: ![zcuric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zcuric/32/292837_2.png) [@zcuric](https://meta.discourse.org/u/zcuric)
#### Post date: [21.Апрель.2020 11:21:49 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/7 "2020-04-21T11:21:49Z")

</div>

> [@david](#):
>
> Но я это не тестировал. Дайте знать, если у вас это сработает 🙂

Ваш подход работает отлично. Спасибо! У меня не работает. 😃

Я немного поэкспериментировал, изменив `themes.rake`, добавив

```bash
rake themes:install themeFile="theme.yml"

```

И это:

```ruby
task "themes:install" => :environment do |task, args|
  if ENV['themeFile']
    theme_args = YAML.load_file(ENV['themeFile'])
  else
    theme_args = (STDIN.tty?) ? '' : STDIN.read
    use_json = theme_args == ''
    theme_args =
      begin
        use_json ? JSON.parse(ARGV.last.gsub('--', '')) : YAML::load(theme_args)
      rescue
        puts use_json ? "Неверный ввод JSON. \n#{ARGV.last}" : "Неверный YML: \n#{theme_args}"
        exit 1
      end
    end

  log, counts = ThemesInstallTask.install(theme_args)

  puts log

  puts
  puts "Результаты:"
  puts " Установлено: #{counts[:installed]}"
  puts " Обновлено: #{counts[:updated]}"
  puts " Ошибки: #{counts[:errors]}"

  if counts[:errors] > 0
    exit 1
  end
end

```

Работает отлично. 😅

Как запустить тесты для этого файла?

---

<div class="post-metadata">

### Author: ![markvanlan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/markvanlan/32/160087_2.png) [@markvanlan](https://meta.discourse.org/u/markvanlan)
#### Post date: [21.Апрель.2020 12:21:19 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/8 "2020-04-21T12:21:19Z")

</div>

Вы должны быть в состоянии сделать следующее:

`bin/rake themes:install theme.yml`

Я добавил поддержку передачи JSON, но этот код изначально был разработан для принятия файла yml в качестве аргумента.

---

<div class="post-metadata">

### Author: ![zcuric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zcuric/32/292837_2.png) [@zcuric](https://meta.discourse.org/u/zcuric)
#### Post date: [21.Апрель.2020 12:30:55 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/9 "2020-04-21T12:30:55Z")

</div>

Сообщается, что это некорректный JSON

```plaintext
Неверный ввод JSON.
theme.yml

```

Мой theme.yml

```yaml
test:
  url: "https://github.com/discourse/discourse-faria-theme"

```

---

<div class="post-metadata">

### Author: ![markvanlan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/markvanlan/32/160087_2.png) [@markvanlan](https://meta.discourse.org/u/markvanlan)
#### Post date: [21.Апрель.2020 12:59:12 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/10 "2020-04-21T12:59:12Z")

</div>

Я думаю, что это **должно** работать! Я разберусь, почему оно перестало работать.

---

<div class="post-metadata">

### Author: ![markvanlan](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/markvanlan/32/160087_2.png) [@markvanlan](https://meta.discourse.org/u/markvanlan)
#### Post date: [21.Апрель.2020 13:04:49 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/11 "2020-04-21T13:04:49Z")

</div>

Хорошо, правильный формат — `bin/rake themes:install < theme.yml`. Я лучше опишу это в коде 🙂

---

<div class="post-metadata">

### Author: ![zcuric](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/zcuric/32/292837_2.png) [@zcuric](https://meta.discourse.org/u/zcuric)
#### Post date: [21.Апрель.2020 13:14:16 UTC](https://meta.discourse.org/t/theme-development-in-ci-cd-fashion/148714/12 "2020-04-21T13:14:16Z")

</div>

Отлично! Спасибо! Рад, что смог хоть немного помочь 😅
