Her ortamda kodumuzun hangi sürümünün bulunduğunu nasıl takip edebiliriz?


14

Ekibim şu anda oldukça basit bir dallanma / dağıtım işlemi kullanıyor:

                ┌────────┐ ┌────┐ ┌──────┐
 Environments:  │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Builds:        │  DEV   │ │ QA │ │ PROD │
                └────────┘ └────┘ └──────┘

                     ▲       ▲       ▲
                     │       │       │

                ┌────────┐ ┌────┐ ┌──────┐
 Branches:      │ master │ │ qa │ │ prod │
                └────────┘ └────┘ └──────┘

Her ortamın kendi dalı ( git'i kullanırız) ve o dalı kullanan kendi yapısı vardır. Bir ortamdan diğerine, örneğin DEV'den KG'ye yükseltmek istediğimizde, masterdalı qayeni bir KG yapısına birleştirir ve başlatırız (daha sonra otomatik olarak KG ortamına dağıtılır).

Her bir çevre için özel bir şubeye ve yapı oluşturmaya gerek bırakmayacak yeni bir sürece geçmeyi düşünüyoruz. Bunun yerine, tek bir sürüm derlemesi daha sonra herhangi bir ortama dağıtılabilecek bir "dağıtım paketi" oluşturur. Tipik bir iş akışının şöyle görüneceğini düşünüyoruz:

                ┌────────┐     ┌────┐     ┌──────┐
 Environments:  │  DEV   │ ──► │ QA │ ──► │ PROD │
                └────────┘     └────┘     └──────┘

                      ▲ 
                       \ 

                        ┌───────────────┐
 Builds:                │ release build │
                        └───────────────┘

                                ▲
                                │

                ┌────────┐ ┌─────────┐
 Branches:      │ master │ │ release │
                └────────┘ └─────────┘

Bir ortamdan diğerine terfi etmek artık kaynak kontrolünde ele alınmayacaktır; bunun yerine, önceden oluşturulmuş ikili dosyaları ("dağıtım paketi") alıp yeni ortama bırakıyoruz.

Bu yeni sistem, herhangi bir yapıyı çeşitli avantajlara sahip herhangi bir ortama dağıtmamıza izin verecektir. Örneğin, DEV ve KG'de PROD hata düzeltmelerini test etmek önemsizdir. Mevcut sistemimiz, kaçınmak istediğimiz bir dalı geri almadan bunu yapmanın kolay bir yolunu sunmuyor.

Bu yeni sistemle ilgili en büyük dezavantaj, artık hangi ortamda hangi kodun bulunduğunu izlemenin otomatik bir yoluna sahip olmamamızdır. PROD'da bir düzeltme yapmamız gerekiyorsa, artık mevcut üretim kod tabanıyla senkronize edilmiş özel bir şubemiz yok. Aynı şey KG için de geçerlidir - devam eden çalışmaları taramadan KG'ye hızlı bir değişiklik yapmak istiyorsak master, artık KG ortamının mevcut durumunu yansıtan bir şubemiz yok.

Her ortamda hangi kodun bulunduğunu nasıl takip edebiliriz?

Düşündüğümüz bazı seçenekler:

  • hangi ortamda hangi taahhüdün bulunduğunu takip etmek için git etiketlerini kullanma
  • derleme tarafından kullanılan git komutunu her dağıtım paketine gömme

Hudson veya Jenkins gibi bir CI sisteminiz var mı? Yaptıklarının etiketlerini git'e geri itebilir mi? (Hudson ve Jenkins için ... - diğerleri hakkında emin olmayan eklentiler olduğunu biliyorum).

@MichaelT Yapılarımız için MSBuild ve dağıtımlarımız için Octopus Deploy kullanıyoruz . Octopus'un git depomuzu özel bir Powershell dağıtım komut dosyasıyla değiştirmesini sağlayabileceğimize eminim.
Nathan Friend

Yanıtlar:


14

Git etiketleri, sürümleri belirtmek için gerçekten kullanmak istediğiniz etiketlerdir. Bunun nedeni, sizin için bir anlam ifade etmeleridir ve durum tarafından dağıtılan durum ile yapı sunucusunun sahip olabileceği bilgiler (yapı numarası gibi) arasındaki bağlantıyı hızlı bir şekilde tanımak için kullanılabilir.

Aradığınız cevap bu olsa da, sorunun sadece yarısını çözer. Diğeri ise "hey, işte .[wje]arsunucuya konuşlandırıldı , hangi yapıdan geldi?" Dev ve qa veya prod üzerinde hiçbir zaman uygulamanın farklı sürümlerine sahip olmayacağınızı biliyoruz. Sağ?

Sorunun bu kısmının çözümü, derleme sunucusunun bilgileri bildirime koymasını sağlamaktır. Önümde olan bir maven ve svn örneğinden geliyor:

<manifestEntries>
    <Specification-Title>${project.name}</Specification-Title>
    <Specification-Version>${project.version}</Specification-Version>
    <Build-Number>${build.number}</Build-Number>
    <Build-Id>${build.id}</Build-Id>
    <Svn-Revison>${svn.revision}</Svn-Revison>
</manifestEntries>

Bu maven-war-plugin arşiv yapılandırmasında. Ancak diğer eklentilerde de bulabilirsiniz. Sonra Hudson'da, maven inşa çağrısının bir kısmı:

-Dbuild.number=${BUILD_NUMBER}
-Dsvn.revision=${SVN_REVISION}
-Dbuild.id=${BUILD_ID}

ki bu daha sonra maven alır tanımlar tanımlar. Ve sonra sadece hangi sürüm olduğunu görmek için sunucuya dağıtılan MANIFEST.MF dosyasına bakmak meselesidir.

Aşağıdakiler dahil olmak üzere benzer bir ortam değişkenleri kümesi sunan bir git eklentisi vardır :

  • GIT_COMMIT - Akımın SHA'sı
  • GIT_BRANCH - Uzak deponun adı (varsayılan olarak başlangıç ​​noktası), ardından kullanılmakta olan dalın adı, ör. "Başlangıç ​​/ ana" veya "başlangıç ​​/ foo"

Bu iki uygulamanın birleşimi, derlemeyi (derleme sayıları ilerlediğinden ve sha sağlama toplamlarından farklı bir anlama sahip olduğundan) ve oluşturulduğu belirli git taahhüdünü kolayca tanımlamanızı sağlar.


3

Tamamen farklı bir yaklaşım versionstamamen düşüncesini reddetmek olacaktır . Yapılandırılabilir davranışı farklı olan yalnızca bir sürümünüz var. Tek fark, ortak bir kod tabanına sahip olmanızdır - üretimde bile devam eden işleri dağıtırsınız : ancak etkinleştirilmemiş.

Fark, yalnızca ürününüzde etkinleştirilen farklı özellik gruplarıyla ilgilidir.

Kaldırma / etkinleştirme özellik geçişleri ile yapılır .

Upside: tüm sürüm süreci basitleştirilmiştir: Her zaman yazılımınızın entegre bir sürümünü sunuyorsunuz. Her özellik her zaman mevcuttur master. Ek dal gerekmez.

Birleştirme özellikleri ile birlikte bir acı yoktur, çünkü: birleştirme işlemine gerek yoktur. Hangi branşta hangi özelliğin olduğu ve belki de diğer branşlardan gelen özelliklere bağlı olduğu veya çatıştığı bir karışıklık yoktur. Her bölüm isteğe bağlı olarak etkinleştirilebilir. Artık geri dönüşe bile gerek yok: sadece bir anahtar çevirme .

Bilmiyorum, bu kod temeli için çalışıyorsa: kod kalitesi ve geliştirici disiplini açısından önkoşullar oldukça yüksek - bir özellik çekirdek bir işlevsellik haline geldiğinde ve bir sürü geçiş yönetmek zorunda "temizleme" ile uğraşmak zorunda daha büyük bir karmaşa önler .

Belki de sizin için çalışır.


Peki ya farklı sunucu durumlarının farklı sunuculara dağıtılmasına ne dersiniz? KG kutusunda çalışan kod, bir hatayı yeniden üretebilmek için üretimde çalışan kod ile aynı mı? Geliştiricilerin geliştirici kutusuna gönderdikleri kod KG'nin çalıştığı kodla aynı mı?

1
Soru farklı sorulmalıdır: Evet ise, özel bir yapılandırmaya sahip "şimdi" tekrarlanabilir hatayı düzeltebilirsiniz. Hayır ise - hata önemli mi? Her zaman çalışmaya zorlarsınız (ve entegre kod).
Thomas Junk

-1

Sürümü manifest dosyasına koymak için maven kullanıyoruz. Ardından, uygulamanın bir web uygulamasıysa sürümü görüntülemesini sağlayın veya web hizmetleri için / sürüm bitiş noktasına sahip olun.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.