Gần đây tôi đã làm việc trong một dự án tự động hóa quy trình làm việc git. Cụ thể đối với bất kỳ kho lưu trữ git cục bộ nào [có
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"3 trỏ đến một số dự án trên GitHub], chúng tôi muốn viết kịch bản như sau. tạo một nhánh mới từ prod, thực hiện một số cam kết, đẩy chúng và thực hiện yêu cầu kéo
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Điều này nghe có vẻ là một nhiệm vụ đủ đơn giản [và hóa ra là nhờ GitPython], nhưng phải mất khá nhiều bài đăng trên Stack Overflow và thử và sai để kết hợp toàn bộ tập lệnh lại với nhau. Vì vậy, tôi chia sẻ điều này với hy vọng kiếm được cho ai đó ngoài kia một buổi cà phê xứng đáng
Các bước thực tế [điểm có thể bỏ qua. 1/10]Ồ, nhân tiện, chúng tôi đang làm điều này trong Python3 [trong trường hợp GitPython không phải là một món quà đủ rõ ràng], vì vậy hãy đảm bảo rằng nó đã được cài đặt và
pip install GitPython
Đừng quên
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"4 ở đầu kịch bản của bạn [chú thích bên lề. nếu bạn cũng thắc mắc tại sao tên gói [
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"5] đôi khi khác với tên gói nhập khẩu [
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"0], thì đây là một số thông tin chi tiết từ những người tuyệt vời trên internet]
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Lấy repo của bạn với siêu dữ liệu mới nhất từ nguồn gốc
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Tạo một chi nhánh địa phương từ prod mới nhất
new_branch = repo.create_head[your_branch_name, origin.refs.prod] # replace prod with master/ main/ whatever you named your main branch
new_branch.checkout[]
Thực hiện các thay đổi của bạn [ví dụ của chúng tôi ở đây, chúng tôi sẽ tạo một tệp txt]
f = open["/User/some_user/some_dir/demofile.txt", "w"]
f.write["some demofile content"]
f.close[]
Cam kết chúng
repo.index.add[[filename]] # in this case filename would be "/User/some_user/some_dir/demofile.txt"
repo.index.commit["your commit message"].. # more commits here if needed
Đẩy nhánh này về gốc cùng với [các] cam kết mới của bạn
repo.git.push["--set-upstream", origin, repo.head.ref]
Tạo một url dẫn chúng ta đến trang tạo PR [phương pháp này hơi khó nhưng an toàn miễn là GitHub giữ nguyên quy ước này]
"//{}/pull/new/{}".format[link_to_your_github_repo, your_branch_name]
Cũng có nhiều cách khác để tạo yêu cầu kéo, một trong số đó là sử dụng thư viện PyGithub để xác thực bằng mã thông báo GitHub và xuất bản yêu cầu kéo thay mặt cho bất kỳ tài khoản nào mà mã thông báo này thuộc về. Tôi đã không thử nghiệm với tùy chọn này vì nó sẽ giới thiệu nhiều bước hơn là chỉ cần nhấp vào một liên kết
Tài liệu GitPython đầy đủ có tại đây, trong đó phần hướng dẫn chứa nhiều thông tin với các ví dụ như cách tạo repo từ đầu, nhưng tôi thấy hơi khó điều hướng cho trường hợp sử dụng cụ thể này
Một mẹo có thể không rõ ràng ngay lập tức là có thể đạt được nhiều lệnh git với GitPython ở định dạng
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"1 [ví dụ:
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"2 ->
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"3]
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Nếu sau khi dùng thử những thứ này, bạn phát hiện ra bất kỳ vấn đề nào hoặc tìm ra giải pháp tốt hơn, vui lòng để lại nhận xét bên dưới và chúng tôi có thể chỉnh sửa/ loại bỏ vấn đề này cho phù hợp. ]
Như chúng ta đều biết rằng Python là một nền tảng tuyệt vời để tự động hóa các hoạt động cơ sở hạ tầng như Triển khai trên nhiều nền tảng, Hoạt động xử lý theo lịch trình, Quản lý thông báo và cảnh báo, v.v. Tự động hóa hoạt động GIT là rất cần thiết trong tự động hóa cơ sở hạ tầng. Đặc biệt, khi chúng tôi có công việc xuất bản hoặc sửa đổi mã trở lại Kho lưu trữ GIT. Hãy thảo luận về một số Hoạt động GIT hữu ích với Python Scripting
Trong hướng dẫn này, chúng tôi sẽ lấy Python3 làm ví dụ. Nhận xét nếu bạn cần hướng dẫn trong nhiều phiên bản công cụ và nền tảng. Vì vậy, kiến thức cần thiết cho hướng dẫn này là
- Hoạt động Git
- Tập lệnh Python
Hãy tạo một tệp python để giải quyết. Ở đây, tôi đã tạo git-python. py để chạy hoạt động Git. Ngoài ra, GitPython là một trong những thư viện tuyệt vời để tương tác với Git Repositories. Vì vậy, chúng tôi sẽ sử dụng thư viện GitPython cho mục đích hướng dẫn. Chúng tôi có thể nhập thư viện GitPython trong tập lệnh python của mình như được đề cập bên dưới
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"1
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Bằng cách này, chúng tôi đang khởi tạo Thư viện GitPython và từ đó chúng tôi đang nhập Mô-đun Repo
Mục lục
Hoạt động Git cơ bản
Chúng ta sẽ xem các Thao tác Git cơ bản sau đây được xử lý như thế nào trong tập lệnh python
- Khởi tạo Git
- Bản sao Git
- Kiểm tra Git
- Tìm nạp Git
- Thêm Git
- Cam kết Git
- Đẩy Git
- Kéo Git
- Hợp nhất Git
- Đặt lại Git
Hãy xem từng thao tác Git Cơ bản này trong Python GitPython như thế nào
Khởi tạo Git
Để bắt đầu là tạo repo Git trần trong thư mục đã chỉ định
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"2
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Bản sao Git
Sao chép một kho lưu trữ hiện có vào một thư mục mới,
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"3
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Kiểm tra Git
Để thay thế các tệp làm việc hiện tại bằng các tệp từ một nhánh
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"4
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Ngoài ra, nếu bạn đang kiểm tra với một chi nhánh mới
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"5
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Tìm nạp Git
Sau đó, Để lấy những thay đổi mới nhất từ kho lưu trữ từ xa vào kho lưu trữ cục bộ
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"6
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Thêm Git
Để đặt các tệp làm việc hiện tại vào chỉ mục hiện tại
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"7
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Cam kết Git
Để thực hiện các thay đổi được lập chỉ mục cho một nhánh cục bộ trong repo cục bộ
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"8
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Đẩy Git
Để đẩy tất cả các thay đổi đã cam kết trong nhánh từ kho lưu trữ cục bộ sang kho lưu trữ từ xa
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"9
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Kéo Git
Để lấy tất cả các thay đổi từ kho lưu trữ từ xa về kho lưu trữ cục bộ
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"0
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Hợp nhất Git
Để hợp nhất nhánh hiện tại với nhánh chính [hoặc bất kỳ chỉ định nào]
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"20
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Đặt lại Git
Để trỏ nhánh hiện tại tới một số bản sửa đổi hoặc nhánh cụ thể và thay thế tất cả các tệp bằng bản sửa đổi hoặc nhánh đã chỉ định
repo = git.Repo[path_to_your_repo] # ex. "/User/some_user/some_dir"21
origin = repo.remote["origin"] assert origin.exists[]
origin.fetch[]
Sau đó, có nhiều hoạt động Git khác mà chúng tôi đang sử dụng cho các hoạt động hàng ngày và để tự động hóa một số hoạt động Git. Đề cập đến các thao tác Git còn thiếu trong bình luận. Tôi sẽ cố gắng hết sức để thêm nội dung bạn đang tìm kiếm
Sự kết luận
Trong bài viết này, chúng ta đã thảo luận về một số Hoạt động GIT hữu ích với Python Scripting để tự động hóa các Hoạt động DevOps như Tự động hóa CICD, quy trình phát hành, v.v. Tuy nhiên, Python có nhiều khả năng tự động hóa nhiều hoạt động hơn của các nền tảng và công cụ. Vì vậy, trong các bài viết và hướng dẫn sắp tới của chúng tôi, chúng ta sẽ thấy tất cả tự động hóa cơ sở hạ tầng và nền tảng với python. Hãy theo dõi và đăng ký DigitalVarys để biết thêm các bài viết và tài liệu nghiên cứu về DevOps, Agile, DevSecOps và Phát triển ứng dụng
Prabhu Vignesh Kumar Rajagopal
Người thực hành DevSecOps có kinh nghiệm, Tech Blogger, chuyên môn về thiết kế giải pháp trong đám mây công cộng và riêng tư. Cộng tác viên cộng đồng mã nguồn mở