2016-09-21 26 views
7

Tôi đang tìm một quy trình tốt để quản lý số phiên bản của dự án của tôi khi nhánh chính của tôi đã bật bảo vệ nhánh GitHub. Trong một thế giới lý tưởng, khi bạn kết hợp với nhánh 'phát hành', máy chủ tích hợp liên tục của bạn sẽ chạy thử nghiệm của nó sau đó tự động tăng số phiên bản của dự án của bạn và cam kết trở lại hệ thống SCM của bạn. Quay lại đầu trangLàm cách nào để tăng số phiên bản trong các nhánh được bảo vệ GitHub?

Tuy nhiên, với bảo vệ chi nhánh, bạn không thể cam kết chi nhánh của mình mà không có yêu cầu kéo, vì vậy bạn có điểm bắt 22 nơi máy chủ CI không thể đẩy chi nhánh được bảo vệ của bạn khi nó cố gắng cập nhật số phiên bản.

tôi có thể nghĩ ra một vài quanh công việc, tất cả trong số đó là phụ tối ưu:

  1. Lắp đặt một hệ thống máy chủ nên CI của bạn sẽ làm cho một PR để cập nhật các phiên bản. Tôi không chắc liệu bạn có thể làm điều đó với GitHub hay không, nhưng ngay cả khi nó kết thúc bằng việc tạo ra hai Yêu cầu Kéo cho mỗi PR thực sự, điều này thật khó xử.
  2. Hủy bỏ Bảo vệ Chi nhánh - bây giờ ai cũng có thể đẩy bất cứ điều gì để các ngành, và bạn phải quản lý phát triển của bạn thông qua một quá trình thủ
  3. Cập nhật phiên bản bằng tay trước khi yêu cầu kéo. đây là một chút tốt hơn so với # 2, nhưng nó mở ra cánh cửa cho các nhà phát triển để làm cho những sai lầm khi lựa chọn số phiên bản mới, hoặc sáp nhập đúng số phiên bản vào chi nhánh sai.

Tôi hy vọng có các tùy chọn khác mà tôi chưa từng nghĩ tới.

Chúng tôi đang sử dụng Javascript và npm, nhưng tôi tin rằng vấn đề là ngôn ngữ bất khả tri, chắc chắn cùng một vấn đề sẽ tồn tại với Java và Maven chẳng hạn.

Trả lời

1

Tôi đã sử dụng git tags để tự động hóa phiên bản bằng cách sử dụng Jenkins. Vì vậy, mỗi khi công việc chạy nó mất tag cuối cùng và tăng nó. Vì các thẻ khác với các cam kết, việc thêm thẻ không xung đột với Branch Protection.

# get last tag 
last=$(git describe --abbrev=0 --tags) 
# increment and tag again 
git tag $(($last + 1)) 
git push origin $(($last + 1)) 

Tập lệnh này là số phiên bản số nguyên đơn giản nhưng bạn có thể theo dõi semver nếu muốn. Điều này là cho một dự án Android vì vậy tôi đã thêm một chức năng gradle mà sẽ đưa ra các thẻ cuối cùng và sử dụng nếu cho số phiên bản trong khi xây dựng.

/* 
* Gets the version name from the latest Git tag 
*/ 
def getVersionName = { -> 
    def stdout = new ByteArrayOutputStream() 
    exec { 
     commandLine 'git', 'describe', '--tags' 
     standardOutput = stdout 
    } 
    return stdout.toString().trim() 
} 

Tôi chắc chắn bạn có thể sử dụng thiết lập tương tự với Javascript.

+0

Nhưng điều này không cam kết id phiên bản trở lại dự án chính xác? – JBCP

+0

Không có thông tin phiên bản nào không có trong dự án. Nó trong 'git tag' mà jenkins đặt mỗi khi nó thấy một bản cập nhật trên nhánh master. Dự án chỉ biết cách lấy thông tin phiên bản từ 'thẻ' cuối cùng. Vì vậy, có không có cam kết trở lại. –

+0

@JBCP vui lòng đánh dấu câu trả lời là đã được chấp nhận nếu nó giúp. –

Các vấn đề liên quan