मैं डॉकटर कंटेनर के अंदर फास्टलेन का उपयोग करके अपना एंड्रॉइड ऐप बनाने के लिए गिटलैब सीआई का उपयोग करता हूं। मेरे ऐप में दो "स्वाद" हैं, जिन्हें मैं अलग-अलग सीआई नौकरियों में बनाना चाहता हूं। यहाँ .gitlab-ci.yml का प्रासंगिक भाग है:

default:
  image: registry.example.com/group/project:29-android-fastlane-debian
  tags:
    - docker
  before_script:
    - ruby -v # Print out ruby version for debugging
    - bundle install

build_flavor1_debug:
  stage: build
  script:
    - bundle exec fastlane build release:"false" --env flavor1
  artifacts:
    paths:
      - app/build/outputs/bundle/
  rules:
      - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
        when: never
      - when: on_success

build_flavor2_debug:
  stage: build
  script:
    - bundle exec fastlane build release:"false" --env flavor2
  artifacts:
    paths:
      - app/build/outputs/bundle/
  rules:
      - if: '$CI_COMMIT_TAG && $CI_COMMIT_REF_PROTECTED == "true"'
        when: never
      - when: on_success

(इस पाइपलाइन में अन्य नौकरियां गिट टैग के लिए रिलीज बिल्ड और प्ले स्टोर पर अपलोड करती हैं, लेकिन वे इस मुद्दे के लिए प्रासंगिक नहीं हैं।)

यहाँ Fastfile के प्रासंगिक भाग दिए गए हैं:

# All flavors we know about. If one is not specified, run them all
flavors = {
  "flavor1" => "com.example.flavor1.app",
  "flavor2" => "com.example.flavor2.app"
}

# If set to a single flavor, make it the only one in the array
if ENV["FLAVOR_NAME"]
  flavors = flavors.slice(ENV["FLAVOR_NAME"])
end

UI.user_error!("Unknown flavor '#{ENV["FLAVOR_NAME"]}' selected") if flavors.empty?

platform :android do

  desc "Build the application"
  lane :build do |options|
    setup(options)

    flavors.each { |flavor_name, flavor_package|
      build_flavor(
        flavor: flavor_name,
        release: options[:release]
      )
    }
  end

end

--env ध्वज का उपयोग करना .env फ़ाइल को उपयुक्त FLAVOR_NAME चर सेट के साथ लोड करता है ताकि एक समय में केवल एक स्वाद चल सके।

जब मैं क्रमिक रूप से बिल्ड चला रहा था तो यह ठीक काम करता था, लेकिन इसमें बहुत लंबा समय लगता है। मैंने एक साथ 8 नौकरियों को चलाने की अनुमति देने के लिए गिटलैब रनर कॉन्फ़िगरेशन को बदल दिया, और अब मुझे निम्न त्रुटि मिलती है:

The message received from the daemon indicates that the daemon has disappeared.
Build request sent: Build{id=111291aa-90bc-45c3-8fb4-9a271d4663f4, currentDir=/builds/group/project}
Attempting to read last messages from the daemon log...
Daemon pid: 1100
  log file: /root/.gradle/daemon/6.5/daemon-1100.out.log
----- Last  20 lines from daemon log file - daemon-1100.out.log -----

[SNIP] - No useful logs here...

----- End of the daemon log -----
FAILURE: Build failed with an exception.
* What went wrong:
Gradle build daemon disappeared unexpectedly (it may have been killed or may have crashed)

कभी एक फ्लेवर के काम पर ऐसा होता है तो कभी दूसरे पर। अगर मैं असफल नौकरी को मैन्युअल रूप से दोबारा चलाता हूं, तो यह हमेशा सफल होता है।

मेरा मानना ​​​​है कि जो हो रहा है वह यह है कि दो निर्माण कार्य एक ही डॉकर कंटेनर के अंदर चल रहे हैं, प्रत्येक के पास अपना नहीं है। जो कोई भी ग्रैडल का उपयोग करके समाप्त करता है वह पहले ग्रैडल डेमॉन को बंद कर देता है जिससे दूसरा विफल हो जाता है।

मैं इन नौकरियों को समानांतर में चलाने में सक्षम होने के लिए कैसे प्राप्त कर सकता हूं?

3
Moshe Katz 26 नवम्बर 2020, 07:24

1 उत्तर

सबसे बढ़िया उत्तर

क्या आपके पास एक साथ चलने के लिए पर्याप्त संसाधन हैं? विशेष रूप से स्मृति एक समस्या हो सकती है, इसलिए स्मृति दबाव के कारण ओएस अन्य कंटेनरों को मार देगा।

1
Jan Garaj 25 पद 2020, 09:49