2017-03-10 15 views
14

Tôi đã viết một đơn giản script bằng Python.Tăng số phiên bản nếu Travis tại github thành công

Bây giờ tôi muốn đi để kiểm tra mã của tôi. Sau khi thành công, số phiên bản sẽ tăng lên.

Đến nay, tập lệnh của tôi chưa có số phiên bản. Tôi có thể lưu trữ nó ở bất cứ nơi nào nó có ý nghĩa đối với quy trình làm việc tự động tăng.

Làm cách nào để thực hiện việc này cho mã Python?

Cập nhật

Nó hoạt động bây giờ:

  1. chạy thử nghiệm
  2. bumpversion
  3. đẩy thẻ để làm chủ

Thật không may travis không hỗ trợ "sau tất cả". Điều này có nghĩa nếu tôi muốn chạy thử nghiệm cho một số phiên bản Python, tôi không có cách nào để bumpversion sau khi các thử nghiệm của tất cả các phiên bản python đã thành công.

Trong trường hợp của tôi, tôi sẽ kiểm tra trên Python2.7 chỉ cho đến khi travis giải quyết vấn đề này: https://github.com/travis-ci/travis-ci/issues/929

Đây là kịch bản đơn giản của tôi: https://github.com/guettli/compare-with-remote

Giải Quyết :-)

Nó hoạt động bây giờ:

  1. Nhà phát triển push to github
  2. Travis-CI chạy
  3. Nếu tất cả các bài kiểm tra là bumpversion thành công tăng phiên bản
  4. Phiên bản mới trong setup.py get của đẩy lên github repo
  5. Một phiên bản mới của gói python được tải lên pypi với công cụ twine.

tôi giải thích cách tôi làm CI với github, travis và pypi đây: https://github.com/guettli/github-travis-bumpversion-pypi

Trả lời

8

Nếu bạn chấp nhận có thêm cam kết cho versioning của bạn, bạn có thể thêm kịch bản này trong continuous_integration/increment_version.py

import os 
import pkg_resources 


if __name__ == "__main__": 
    version = pkg_resources.get_distribution("compare_with_remote").version 
    split_version = version.split('.') 
    try: 
     split_version[-1] = str(int(split_version[-1]) + 1) 
    except ValueError: 
     # do something about the letters in the last field of version 
     pass 
    new_version = '.'.join(split_version) 
    os.system("sed -i \"s/version='[0-9.]\+'/version='{}'/\" setup.py" 
       .format(new_version)) 
    os.system("git add -u") 
    os.system("git commit -m '[ci skip] Increase version to {}'" 
       .format(new_version)) 
    os.system("git push") 

Và thay đổi .travis.yml của bạn đến

after_success: 
    - python continuous_integration/increment_version.py 

Tôi không chắc chắn về cách tạo phần git push làm việc vì nó cần một số thử nghiệm với các quyền repo nhưng tôi giả định rằng bạn có thể có thể thiết lập một cái gì đó để cho phép travis đẩy trong repo của bạn. bạn có thể xem ví dụ post.

Cũng lưu ý rằng tôi đã sử dụng python để thực hiện các git hoạt động nhưng chúng có thể được thêm vào như là dòng thêm trong lĩnh vực after_success:

after_success: 
    - python continuous_integration/increment_version.py 
    - git add -u 
    - git commit -m "[ci skip] version changed" 
    - git push 

Tôi chỉ thấy nó thuận tiện để đưa số phiên bản trong phạm msg.

Ngoài ra, điều quan trọng là thêm [ci skip] vào thông báo cam kết để tránh tăng vô hạn. Có lẽ nó sẽ an toàn hơn để kích hoạt thay đổi phiên bản trên một thẻ thông điệp cam kết cụ thể.

+1

cảm ơn bạn đã gợi ý "tăng vô hạn". Travis có nhìn vào thông điệp cam kết và phát hiện "ci skip" không? – guettli

+1

Có thẻ [skip ci] được phát hiện theo mặc định với Travis. –

+0

https://docs.travis-ci.com/user/customizing-the-build#Skipping-a-build –

5

Không Python-cụ thể, nhưng this tutorial giải thích số phiên bản auto-incrementing bằng cách thêm .travis.yaml mục mà cập nhật git thẻ với mỗi thành công xây dựng. Nó có vẻ như một sự cân bằng tốt giữa hướng dẫn sử dụng và tự động phiên bản.

Trong khi hướng dẫn sử dụng số package.json của npm để kiểm tra phiên bản ban đầu, bạn có thể thực hiện tương đương đơn giản (bằng Python hoặc bằng cách khác).

1

Giả sử rằng,

  • chỉ cam kết với thành công Travis CI builds được sáp nhập vào chi nhánh tổng thể (ví dụsử dụng yêu cầu Pull)
  • gói luôn được cài đặt với pip từ một repo git sử dụng, ví dụ,

    pip install git+https://github.com/user/package.git 
    

Đối với số phiên bản auto-incrementing, một cách đơn giản có thể xác định phiên bản như số các cam kết trong nhánh chính. Điều này có thể được thực hiện với các dòng sau trong setup.py,

minor_version = check_output(['git', 'rev-list', 
           '--count', 'master']).decode('latin-1').strip() 

setup(version='0.{}'.format(minor_version), ...) 
+0

Trong trường hợp của tôi, nhánh chính là để phát triển. Nó có thể chứa lỗi. – guettli

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