বিভিন্ন গিট শাখা থেকে মোতায়েন করতে ক্যাপিস্ট্রানো ব্যবহার করে


125

আমি কোনও আরআর অ্যাপ্লিকেশন স্থাপন করতে ক্যাপিস্ট্রানো ব্যবহার করছি। কোডবেস গিট রিপোজিটরিতে রয়েছে এবং ব্রাঞ্চিংটি বিকাশে ব্যাপকভাবে ব্যবহৃত হয়। ক্যাপিস্ট্রানো deploy.rbতার সেটিংসের জন্য ফাইল ব্যবহার করে, এর মধ্যে একটি শাখা হ'ল এটি মোতায়েন করা।

আমার সমস্যাটি হ'ল বলি আমি মাস্টার থেকে একটি নতুন শাখা তৈরি করি । মোতায়েন করা ফাইলটি মাস্টার শাখাকে উল্লেখ করবে । আমি এটি সম্পাদনা করি, যাতে A কে পরিবেশের পরীক্ষার জন্য মোতায়েন করা যায়। আমি বৈশিষ্ট্য কাজ শেষ, এবং একত্রীকরণ শাখা একটি মধ্যে মাস্টার । যেহেতু থেকে ফাইল একটি নবীন, এটা একীভূত এবং এখন পরার মধ্যে মাস্টার শাখা রেফারেন্স একটি । আবার সম্পাদনার সময়।deploy.rbdeploy.rb

এটি অনেকটা আপাতদৃষ্টিতে অপ্রয়োজনীয় ম্যানুয়াল সম্পাদনা - প্যারামিটারটি সর্বদা বর্তমান শাখার নামটির সাথে মিলে যায়। তার উপরে, প্রতিটি এবং প্রতিটি সময় সেটিংস সম্পাদনা করতে ভুলে যাওয়া সহজ।

এই প্রক্রিয়াটি স্বয়ংক্রিয় করার সর্বোত্তম উপায় কী হবে?

সম্পাদনা: দেখা যাচ্ছে যে কেউ ইতিমধ্যে আমার যা প্রয়োজন ঠিক তা করেছে :

আজ সকালে আমি একটি স্টেজিং সার্ভারে গিট সংগ্রহস্থলের একটি শাখা স্থাপন করার উপলক্ষ পেয়েছিলাম তবে কীভাবে ফোগসিট ধারণা ছিল না। ক্যাপিস্ট্রানো উত্স কোডের মাধ্যমে একটি দ্রুত অনুসন্ধানে জানা গেছে যে আমি :branch "branch_name"আমার স্থাপনার স্ক্রিপ্টে সেট ব্যবহার করতে পারি । আমি এটা চেস্টা করেছিলাম এবং এটা কাজও করেছিল. আমি তখন বুঝতে পেরেছিলাম যে আমার সমস্ত শাখায় আমার একই রকম পরিবর্তন করা দরকার। অবশ্যই, আমি একটি অলস সোড এবং আরও ভাল উপায় না থাকলে ভাবছি।

আপনি যদি গিটের সাথে পরিচিত না হন, গিট ব্রাঞ্চ কমান্ডের আউটপুট হ'ল আপনার স্থানীয় মেশিনে এখন যাচাই করা আছে তাকে চিহ্নিত করে একটি নক্ষত্রযুক্ত শাখার একটি তালিকা। উদাহরণ স্বরূপ:

> git branch
* drupal_authentication
fragment_caching
master

সুতরাং, আমি বুঝতে পেরেছি, আমি যদি কেবলমাত্র আউটপুটটি বিশ্লেষণ করে বর্তমান হিসাবে চিহ্নিত শাখার জন্য অনুসন্ধান করি:

set :branch, $1 if `git branch` =~ /\* (\S+)\s/m

এখন আমি আমার স্থানীয় মেশিনে যা কিছু শাখা বর্তমান তা কোনও একক, ভাগ করা, মোতায়েনের স্ক্রিপ্ট থেকে মোতায়েন করতে সক্ষম।


উত্তর:


157

এটি ক্যাপিস্ট্রানো> = 3.1 এর সাথে কাজ করে:

এই লাইনটি এতে যুক্ত করুন config/deploy.rb:

set :branch, ENV['BRANCH'] if ENV['BRANCH']

এবং তারপরে ক্যাপিস্ট্রানো কল করুন:

cap production deploy BRANCH=master

এই সমাধানটি ক্যাপিস্ট্রানো <3.1 এর সাথে কাজ করে:

# call with cap -s env="<env>" branch="<branchname>" deploy

set :branch, fetch(:branch, "master")
set :env, fetch(:env, "production")

4
যদি মাসিস্টেজ এক্সটেনশন ব্যবহার করা হয় তবে সেট করার দরকার নেই env, তবে এটি কেবল আমার জন্য একটি শাখা ব্যবহার করে কাজ করেছে
টম হ্যারিসন

@ লুলালালার বক্তব্য অনুসারে নির্দিষ্ট শাখাটি আনার জন্য আমাকে ছোট হাতের অক্ষর ব্যবহার করতে হবে।
জাহান

@ জানি: ধন্যবাদ, মনে হচ্ছে তারা আরও বদলেছে যে নতুন ক্যাপাসিটানো রিলিজে আমি সেই অনুযায়ী আমার উত্তরটি সম্পাদনা করেছি।
শীতকালীন সমাধানগুলি

@ জানির তুলনায় আমার ঠিক বিপরীত সমস্যা ছিল: আমাকে আপার-কেস-এস করতে হয়েছিল, orelse যুক্তিটি ক্যাপের কাছে না পৌঁছাতে হবে, যখন আনতে (: var_name, 'ডিফল্ট') ব্যবহার করার সময়।
ফ্রেডেরিক স্ট্রাক-শোইনিং

1
বিকল্প '-s' (--set) এর অর্থ 'রেসিপিগুলি লোড হওয়ার পরে একটি পরিবর্তনশীল সেট করুন।' এবং বিকল্প 'এস' (--set-before) এর অর্থ দাঁড়ায় 'রেসিপিগুলি লোড হওয়ার আগে একটি ভেরিয়েবল সেট করুন।'
রামন ক্যালডেইরা

33

ক্যাপিস্ট্রানো ৩.১.০+ ব্যবহার করে এগুলির কোনওটিই আমার পক্ষে আর কাজ করছে না। পরিবর্তে, তাদের মন্তব্য নির্দেশাবলী অনুযায়ী:

   ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

তবে, আপনি ব্যবহার করতে চান না askবা এটি আপনাকে অনুরোধ করবে। পরিবর্তে আপনি ব্যবহার করা উচিত setHEADশীর্ষ সর্বাধিক শাখা; 'এজ' হিসাবে এটি বলা হয়। আপনি কি অন্য কিছু শাখা চান, প্রতিস্থাপন HEAD: আপনার শাখার নাম, যেমন সঙ্গে master, stagingইত্যাদি

উদাহরণ সহ উপসংহারে, ইন /config/deploy/production.rb, আপনি এই লাইনটি অন্তর্ভুক্ত করতে পারেন:

   set :branch, proc { `git rev-parse --abbrev-ref master`.chomp }

... অথবা

   set :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

বিটিডাব্লু, HEADএটি ডিফল্ট সেটিংস, সুতরাং ফাইলটিতে সত্যিই এটি বলার দরকার নেই। একটি ভাল ব্যবহার করা যেতে পারে /config/deploy/edge.rb

ইন /config/deploy/staging.rb, আপনি এই লাইনটি অন্তর্ভুক্ত করতে পারেন:

   set :branch, proc { `git rev-parse --abbrev-ref staging`.chomp }

... অথবা

   set :branch, proc { `git rev-parse --abbrev-ref test`.chomp }

আপনি ধারণা পেতে!

আমি আশা করি এই উদাহরণগুলি ভবিষ্যতে ক্যাপিস্ট্রানো ব্যবহারকারীদের সহায়তা করবে (^_^)


4
git rev-parse --abbrev-ref HEADকোন শাখা হেড চালু আছে তা অনুসন্ধান করতে ব্যবহৃত হয়। চলমান git rev-parse --abbrev-ref stagingউইল (প্রায়) সর্বদা আউটপুট staging। আপনি শুধু ব্যবহার করতে পারেন set :branch, 'staging'
মিনিগড

27

মাল্টিস্টেজ সহ, এটি এখন:

cap production deploy -s branch=my-branch

আগের পোস্ট সিনট্যাক্সটি আমার পরিবেশে কাজ করে না


1
-s branch=foofooরেসিপিগুলি লোড হওয়ার পরে ক্যাপিস্ট্রানো ভেরিয়েবল শাখা সেট করে
অ্যালভিন

26

আমি নিশ্চিত করতে পারি যে নীচে এখনও ক্যাপ 3.11.0 13/10/18 তে পাশাপাশি ক্যাপ 2 তে কাজ করে:

Deploy.rb / steps.rb এ:

set :branch, ENV['BRANCH'] || 'develop'

কমান্ড লাইনে:

cap deploy BRANCH=featurex

এটি আপনাকে একটি ডিফল্ট শাখা দেয় (যা বিভিন্ন পরিবেশের জন্য পৃথক হতে পারে), এবং যখন আপনি চান তখন শাখা পরিবর্তন করার ক্ষমতা দেয়।


15

বিকল্পভাবে আপনি কমান্ড লাইন থেকে এটি কাঠামো তৈরি করতে পারেন যেখানে আপনার ডিফল্ট শাখা এবং পরিবেশ রয়েছে এবং আপনি ক্যাপ কলটিতে প্যারামিটারগুলি সরবরাহ করতে সক্ষম হন যা পরিবেশ এবং শাখাটি ব্যবহার করতে পারে। এটি এমন একটি শাখা হতে পারে যা স্পষ্টভাবে পাস করা হয়েছে বা আপনার কাছে এমন একটি প্যারামিটার থাকতে পারে যা আপনার তালিকার লিঙ্কে বর্ণিত বর্তমান শাখাটিকে নির্দেশ করবে।

#call with cap -S env="<env>" branch="<branchname>" deploy
...

# Prevents error if not parameter passed, assumes that default 'cap deploy' command
# and should deploy the master branch to the production server
set(:env, ‘production’) unless exists?(:env)
set(:branch, ‘master’) unless exists?(:branch)

if !env.nil? && env == "production"
   role :web, "production_ip_address"
else   # add more as needed 
   role :web, "development_ip_address"
end

if !branch.nil? && branch == "current"
   set :branch, $1 if `git branch` =~ /\* (\S+)\s/m
elsif !branch.nil?
   set :branch, branch
else   # add more as needed 
   set :branch, "master"
end
...

কোড উদাহরণ এখান থেকে প্রচুর orrowণ নেওয়া


3
-sনির্দিষ্ট শাখাটি আনার জন্য আমাকে ছোট হাতের ব্যবহার প্রয়োজন
লুলালালা

@ লুলুলার তুলনায় আমার ঠিক বিপরীত সমস্যা ছিল: আমাকে আপার-কেস-এস করতে হবে, ওরেলিহলে এটি পাওয়ার জন্য (: var_name, 'ডিফল্ট') আনার সময় আর্গুমেন্টটি ক্যাপের কাছে যেতে পারত না।
ফ্রেডেরিক স্ট্রাক-শোইনিং

10

যদি আপনি ক্যাপিস্ট্রানো-মাল্টিস্টেজ ব্যবহার করেন তবে আপনাকে কেবল চালানো দরকার

cap -s branch=$MY_BRANCH deploy

অথবা

cap -s branch=$MY_BRANCH production deploy

আপনার আর কোনও সম্পাদনা ছাড়াই deploy.rb


2
এটা হওয়া উচিত branch=, না branch-
জিমোথি

3
OptionParser :: AmbiguousOption: দ্ব্যর্থক বিকল্প: -s
Giorgio

8

এই আদেশটি আর কাজ করবে না:

cap deploy -s branch=your_branch

-sSপতাকাগুলির জন্য সমর্থন ক্যাপিস্ট্রানো ভি 3 + তে সরানো হয়েছিল।
এখানে আপনি এটি সম্পর্কে আরও পড়তে পারেন: লিঙ্কটি
বেশ কয়েকটি উত্তরে উল্লেখ করা হয়েছিল, তবে বর্তমানে এটি সঠিক নয়।

আমার জন্য কি কাজ করে:
মধ্যে deploy.rbফাইল যোগ

set :branch, ENV['BRANCH'] || :master

তারপরে চালান:

BRANCH=your_branch cap deploy

এছাড়াও দয়া করে লক্ষ্য করুন যে, এই কমান্ডটি সফলভাবে চালানোর জন্য আপনাকে মাস্টার শাখায় থাকা দরকার।


3

এই সমাধানটি ক্যাপিস্ট্রানো সমস্ত সংস্করণের সাথে কাজ করা উচিত।

def branch_name(default_branch)
  branch = ENV.fetch('BRANCH', default_branch)

  if branch == '.'
    # current branch
    `git rev-parse --abbrev-ref HEAD`.chomp
  else
    branch
  end
end

set :branch, branch_name('master')

ব্যবহার:

BRANCH=. cap [staging] deploy
# => deploy current branch

BRANCH=master cap [staging] deploy
# => deploy master branch

cap [staging] deploy
# => deploy default branch


1

সাধারণ উত্তর:

আপনার পরিবেশ থেকে পরিবেশে পরিবর্তিত সামগ্রীর সাথে যদি একটি সেটিং ফাইল থাকে, আপনার সেই লাইনটি "টেমপ্লেট" হিসাবে তৈরি করা উচিত (যেমন স্ট্রিং @BRANCH_NAME@বা এর মতো চলক নাম উপস্থাপন করে @ENV_NAME@)।

তারপরে আপনার একটি কনফিগারেশন ফাইল পড়তে সক্ষম (সংস্করণযুক্ত) স্ক্রিপ্ট থাকতে @BRANCH_NAME@হবে এবং আপনার স্থাপনার প্রক্রিয়ার জন্য প্রয়োজনীয় মান দ্বারা পরিবর্তনশীলকে " " প্রতিস্থাপন করতে হবে।


ইস্যু একই ধরনের উপর আরও দেখুন: stackoverflow.com/questions/1429256/... , stackoverflow.com/questions/487753/... , stackoverflow.com/questions/6009/...
VonC

1

ক্যাপিস্ট্রানো 3 ব্যবহারকারীর জন্য:

desc "prompt for branch or tag"
task :git_branch_or_tag do
  on roles(:all) do |host|
    run_locally do
      execute :git, 'tag'
      tag_prompt = "Enter a branch or tag name to deploy"
      ask(:branch_or_tag, tag_prompt)
      tag_branch_target = fetch(:branch_or_tag, 'master')
      set(:branch, tag_branch_target)
    end
  end
end

before 'deploy:updated',  :git_branch_or_tag

1

পদ্ধতি 1: স্থাপনার জন্য পর্যায় নির্দিষ্ট শাখা (যেমন পরীক্ষা, উত্পাদন) সেট করুন Set

রাখুন branch'deploy.rb' এর পরিবর্তে পর্যায় ফাইলের মধ্যে কনফিগারেশন এবং যে মঞ্চ থেকে স্থাপন করা জন্য লক্ষ্য শাখা সেট।

সম্পর্কিত শাখার নাম সহ দুটি স্তরের অ্যাপ্লিকেশানের জন্য testএবং productionকনফিগারেশনটি দেখতে এটির মতো লাগবে,

# app_root/config/deploy/test.rb
...
set :branch, "test"
...

# app_root/config/deploy/production.rb
...
set :branch, "production"
...

এই পদ্ধতিটি পর্যায় নির্দিষ্ট শাখা থেকে মোতায়েন করতে সক্ষম করে। সুতরাং, কেবলমাত্র অতিরিক্ত পদক্ষেপ যা প্রয়োজন হবে তা হ'ল বেস শাখা থেকে সর্বশেষ কোডটি মার্জ করা বা পুনরায় চালু করা।

পদ্ধতি 2: যে কোনও শাখা থেকে সরাসরি মোতায়েন করুন (ট্যাগ ব্যবহার করে)

আরেকটি পন্থা হ'ল ট্যাগ ব্যবহার করে মোতায়েন করা। ট্যাগ ব্যবহার করে স্থাপন করার জন্য, কনফিগারটি সেট করুন branch। নিম্নলিখিত হিসাবে 'deploy.rb' এ,

set :branch, `git describe --tags $(git rev-list --tags --max-count=1)`.chomp

এবং, সম্পর্কিত ট্যাগ প্যাটার্নটি মেলে (যেমন /.*-test$/), শর্তসাপেক্ষে বিভিন্ন পর্যায়ে মোতায়েনের জন্য সিআইকে কনফিগার করুন ।

এখন, যে কোনও শাখা থেকে মোতায়েন করা যায়,

  • প্রথমে যে কোনও শাখা থেকে একটি ট্যাগ তৈরি করুন,

    গিট ট্যাগ -a v0.1.0-test -m "সংস্করণ 0.1.0-পরীক্ষা"

  • এবং, ধাক্কা

    গিট পুশ অরিজিন v0.1.0-test

দ্রষ্টব্য: উপরের পদ্ধতিগুলি ক্যাপিস্ট্রানো 3 এর উপর ভিত্তি করে।


0
git rev-parse --abbrev-ref HEAD

আপনি যে ঠিক বর্তমান শাখাটি ফিরিয়ে আনবেন।

আমি সবসময় এর gpshপরিবর্তে সেট করিgit push -u origin branch_name

$ which gpsh
gpsh: aliased to git push -u origin `git rev-parse --abbrev-ref HEAD`
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.