تطوير الثيم بأسلوب CI/CD

مرحبًا،
هل لديكم اقتراحات حول كيفية تنفيذ نشر السمات (Themes) بطريقة CI/CD؟ يتوقع العميل إصدارات جديدة من السمة كل أسبوعين، ونود تنفيذ نشر السمة عبر عملية مؤتمتة. نحن نستخدم Discourse Docker.

نود تجنب التثبيت اليدوي في كل إصدار.

ملاحظة جانبية: لا أعرف ما إذا كان هذا خطأ، ولكن يبدو أن الفرع لا يتم حفظه عند أول تثبيت للسمة. (سأحتاج إلى التحقق من ذلك للتأكد)

شكرًا لكم

إنه موجود بالفعل. إذا قمت بتثبيت قالب عبر مستودع git، فيمكنك تحديث القالب إلى أحدث إصدار في نقرة واحدة.

أعلم ذلك، لكن هذه ليست الطريقة التي نرغب في اتباعها.

نريد عملية ديناميكية دون الحاجة إلى لمس لوحة إدارة Discourse. كنت أفكر في استخدام أمر الثيمات الموجود في discourse/lib/tasks/themes.rake at main · discourse/discourse · GitHub

docker exec -it app rails themes:install -- # بيانات الثيم

لا أعرف ما إذا كان هذا الأمر قادرًا على قراءة الملفات. على سبيل المثال، ملف 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

مدخلات JSON غير صالحة.
theme.yml

ملف theme.yml الخاص بي

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

أعتقد أن هذا يجب أن يعمل! سأبحث في السبب وراء عدم عمله بعد الآن.

حسنًا، التنسيق الصحيح هو bin/rake themes:install < theme.yml. سأقوم بتوثيق ذلك بشكل أفضل في الكود :slight_smile:

رائع! شكرًا لك! يسعدني أنني استطعت المساعدة قليلًا :sweat_smile: