Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Όχι άλλο version / feature hell ...

Îåêßíçóå áðü ôï ìÝëïò anjelinio. Τελευταία δημοσίευση από το μέλος Dimitris Papadimitriou στις 09-10-2009, 20:27. Υπάρχουν 1 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-10-2009, 13:53 54341

    Όχι άλλο version / feature hell ...

    Πάει καιρός τώρα, που εμπλέκομαι σε ένα "μεγάλο" project, σε μια τράπεζα.

    Για κάποιο λόγο που δεν ελέγχω λοιπόν, αποφασίστηκε να κάνουμε develop παράλληλα 2 ή και 3 ακόμα versions, τα οποία περιέχουν features ( ή παραλλαγές του ίδιου feature ) και γίνονται αυτόνομα deploy στην παραγωγή απο τους admins της τράπεζας.

    Τώρα, αυτό το πράγμα σημαίνει ότι στον ίδιο κώδικα, μπορεί 2 ή 3 άνθρωποι να γράφουν διαφορετικά πράγματα ανάλογα για ποιό version γράφουν. Code branches στον TFS, merge branches όταν κάτι πάει παραγωγή κτλ. κτλ. ... ένας διαχειριστικός εφιάλτης !

    Οπότε μια μέρα σκέφτηκα ότι αυτή η κατάσταση δεν πάει άλλο ... τελικά θα βρεθούμε σε καταστάσεις όπου έχουμε χάσει κώδικα, ή ο λάθος κώδικας επικράτησε και διάφορα τέτοια τραγελαφικά. Άρα, έπρεπε κάτι να γίνει για να κάνουμε όλοι develop σε ένα κοινό codebase, αλλά να τρέχουν τα τάδε ή τα δείνα κωμάτια κώδικα, ανάλογα με το version/feature το οποίο θέλουμε να τρέχει ανα πάσα στιγμή.

    Σκεπτόμενος επι του προβήματος λοιπόν, είδα ότι κατα βάση πρέπει να λύσω 2 προβλήματα:

    • Σε επίπεδο configuration, πρέπει να φιλτράρω xml fragments βάσει ενός current version name
    • Σε επίπεδο κώδικα, πρέπει να τρέχει ένα κομμάτι κώδικα βάσει ενός current version name, ή κάποιες φορές ένα άλλο αν το τρέχον version δεν είναι αυτό που θέλω.

     Έγραψα λοιπον μια μικρή σχετικά κλάσση, η οποία κάνει αυτά ακριβώς τα πράγματα. Διαβάζει μια λίστα απο versions/features απο το app config, και βάσει αυτών φιλτράρω τα configuration αρχεία μας, και μου δίνει και κάποιες μεθόδους στο επίπεδο του κώδικα που τρέχω κάτι αν το τρέχον version είναι το ΧΧΧ, overload που του δίνω και τον κώδικα που τρέχει αν το version ΔΕΝ είναι το ΧΧΧ, και κάνα-δύο ακόμα που μου λένε αν το ΧΧΧ είναι μέσα στα τρέχοντα version/feature names κτλ.

    public class VersionFilter {
    
    
            /// <summary>
            /// Filters an Xml file
            /// </summary>
            /// <param name="inputNode"></param>
            /// <returns></returns>
            public static XmlElement FilterForCurrentVersions(XmlElement inputNode);
    
            /// <summary>
            /// Checks if the givern version string is actually included in the CurrentVersions
            /// </summary>
            /// <param name="versionString"></param>
            /// <returns></returns>
            public static bool IsCurrentVersion(string versionString);
    
            /// <summary>
            /// Runs the runForVersion code if the versionString is included in the active versions, else it runs runIfNotVersion
            /// </summary>
            /// <param name="versionString"></param>
            /// <param name="runForVersion"></param>
            /// <param name="runIfNotVersion"></param>
            public static void RunForVersion(string versionString, Action runForVersion, Action runIfNotVersion);
    
            /// <summary>
            /// Runs the given code, only if the given version string is incluyded in the "active" versions ... 
            /// </summary>
            /// <param name="versionString"></param>
            /// <param name="runForVersion"></param>
            public static void RunForVersion(string versionString, Action runForVersion);
    
        }

     Βέβαια, έπρεπε να γίνουν κάποιες αλλαγές στον κώδικα εκεί που φορτώνω τα config files. Και εκεί που θέλουμε να τρέξουμε το Α ή το Β ανάλογα με το τρέχον version, να χρησιμοποιήσουμε τη RunForVersion. Αλλά δεν ήταν και ιδιέταιρα πολλή δουλειά αυτό. 

    Κι έτσι, μετά απο 1 - 2 μέρες τα cofig αρχεία μας είχαν πάνω στα elements ένα ForVersions attribute, και τα cs αρχεία μας χρησιμοποιούν το VersionFilter.RunForVersion:

     <SiteMap>
       ... 
        <item allow-permissions="ADD_CUSTOMER" Text="Νέα Ομάδα  Πελατών"  NavigateUrl="createJoint.action" ForVersions="Phase3" />
      ...
    </SiteMap>  

      .. και στον κώδικα ...

     VersionFilter.RunForVersion(Constants.VersionNames.DocModificationHistory, 
                    () => { this.chkNewReceipt.Visible = !this.IsNewRecord && !string.IsNullOrEmpty(this.ddlVerificationDocumentType.SelectedValue); },
                     () => this.chkNewReceipt.Attributes["style"] = "visibility: hidden"
                );

    .. ε, και στο app config ένα ακόμα app setting με τα τρέχοντα version names ...

    <add key="CurrentVersions" value="Phase2;Phase3;Groups;Flagging"/>

     ... στην αρχή, άκουσα διάφορα. "Μα τι μας λές τώρα, το μόνο σίγουρο είναι το branching στον TFS" ... "Μα τώρα τέτοια θα κάνουμε ... " κτλ. κτλ.

    Αλλά ήρθε εκείνη η μέρα, όπου έπρεπε να ανοίξει ένα feature. Μέχρι τώρα, θα έπρεπε να μαζεύαμε dlls, aspx, scripts, να τα κάναμε installation bundle, γράψιμο οδηγιών για τους admins που θα κάνουν το deploy, deploy .. και μετά το απαραίτητο code branch merge για να συνεχίσουμε όλοι in-sync.

    Aντ' αυτού όμως, έφυγε ένα email το οποίο έλεγε ... "παρακαλώ βρείτε το app setting 'CurrentVersions' στο web config, και προσθέστε ένα ';Flagging' στο τέλος του value". Περιττό να πώ ότι το deployment όλων των άλλων εταιριών που συμμετέχουν στο project παίρνει μισή μέρα τουλάχιστον. Και πλέον το να υποστηρίξω 2 και 3 και 5 UAT deployments παράλληλα με διαφορετικά features έχει γίνει παιχνίδι.

    Έτσι, μετά απο όλα αυτά, σκέφτηκα ότι αξίζει τον κόπο να μοιραστώ τη σκέψη με τον κόσμο, για να ακούσω και κάποια τρίτη γνώμη :]

    Πολύ καλό μας απόγευμα λοιπόν ! 


    Angel
    O:]
  •  09-10-2009, 20:27 54357 σε απάντηση της 54341

    Απ: Όχι άλλο version / feature hell ...

    Πολύ ενδιαφέρον! Καταρχήν τα θερμά μου συγχαρητήρια αν τα κατάφερες να ξεμπλέξεις από το αρχικό μοντέλο. Ξέρουμε όλοι πόσο δύσκολο είναι να κάνεις τόσο σημαντικές αλλαγές σε έργα που τρέχουν.

    Δεν νομίζω ότι το branching είναι για δουλεύει κανείς πολύ καιρό σε δυο εκδόσεις. Προσωπικά το χρησιμοποιώ για να διορθώσω σημαντικά bugs σε κάποια παλιά έκδοση, την ώρα που το trunk δεν είναι σε φάση για release.

    Μια άλλη εναλλακτική θα ήταν να είναι έτσι χωρισμένα τα modules του συστήματος έτσι ώστε να μπορείς να αναβαθμίζεις τμηματικά πράγματα. Σε κάθε περίπτωση δύσκολη δουλειά.

    Θα ήταν ενδιαφέρον να μας πεις αργότερα πως προχωράει!


    Dimitris Papadimitriou
    Software Development Professional
    dotNETZone.gr News

    Οι απαντήσεις παρέχονται για συγκεκριμένες ερωτήσεις και χωρίς καμιά εγγύηση. Διαβάστε επίσης τους όρους χρήσης.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems