การสร้างและการกำหนดหมายเลขเวอร์ชันสำหรับโครงการ Java (ant, cvs, hudson)


134

แนวทางปฏิบัติที่ดีที่สุดในปัจจุบันสำหรับการจัดการหมายเลขรุ่นและหมายเลขเวอร์ชันอย่างเป็นระบบในโครงการ Java คืออะไร โดยเฉพาะ:

  • วิธีจัดการหมายเลขบิลด์อย่างเป็นระบบในสภาพแวดล้อมการพัฒนาแบบกระจาย

  • วิธีรักษาหมายเลขเวอร์ชันในซอร์ส / พร้อมใช้งานสำหรับแอปพลิเคชันรันไทม์

  • วิธีการรวมเข้ากับที่เก็บซอร์สอย่างถูกต้อง

  • วิธีจัดการหมายเลขเวอร์ชันเทียบกับแท็กที่เก็บโดยอัตโนมัติ

  • วิธีการรวมเข้ากับโครงสร้างพื้นฐานที่สร้างอย่างต่อเนื่อง

มีเครื่องมือจำนวนมากที่พร้อมใช้งานและ ant (ระบบสร้างที่เราใช้) มีงานที่จะรักษาหมายเลขบิลด์ไว้ แต่ยังไม่ชัดเจนว่าจะจัดการสิ่งนี้กับนักพัฒนาหลายคนพร้อมกันโดยใช้ CVS, svn หรือที่คล้ายกันได้อย่างไร .

[แก้ไข]

มีคำตอบบางส่วนหรือเฉพาะเจาะจงที่ดีและเป็นประโยชน์ปรากฏอยู่ด้านล่างดังนั้นฉันจะสรุปคำตอบบางส่วน สำหรับฉันดูเหมือนจะไม่มี "แนวทางปฏิบัติที่ดีที่สุด" ที่ชัดเจนในเรื่องนี้ แต่เป็นการรวบรวมแนวคิดที่ทับซ้อนกัน ด้านล่างนี้ค้นหาบทสรุปของฉันและคำถามที่เป็นผลลัพธ์บางอย่างที่ผู้คนอาจพยายามตอบเพื่อติดตามผล [ใหม่สำหรับ stackoverflow ... โปรดแสดงความคิดเห็นหากฉันทำสิ่งนี้ผิด]

  • หากคุณใช้ SVN การกำหนดเวอร์ชันของการชำระเงินที่เฉพาะเจาะจงจะมาพร้อมกับการโดยสาร การสร้างหมายเลขสามารถใช้ประโยชน์จากสิ่งนี้เพื่อสร้างหมายเลขบิวด์เฉพาะที่ระบุการชำระเงิน / การแก้ไขเฉพาะ [CVS ซึ่งเราใช้ด้วยเหตุผลเดิมไม่ได้ให้ข้อมูลเชิงลึกในระดับนี้มากนัก ... การแทรกแซงด้วยตนเองกับแท็กช่วยให้คุณมีส่วนร่วมได้]

  • หากคุณใช้ maven เป็นระบบบิลด์ของคุณจะมีการสนับสนุนสำหรับการสร้างหมายเลขเวอร์ชันจาก SCM รวมถึงโมดูลรีลีสสำหรับการสร้างรีลีสโดยอัตโนมัติ [เราไม่สามารถใช้ maven ได้ด้วยเหตุผลหลายประการ แต่สิ่งนี้จะช่วยผู้ที่ทำได้ [ขอบคุณmarcelo-morales ]]

  • หากคุณใช้antเป็นระบบบิลด์ของคุณคำอธิบายงานต่อไปนี้สามารถช่วยสร้างไฟล์ Java .properties ที่รวบรวมข้อมูลบิลด์ซึ่งสามารถพับลงในบิลด์ของคุณได้หลายวิธี [เราขยายความคิดนี้เพื่อรวมข้อมูลที่ได้มาจากฮัดสันขอบคุณmarty-lamb ]

  • Ant และ maven (และฮัดสันและระบบควบคุมความเร็วคงที่) ให้วิธีง่ายๆในการรับหมายเลขบิลด์ลงในไฟล์. คุณสมบัติหรือลงในไฟล์. txt / .html สิ่งนี้ "ปลอดภัย" เพียงพอที่จะป้องกันไม่ให้ถูกงัดแงะโดยตั้งใจหรือตั้งใจหรือไม่? การรวบรวมเป็นคลาส "กำหนดเวอร์ชัน" ในเวลาสร้างจะดีกว่าไหม

  • การยืนยัน: การสร้างหมายเลขควรกำหนด / บังคับใช้ในระบบการรวมแบบต่อเนื่องเช่นฮัดสัน [ขอบคุณmarcelo-morales ] เราได้รับข้อเสนอแนะนี้แล้ว แต่มันทำให้คำถามเกี่ยวกับวิศวกรรมการเปิดตัวแตก: การเปิดตัวเกิดขึ้นได้อย่างไร? มีหลายรุ่นในรุ่นหรือไม่? มีความสัมพันธ์ที่มีความหมายระหว่าง buildnumbers จากรีลีสที่แตกต่างกันหรือไม่?

  • คำถาม: อะไรคือวัตถุประสงค์ที่อยู่เบื้องหลังหมายเลขการสร้าง? ใช้สำหรับ QA หรือไม่? อย่างไร? มีการใช้โดยนักพัฒนาเพื่อแยกความคลุมเครือระหว่างหลาย ๆ บิลด์ระหว่างการพัฒนาหรือมากกว่าสำหรับ QA เพื่อพิจารณาว่าบิลด์ผู้ใช้ปลายทางได้รับอะไร หากเป้าหมายคือความสามารถในการทำซ้ำตามทฤษฎีแล้วนี่คือสิ่งที่หมายเลขเวอร์ชันรีลีสควรให้ - ทำไมถึงไม่ทำ (โปรดตอบสิ่งนี้เป็นส่วนหนึ่งของคำตอบของคุณด้านล่างนี้จะช่วยชี้ให้เห็นตัวเลือกที่คุณได้ทำ / แนะนำ ...

  • คำถาม: มีสถานที่สำหรับสร้างตัวเลขในการสร้างด้วยตนเองหรือไม่? นี่เป็นปัญหาที่ทุกคนควรใช้โซลูชัน CI หรือไม่?

  • คำถาม: ควรตรวจสอบหมายเลขบิลด์ใน SCM หรือไม่ หากเป้าหมายนั้นระบุโครงสร้างเฉพาะได้อย่างน่าเชื่อถือและไม่น่าสงสัยวิธีรับมือกับระบบการสร้างแบบต่อเนื่องหรือแบบแมนนวลที่อาจขัดข้อง / รีสตาร์ท / ฯลฯ ...

  • คำถาม: หมายเลขบิลด์ควรสั้นและไพเราะ (เช่นจำนวนเต็มที่เพิ่มขึ้นอย่างจำเจ) เพื่อให้ง่ายต่อการติดชื่อไฟล์สำหรับการจัดเก็บง่ายต่อการอ้างอิงในการสื่อสาร ฯลฯ ... หรือควรจะยาวและเต็มไปด้วยชื่อผู้ใช้ datestamps ชื่อเครื่อง ฯลฯ ?

  • คำถาม: โปรดระบุรายละเอียดเกี่ยวกับวิธีการกำหนดหมายเลขรุ่นที่เหมาะสมกับกระบวนการเผยแพร่อัตโนมัติที่ใหญ่กว่าของคุณ ใช่คนรัก maven เรารู้ว่ามันเสร็จแล้วและเสร็จแล้ว แต่พวกเราทุกคนยังไม่ได้ดื่ม kool-aid กันเลย ...

ฉันต้องการสรุปให้เป็นคำตอบที่สมบูรณ์อย่างน้อยก็สำหรับตัวอย่างที่เป็นรูปธรรมของการตั้งค่า cvs / ant / hudson ของเราดังนั้นใครบางคนสามารถสร้างกลยุทธ์ที่สมบูรณ์ตามคำถามนี้ได้ ฉันจะทำเครื่องหมายเป็น "คำตอบ" ทุกคนที่สามารถให้คำอธิบายแบบซุปต่อถั่วสำหรับกรณีนี้โดยเฉพาะ (รวมถึงรูปแบบการติดแท็ก cvs รายการกำหนดค่า CI ที่เกี่ยวข้องและขั้นตอนการเผยแพร่ที่พับหมายเลขบิลด์ลงในรีลีสเพื่อให้เป็นแบบทางโปรแกรม เข้าถึงได้) หากคุณต้องการถาม / ตอบสำหรับการกำหนดค่าอื่น ๆ (เช่น svn / maven / cruise control) ฉันจะเชื่อมโยงไปยังคำถามจากที่นี่ --JA

[แก้ไข 23 ต.ค. 52] ฉันยอมรับคำตอบที่ได้รับการโหวตสูงสุดเพราะคิดว่าเป็นวิธีแก้ปัญหาที่สมเหตุสมผลในขณะที่คำตอบอื่น ๆ ก็มีข้อคิดดีๆเช่นกัน ถ้ามีใครอยากจะแตกในการสังเคราะห์สิ่งเหล่านี้กับMarty-lambฉันจะพิจารณายอมรับอันอื่น ข้อกังวลเดียวที่ฉันมีกับ Marty-lamb คือมันไม่ได้สร้างหมายเลขบิลด์ที่ต่อเนื่องกันอย่างน่าเชื่อถือ - มันขึ้นอยู่กับนาฬิกาท้องถิ่นที่ระบบของผู้สร้างเพื่อให้หมายเลขการสร้างที่ไม่ชัดเจนซึ่งไม่ดี

[แก้ไข 10 ก.ค. ]

ตอนนี้เรารวมคลาสดังต่อไปนี้ ซึ่งทำให้สามารถรวบรวมหมายเลขเวอร์ชันลงในไฟล์ปฏิบัติการขั้นสุดท้ายได้ รูปแบบต่างๆของข้อมูลเวอร์ชันจะถูกปล่อยออกมาในข้อมูลการบันทึกผลิตภัณฑ์เอาต์พุตที่เก็บถาวรในระยะยาวและใช้เพื่อติดตามการวิเคราะห์ผลิตภัณฑ์เอาต์พุตของเรา (บางครั้งในปีต่อมา) ไปยังบิลด์เฉพาะ

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();
  }
}

แสดงความคิดเห็นหากสิ่งนี้สมควรที่จะกลายเป็นการอภิปรายเกี่ยวกับวิกิ


2
สำหรับผู้อ่านในอนาคตโปรดทราบว่าหมายเลขการแก้ไขในรหัสที่คุณแนะนำเป็นของไฟล์ไม่ใช่การแก้ไขที่เก็บทั่วโลก สำหรับข้อมูลเพิ่มเติมโปรดดู: subversion.apache.org/faq.html#version-value-in-source
maayank

2
ฉันสงสัยว่าใครมีวิธีง่ายๆที่คล้ายกันเมื่อใช้gradleและ / หรือgit?
bnjmn

คำตอบ:


63

สำหรับหลายโปรเจ็กต์ของฉันฉันจับหมายเลขการแก้ไขการโค่นล้มเวลาผู้ใช้ที่รันบิลด์และข้อมูลระบบบางอย่างรวมไว้ในไฟล์. คุณสมบัติที่รวมอยู่ในแอปพลิเคชัน jar และอ่าน jar นั้นในรันไทม์

รหัสมดมีลักษณะดังนี้:

<!-- 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>

เป็นเรื่องง่ายที่จะขยายสิ่งนี้เพื่อรวมข้อมูลที่คุณอาจต้องการเพิ่ม


12
สำหรับเวอร์ชันข้ามแพลตฟอร์มให้ใช้สิ่งนี้แทนคุณสมบัติ whoami ด้านบน: <entry key = "builder" value = "$ {user.name}" />
Ed Brannin

-1 สำหรับการมีโซลูชันที่ขึ้นอยู่กับแพลตฟอร์ม วิธีที่ดีในการมีพร็อพเพอร์ตี้ที่มีมดทั้งหมดลงในไฟล์คือ: `<property name =" antprops.file "location =" $ {build.temp.project.dir} /used_ant.properties "/> <echoproperties destfile =" $ {antprops.file} "/> <! - จัดเรียงไฟล์เฉพาะสำหรับ ant 1.7.0 ขึ้นไปเท่านั้น !!! -> <concat> <union> <sort> <tokens> <file file =" $ {antprops .file} "/> <linetokenizer includedelims =" true "/> </tokens> </sort> </union> </concat>`
raudi

คุณทำอีกครั้งหลังจากทำสิ่งนี้หรือไม่? หรือทำก่อนที่จะทำการแก้ไขจริงของคุณ?
Charles Wood

6
วิธีการทำสิ่งนี้สำหรับที่เก็บ git?
TechCrunch

46

build.xmlของคุณ

...
<property name="version" value="1.0"/>
...
<target name="jar" depends="compile">
    <buildnumber file="build.num"/>
    <manifest file="MANIFEST.MF">
        ...
        <attribute name="Main-Class" value="MyClass"/>
        <attribute name="Implementation-Version" value="${version}.${build.number}"/>
        ...
    </manifest>
</target>
...

รหัส java ของคุณ

String ver = MyClass.class.getPackage().getImplementationVersion();

6
+1 สำหรับการใช้คุณสมบัติที่ Java รองรับอยู่แล้วด้วยวิธีการเช่นนั้น
Ed Brannin

2
-1 สำหรับการมีหมายเลข
บิลด์

6
  • หมายเลขบิวด์ควรเชื่อมโยงกับเซิร์ฟเวอร์การรวมแบบต่อเนื่องเช่นฮัดสัน ใช้งานที่แตกต่างกันสำหรับสาขา / ทีม / การกระจายที่แตกต่างกัน
  • เพื่อให้หมายเลขเวอร์ชันอยู่ในบิลด์สุดท้ายฉันขอแนะนำให้ใช้mavenสำหรับระบบบิลด์ มันจะสร้างไฟล์ .properties เก็บไว้ลงในขวดสุดท้าย / .war / .whatever-AR META-INF/maven/<project group>/<project id>/pom.propertiesบน ไฟล์. คุณสมบัติจะมีคุณสมบัติเวอร์ชัน
  • เนื่องจากฉันกำลังแนะนำ maven ฉันอยากให้คุณตรวจสอบปลั๊กอิน releaseเพื่อเตรียมรีลีสบนที่เก็บซอร์สและให้เวอร์ชันซิงค์

6

ซอฟต์แวร์:

  • SVN
  • มด
  • ฮัดสันสำหรับการผสานรวมอย่างต่อเนื่อง
  • svntask ซึ่งเป็นภารกิจ Ant เพื่อค้นหาการแก้ไข SVN: http://code.google.com/p/svntask/

ฮัดสันมีงานสร้าง / งานสามอย่าง: ต่อเนื่อง, ทุกคืนและปล่อย

สำหรับการสร้างแบบต่อเนื่อง / ต่อคืน: หมายเลขบิลด์คือการแก้ไข SVN ซึ่งพบได้โดยใช้ svntask

สำหรับรุ่น / งานรุ่น: หมายเลขรุ่นคือหมายเลขรุ่นที่อ่านโดย Ant จากไฟล์ Properties ไฟล์คุณสมบัติยังสามารถแจกจ่ายด้วยรีลีสเพื่อแสดงหมายเลขบิลด์ที่รันไทม์

สคริปต์ Ant build ใส่หมายเลขบิลด์ในไฟล์ manifest ของไฟล์ jar / war ที่สร้างขึ้นระหว่างการสร้าง ใช้กับงานสร้างทั้งหมด

การดำเนินการหลังการสร้างสำหรับรุ่นที่วางจำหน่ายทำได้อย่างง่ายดายโดยใช้ปลั๊กอิน Hudson: แท็ก SVN ด้วยหมายเลขบิลด์

สิทธิประโยชน์:

  • สำหรับ jar / war เวอร์ชัน dev ผู้พัฒนาสามารถค้นหาการแก้ไข SVN จาก jar / war และค้นหาโค้ดที่เกี่ยวข้องใน SVN
  • สำหรับรุ่นการแก้ไข SVN คือแท็ก SVN ที่มีหมายเลขรุ่นอยู่

หวังว่านี่จะช่วยได้


คุณมี Release build / job ตรวจสอบไฟล์คุณสมบัติ build / release number กลับไปที่ SVN หรือไม่
Matt b

สำหรับบิลด์ต่อเนื่องหมายเลขบิลด์คือหมายเลขการแก้ไข SVN ดังนั้นไม่มีอะไรให้เช็คอินสำหรับรุ่น builds เป็นไฟล์เช็คอินที่ใช้สำหรับรับหมายเลขบิลด์ โดยปกติวิศวกรรุ่นหรือใครก็ตามต้องการอัปเดตไฟล์นี้ล่วงหน้าก่อนการเผยแพร่
Raleigh

4

ฉันใช้ฮัดสันด้วยแม้ว่าสถานการณ์จะง่ายกว่ามาก:

My Ant script มีเป้าหมายอยู่ในนั้นซึ่งดูเหมือนว่า:

<target name="build-number">
    <property environment="env" />
    <echo append="false" file="${build.dir}/build-number.txt">Build: ${env.BUILD_TAG}, Id: ${env.BUILD_ID}, URL: ${env.HUDSON_URL}</echo>
</target>

ฮัดสันตั้งค่าตัวแปรสภาพแวดล้อมเหล่านี้ให้ฉันทุกครั้งที่งานของฉันทำงาน

ในกรณีของฉันโปรเจ็กต์นี้เป็นเว็บแอพและฉันรวมbuild-number.txtไฟล์นี้ไว้ในโฟลเดอร์รูทของเว็บแอพ - ฉันไม่สนใจว่าใครจะเห็นมัน

เราไม่ติดแท็กการควบคุมซอร์สเมื่อเสร็จสิ้นเนื่องจากเราได้ตั้งค่างานฮัดสันไว้แล้วเพื่อแท็กด้วยหมายเลขบิลด์ / การประทับเวลาเมื่อการสร้างสำเร็จ

โซลูชันของฉันครอบคลุมเฉพาะตัวเลขการสร้างส่วนเพิ่มสำหรับการพัฒนาเท่านั้นเรายังไม่ได้ไปไกลพอในโครงการที่เราครอบคลุมหมายเลขรุ่น


นอกจากนี้ (อย่างน้อยในเจนกินส์เวอร์ชันปัจจุบัน) คุณสามารถตรวจสอบคุณสมบัติ:ʻenv.SVN_URL_1 env.SVN_REVISION_1 env.SVN_URL_2 env.SVN_REVISION_2 เป็นต้น
raudi

3

นอกจากนี้คุณยังอาจต้องการที่จะดูที่ปลั๊กอิน BuildNumber Maven และงาน Ant หนึ่งในขวดพบได้ที่http://code.google.com/p/codebistro/wiki/BuildNumber ฉันพยายามทำให้มันง่ายและตรงไปตรงมา เป็นไฟล์ jar ขนาดเล็กมากซึ่งขึ้นอยู่กับการติดตั้ง Subversion บรรทัดคำสั่งเท่านั้น


3

นี่คือวิธีที่ฉันแก้ไขปัญหานี้:

  • แหล่งที่มาจะถูกคัดลอกไปยังไดเร็กทอรี build
  • จากนั้นจะนำ "versioninfo" ไปใช้งาน
  • รวบรวมแหล่งที่มาที่แก้ไข

นี่คือไฟล์ java ที่จัดเก็บข้อมูลเวอร์ชัน:

public class Settings {

    public static final String VERSION = "$VERSION$";
    public static final String DATE = "$DATE$";

}

และนี่คือ anttask "versioninfo":

    <!-- ================================= 
     target: versioninfo              
     ================================= -->
    <target name="versioninfo"
            depends="init"
            description="gets version info from svn"
    >

        <!-- 
        get svn info from the src folder 
        -->
        <typedef resource="org/tigris/subversion/svnant/svnantlib.xml"
                 classpathref="ant.classpath"
        />
        <svnSetting id="svn.setting"
                    javahl="false"
                    svnkit="true"
                    dateformatter="dd.MM.yyyy"
        />
        <svn refid="svn.setting">
            <info target="src" />
        </svn>

        <!-- 
        if repository is a taged version use "v <tagname>"
        else "rev <revisionnumber> (SVN)" as versionnumber
         -->
        <taskdef resource="net/sf/antcontrib/antcontrib.properties"
                 classpathref="ant.classpath"
        />
        <propertyregex property="version"
                       input="${svn.info.url}"
                       regexp=".*/tags/(.*)/${ant.project.name}/src"
                       select="v \1"
                       defaultvalue="rev ${svn.info.lastRev} (SVN)"
                       override="true"
        />


        <!-- 
        replace date and version in the versionfile ()
         -->
        <replace file="build/${versionfile}">
            <replacefilter token="$DATE$" value="${svn.info.lastDate}" />
            <replacefilter token="$VERSION$" value="${version}" />
        </replace>

    </target>

2

นี่คือ 2 เซ็นต์ของฉัน:

  • บิลด์สคริปต์ของฉันจะสร้างหมายเลขบิลด์ (พร้อมประทับเวลา!) ทุกครั้งที่สร้างแอป สิ่งนี้สร้างตัวเลขมากเกินไป แต่ไม่น้อยเกินไป ถ้าฉันมีการเปลี่ยนแปลงในรหัสหมายเลขรุ่นจะเปลี่ยนอย่างน้อยหนึ่งครั้ง

  • ฉันเวอร์ชันหมายเลขบิวด์กับทุกรุ่น (แม้ว่าจะไม่อยู่ระหว่างกัน) เมื่อฉันอัปเดตโครงการและได้รับหมายเลขรุ่นใหม่ (เนื่องจากมีคนอื่นทำรุ่น) ฉันจะเขียนทับเวอร์ชันในเครื่องของฉันและเริ่มต้นใหม่ สิ่งนี้อาจนำไปสู่การสร้างจำนวนที่ต่ำลงซึ่งเป็นสาเหตุที่ฉันรวมการประทับเวลาไว้ด้วย

  • เมื่อการเปิดตัวเกิดขึ้นหมายเลขบิวด์จะถูกคอมมิตเป็นไอเท็มสุดท้ายในคอมมิตเดียวพร้อมข้อความ "build 1547" หลังจากนั้นเมื่อมีการเปิดตัวอย่างเป็นทางการจะมีการแท็กต้นไม้ทั้งต้น วิธีนี้ไฟล์บิลด์จะมีแท็กทั้งหมดเสมอและมีการแมปแบบ 1: 1 ระหว่างแท็กและหมายเลขบิลด์

[แก้ไข] ฉันปรับใช้ version.html กับโปรเจ็กต์ของฉันจากนั้นฉันสามารถใช้มีดโกนเพื่อรวบรวมแผนที่ที่ถูกต้องว่าติดตั้งที่ไหน หากคุณกำลังใช้ Tomcat หรือคล้ายกันใส่หมายเลขการสร้างและเวลาในdescriptionองค์ประกอบของweb.xml ข้อควรจำ: อย่าจำอะไรเลยเมื่อคุณสามารถมีคอมพิวเตอร์ทำเพื่อคุณได้


ใช่ ... นั่นคือสิ่งที่เรามีเช่นกัน และมันเป็นความเจ็บปวดที่ต้องใช้เมื่อคุณต้องจำว่าบิลด์ไหนใช้งานได้นานเหลือเชื่อที่นี่หรือที่นั่น ตัวเลขที่มากเกินไปก็เป็นปัญหาเช่นกัน ...
Varkhan

@Varkhan: ทำไม? เพียงวางเวอร์ชันไว้ที่ไหนสักแห่งที่มีดโกน HTML สามารถรวบรวมให้คุณได้ ...
Aaron Digulla

1

เรารันบิลด์ของเราผ่าน CruiseControl (แทรกตัวจัดการบิลด์ที่คุณชื่นชอบที่นี่) และดำเนินการสร้างและทดสอบหลัก

จากนั้นเราจะเพิ่มหมายเลขเวอร์ชันโดยใช้ Ant และBuildNumberและสร้างไฟล์คุณสมบัติพร้อมข้อมูลนี้รวมทั้งวันที่สร้างและข้อมูลเมตาอื่น ๆ

เรามีชั้นเรียนเฉพาะสำหรับการอ่านสิ่งนี้และมอบให้กับ GUI / บันทึก ฯลฯ

จากนั้นเราจัดแพคเกจทั้งหมดนี้และสร้างการเชื่อมโยงที่ใช้งานได้เข้าด้วยกันหมายเลขบิลด์และบิลด์ที่เกี่ยวข้อง เซิร์ฟเวอร์ทั้งหมดของเราถ่ายโอนข้อมูลเมตานี้เมื่อเริ่มต้น เราสามารถย้อนกลับไปที่บันทึก CruiseControl และผูกหมายเลขบิลด์กับวันที่และเช็คอิน


เคล็ดลับ: หากคุณใช้ CC และ BuildNumber ของ Ant คุณสามารถใช้ PropertyFileLabelIncrementer เพื่อให้ป้ายกำกับ CC ซิงค์กับหมายเลขบิลด์
Jeffrey Fredrick
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.