SORU
27 Mart 2009, Cuma


Java Projeler oluşturma ve Sürüm Numaralandırma (cvs ant, hudson)

Mevcut en iyi uygulamalar Java projelerinde sistematik yapı numaralandırma ve sürüm numarası yönetimi için nelerdir? Özellikle:

  • Nasıl sistematik olarak dağıtılmış geliştirme ortamında numaraları oluşturmak ve yönetmek için

  • Kaynak sürüm numaralarını korumak için nasıl bir çalışma zamanı uygulaması için kullanılabilir/

  • Nasıl düzgün bir kaynak deposu ile entegre

  • Nasıl daha fazla otomatik vs. depo etiketleri sürüm numaralarını yönetmek için

  • Nasıl sürekli inşa altyapı ile entegre

Orada çok sayıda araçları ve karınca (yapı sistemi kullanıyoruz) bir görev olacak korumak bir yapı numarası, ama daha açık nasıl yönetmek bununla eşzamanlı geliştiriciler, CVS, svn ya da benzeri.

[DÜZENLE]

Ve kısmi ya da belirli birkaç iyi yararlı cevaplar bir kaç tanesini özetleyeyim çok aşağıda çıktı. Gerçekten güçlü bir yok gibi geliyor bana "en iyi uygulama" bu, çakışan fikirleri oldukça bir koleksiyon. Aşağıda, benim özetleri ve millet takip soruya cevap vermeyi deneyebilir oluşan bazı sorular bulacaksınız. [Yeni stackoverflow için... lütfen bu yanlış yapıyor olsam yorum sağlar.]

  • Eğer SVN kullanıyorsanız, belirli bir ödeme sürüm binmek için birlikte geliyor. Yapı numaralandırma bu özel ödeme/düzeltme tanımlayan benzersiz bir yapı numarası oluşturmak için yararlanabilir. [Eski nedenlerle kullanmakta olduğumuz CVS, anlayış oldukça bu düzeyde... etiketleri ile elle müdahale " kısmı olur oraya sağlamaz.]

  • Eğer inşa sistemi olarak maven kullanıyorsanız, SCM, sürüm numarası gibi otomatik olarak bültenleri üretmek için onay modülü üretmek için destek var. [Maven, çeşitli nedenlerden dolayı kullanamayız, ama bu olanlar yardımcı olur. [Teşekkürler marcelo-morales]]

  • Eğer inşa sistemi olarak ant kullanıyorsanız, aşağıdaki görev tanımı Java üretmek yardımcı olabilir .özellikleri dosyası içine katlanabilir Bilgileri, Yapı yakalama çeşitli şekillerde inşa. [Bu fikir üzerinde hudson türetilmiş içerecek şekilde bilgi, 6* *teşekkürler] genişlettik.

  • Ant ve maven (hudson ve cruise kontrol) içine numaraları oluşturmak için kolay bir yol sağlar .özellikleri, ya da içine bir dosya .dosya txt/.html . Bu, "kasten veya yanlışlıkla? tahrif önlemek için yeterince güvenli. Daha iyi bir "sınıf inşaat süresi? sürüm içine derlemek için.

  • İddia: numaralandırma tanımlanmalıdır/hudson gibi sürekli entegrasyon sistemi Kurmak yürürlüğe koydu. [8* *sayesinde] bu öneri aldık, ama soru Mühendisliği: serbest açsak Nasıl bir açıklaması olabilir? Bir yayın birden fazla buildnumbers var mı? Farklı sürümlerden buildnumbers arasında anlamlı bir ilişki var mıdır?

  • Yapı bir dizi arkasındaki amaç Ne? soru: QA için kullanılır? Nasıl? Geliştirme veya KALİTE güvencesi için daha fazla son kullanıcı bir var oluştur belirlemek sırasında öncelikle birden çok yapılar arasındaki belirsizliği ortadan kaldırmak için geliştiriciler tarafından kullanılır? Eğer amaç, geçerlilik ise, teorik olarak bu sürümü numarası vermesi gerekenler neden değil mi? (cevapların bir kısmı aşağıdaki gibi,/önerilen yaptığın seçimleri aydınlatmak yardımcı olur bu cevap...) lütfen

  • Soru: manuel yapılarında numaraları oluşturmak için bir yer var mı? Bu HERKES CI bir çözüm elde edilebilir; yani sakıncalı mıdır?

  • Soru: yapı numaraları SCM için iade edilmesi Gerekir? Eğer amaç, güvenilir ve net bir biçimde, belirli bir kriz oluşturmak, tanımlamak veya manuel sürekli yapı sistemleri çeşitli ise o/etc/yeniden çökebilir...

  • Soru: bir yapı numarası olması kısa ve tatlı (yani, tekdüze artan tamsayı) böylece kolay sopa içine dosya adları için arşiv kolay ifade etmek için iletişim, vb... ya da bu olsun uzun ve tam adları, datestamps, makine adları, vb?

  • Soru: yapı numaraları atama büyük otomatik serbest bırakma işlemini nasıl uyduğu hakkında bilgi veriniz. Evet, maven severler, bu tamam ve tamam olduğunu biliyoruz, ama hepimiz sarhoş var kool-aid henüz...

Gerçekten bu işten en az/karınca/hudson Kur bizim cvs somut örnek için tam bir cevap içine et, etmek istiyorum, birisi tam bir strateji bu soru üzerine inşa. Vereceğim işareti olarak "Cevap" olabilir herkes ver bir çorba-fındık açıklaması için bu özel durumda (dahil cvs etiketleme düzeni, alakalı CI yapılandırma öğeleri ve onay prosedürü taşınır yapı numarası haline bırakın böyle işte bu program aracılığıyla erişilebilir.) Eğer başka bir özel yapılandırma (,/cruise control demek svn/maven)/soru sormak isterseniz buradan soru için link vereceğim. --EVET

[DEĞİŞTİR 23 Ekim 09] Diğer yanıtları da birkaç iyi fikirler dahil ederken makul bir çözüm olduğunu düşünüyorum, çünkü üst-oy ben cevabı kabul etti. Eğer biri marty-lamb'nın, başka bir kabul düşünürüm. bu bazı sentez bir çatlak almak istiyorsa Tek endişem ile marty-kuzu olduğunu değil üretmek güvenilir bir seri numarası oluşturun. ... bağlı bir yerel saat üreticisi sistem sağlamak net yapı numaraları yok harika.

[Jul 10 Düzenle]

Biz şimdi böyle bir sınıf altında bulunur. Bu sürüm numaraları son yürütülebilir derlenecek. Sürüm bilgileri farklı biçimlerde günlük veri yayılan, uzun vadeli çıkış ürünleri arşivlenmiş, ve (bazen yıllar sonra) analizi çıkan ürün bizim izlemek için kullanılan bir özel oluşturmak için.

public final class AppVersion
{
   // SVN should fill this out with the latest tag when it's checked out.

   private static final String APP_SVNURL_RAW = 
     "$HeadURL: svn ssh://user@host/svnroot/app/trunk/src/AppVersion.java $";
   private static final String APP_SVN_REVISION_RAW = "$Revision: 325 $";  

   private static final Pattern SVNBRANCH_PAT = 
     Pattern.compile("(branches|trunk|releases)\\/([\\w\\.\\-] )\\/.*");
   private static final String APP_SVNTAIL = 
     APP_SVNURL_RAW.replaceFirst(".*\\/svnroot\\/app\\/", "");

  private static final String APP_BRANCHTAG;
  private static final String APP_BRANCHTAG_NAME;
  private static final String APP_SVNREVISION = 
    APP_SVN_REVISION_RAW.replaceAll("\\$Revision:\\s*","").replaceAll("\\s*\\$", "");


  static {
    Matcher m = SVNBRANCH_PAT.matcher(APP_SVNTAIL);
    if (!m.matches()) {
      APP_BRANCHTAG = "[Broken SVN Info]";
      APP_BRANCHTAG_NAME = "[Broken SVN Info]";
    } else {
      APP_BRANCHTAG = m.group(1);
      if (APP_BRANCHTAG.equals("trunk")) {
        // this isn't necessary in this SO example, but it 
        // is since we don't call it trunk in the real case
        APP_BRANCHTAG_NAME = "trunk";
      } else {
        APP_BRANCHTAG_NAME = m.group(2);
      }
    }
  }

  public static String tagOrBranchName()
  { return APP_BRANCHTAG_NAME; }

  /** Answers a formatter String descriptor for the app version.
   * @return version string */
  public static String longStringVersion()
  { return "app " tagOrBranchName() " (" 
    tagOrBranchName() ", svn revision=" svnRevision() ")"; }

  public static String shortStringVersion()
  { return tagOrBranchName(); }

  public static String svnVersion()
  { return APP_SVNURL_RAW; }

  public static String svnRevision()
  { return APP_SVNREVISION; }

  public static String svnBranchId()
  { return APP_BRANCHTAG   "/"   APP_BRANCHTAG_NAME; } 

  public static final String banner()
  {
    StringBuilder sb = new StringBuilder();
    sb.append("\n----------------------------------------------------------------");
    sb.append("\nApplication -- ");
    sb.append(longStringVersion());
    sb.append("\n----------------------------------------------------------------\n");
    return sb.toString();
  }
}

Eğer bu wiki bir tartışma olmayı hak ediyorsa yorum.

CEVAP
28 Mart 2009, CUMARTESİ


Benim projeler çeşitli için subversion Revizyon numarası, koştu zaman, kullanıcı oluşturmak yakalama, ve bazı sistem bilgilerini de içine şeyler .özellikleri uygulama jar dahil alır, dosya ve çalışma zamanında bu kavanoz oku.

Karınca kodu bu gibi görünüyor:

<!-- software revision number -->
<property name="version" value="1.23"/>

<target name="buildinfo">
    <tstamp>
        <format property="builtat" pattern="MM/dd/yyyy hh:mm aa" timezone="America/New_York"/>
    </tstamp>        
    <exec executable="svnversion" outputproperty="svnversion"/>
    <exec executable="whoami" outputproperty="whoami"/>
    <exec executable="uname" outputproperty="buildsystem"><arg value="-a"/></exec>

    <propertyfile file="path/to/project.properties"
        comment="This file is automatically generated - DO NOT EDIT">        
        <entry key="buildtime" value="${builtat}"/>
        <entry key="build" value="${svnversion}"/>
        <entry key="builder" value="${whoami}"/>
        <entry key="version" value="${version}"/>
        <entry key="system" value="${buildsystem}"/>
    </propertyfile>
</target>

Basit şunu eklemek istiyorum her ne olursa olsun içerecek şekilde genişletmek için.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • HowcastSportsFitness

    HowcastSport

    11 Mayıs 2011
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007