CI/CD 방식으로 테마 개발하기

안녕하세요,
CI/CD 방식으로 테마 배포를 어떻게 접근해야 할지 조언을 구합니다. 클라이언트는 2주마다 새로운 테마 릴리스를 기대하고 있으며, 우리는 자동화된 프로세스로 테마를 배포하고 싶습니다. 현재 discourse docker를 사용하고 있습니다.

각 릴리스마다 수동 설치를 피하고 싶습니다.

참고로, 이것이 버그인지 모르겠지만, 첫 번째 테마 설치 시 브랜치가 저장되지 않는 것 같습니다. (확인해봐야겠습니다)

감사합니다

이미 해당 기능이 있습니다. 테마를 git 저장소에서 설치한 경우, 한 번의 클릭으로 테마를 최신 커밋으로 업데이트할 수 있습니다.

그 점은 알지만, 우리가 원하는 방식은 아닙니다.

discourse admin에 손대지 않고 동적 프로세스를 구축하고 싶습니다. themes 명령어를 사용하는 방안을 고려하고 있습니다: discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub

docker exec -it app rails themes:install -- # theme data

이 명령어가 파일을 읽을 수 있는지 모르겠습니다. 예를 들어, 설치할 테마의 정보를 포함하는 theme.yaml 파일 같은 경우 말이죠.
해당 파일을 공유 폴더에 배포하고, docker 명령어가 그곳에서 파일을 읽어 테마를 설치하거나 업데이트할 수 있을 것입니다.

@markvanlan 님이 최근 진행하신 작업이 도움이 될 수 있을 것 같습니다.

여기 코드의 주석에 사용법이 나와 있습니다:

@david 감사합니다. 하지만 파일 경로를 인수로 전달할 수 있는지는 명확하지 않습니다. 이렇게 하면 동작할까요?

bin/rake themes:install -- theme.yaml 

한번 시도해 볼 수도 있겠네요.

STDIN으로 파이프하는 방식일 것 같습니다. 예를 들어 다음과 같이 사용할 수 있습니다.

cat theme_config.yml | bin/rake themes:install

하지만 직접 테스트해 보지는 않았습니다. 잘 작동하는지 알려주세요 :slight_smile:

제안하신 방식은 잘 작동합니다. 감사합니다! 제 방식은 작동하지 않아요. :smiley:

themes.rake 파일을 수정하여 다음 내용을 추가하는 실험을 조금 해보았어요.

rake themes:install themeFile="theme.yml"

그리고 이것도요:

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 ? "Invalid JSON input. \n#{ARGV.last}" : "Invalid YML: \n#{theme_args}"
        exit 1
      end
    end

  log, counts = ThemesInstallTask.install(theme_args)

  puts log

  puts
  puts "Results:"
  puts " Installed: #{counts[:installed]}"
  puts " Updated:   #{counts[:updated]}"
  puts " Errors:    #{counts[:errors]}"

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

잘 작동합니다. :sweat_smile:

이 파일에 대한 스펙(spec)을 실행하는 방법은 무엇인가요?

다음과 같이 실행할 수 있습니다:

bin/rake themes:install theme.yml

JSON을 전달하도록 지원하도록 추가했지만, 이 코드는 원래 yml 파일을 인수로 받도록 설계되었습니다.

잘못된 JSON이라고 오류가 발생합니다.

Invalid JSON input.
theme.yml

제 theme.yml 파일 내용입니다.

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

이것은 동작해야 합니다! 왜 더 이상 작동하지 않는지 확인해 보겠습니다.

좋아요, 올바른 형식은 bin/rake themes:install < theme.yml입니다. 코드에 이 부분을 더 잘 문서화하겠습니다 :slight_smile:

좋아요! 감사합니다! 조금이나마 도움이 되어 기쁩니다 :sweat_smile: