+1

Tích hợp CI/CD trong dự án python đơn giản

1. Giới thiệu

CI là Continuous Integration. Nó là phương pháp phát triển phần mềm yêu cầu các thành viên của team tích hợp công việc của họ thường xuyên, mỗi ngày ít nhất một lần. Mỗi tích hợp được “build” tự động (bao gồm cả test) nhằm phát hiện lỗi nhanh nhất có thể. Cả team nhận thấy rằng cách tiếp cận này giảm thiểu vấn đề tích hợp và cho phép phát triển phần mềm nhanh hơn.

Một kịch bản CI bắt đầu bằng việc developer commit code lên repository (github chẳng hạn). Bất kỳ thay đổi nào cũng sẽ trigger một vòng đời CI. Các bước trong một kịch bản CI thường như sau:

  • Đầu tiên, developer commit code lên repo.
  • CI server giám sát repo và kiểm tra xem liệu có thay đổi nào trên repo hay không (liên tục, chẳng hạn mỗi phút 1 lần)
  • Ngay khi commit xảy ra, CI server phát hiện repo có thay đổi, nên nó nhận code mới nhất từ repo và sau đó build, chạy unit và integration test
  • CI server sẽ sinh ra các feedback và gửi đến các member của project
  • CI server tiếp tục chờ thay đổi ở repo

Sử dụng CI, bạn sẽ tiết kiệm thời gian:

  • Tốc độ hơn trong việc code và fixbug
  • Tự tin rằng bạn xây dựng phần mềm ổn định với ít lỗi hơn
  • Đảm bảo sản phẩm hoạt động được trên các máy khác nhau
  • Loại bỏ rất nhiều chi phí và cho phép bạn tập trung vào những gì quan trọng
  • Giảm thời gian giải quyết xung đột

2. Demo

Khởi tạo project có môi trường ảo

Clone project từ tài khoản github + cài đặt môi trường ảo, ở đây mình có 1 repository CalculatorLibrary

$ git clone git@github.com:ChiThanh93/CalculatorLibrary.git
$ cd CalculatorLibrary
$ virtualenv -p /usr/bin/python3.6 .env
Running virtualenv with interpreter /usr/bin/python3.6
Using base prefix '/usr'
New python executable in /home/nguyen.chi.thanh/workspace/CalculatorLibrary/.env/bin/python3.6
Also creating executable in /home/nguyen.chi.thanh/workspace/CalculatorLibrary/.env/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

ở máy của bạn phải được cài đặt python và virtualenv , phiên bản python phụ thuộc vào bạn lựa chon , ở đây mình chọn python 3.6

Viết một ví dụ python cơ bản: ở đây mình có file calculator.py

"""
Calculator library containing basic math operations.
"""

def add(first_term, second_term):
    return first_term + second_term

def subtract(first_term, second_term):
    return first_term - second_term

Từ mục CalulatorLibrary sẽ có follow sau:

CalculatorLibrary/
|
├── .git
├── .gitignore
├── README.md
└── calculator.py

Viết Test:

Bước đầu tiên liên quan đến việc chạy một chương trình, để phân tích mã cho các lỗi tiềm ẩn. flake8 thường được sử dụng để kiểm tra xem mã của bạn có phù hợp với kiểu mã hóa Python chuẩn hay không. Đảm bảo mã của bạn dễ đọc cho phần còn lại của cộng đồng Python.

Bước thứ hai là unit testing. Một bài kiểm tra đơn vị được thiết kế để kiểm tra một chức năng hoặc đơn vị mã. Python đi kèm với một thư viện thử nghiệm đơn vị tiêu chuẩn, nhưng các thư viện khác tồn tại và rất phổ biến. Ví dụ này sử dụng pytest.

Một thực hành tiêu chuẩn đi đôi với thử nghiệm là tính toán phạm vi code (covered). Độ bao phủ của code là tỷ lệ phần trăm của code được bao phủ bởi các bài kiểm tra của bạn. pytest có một phần mở rộng, pytest-cov, giúp bạn hiểu phạm vi bảo hiểm mã của bạn.

$ pip install flake8 pytest pytest-cov
$ pip freeze > requirements.txt

Tạo file test cho hàm tính toán , file test_calculator.py

"""
Unit tests for the calculator library
"""

import calculator


class TestCalculator:

    def test_addition(self):
        assert 4 == calculator.add(2, 2)

    def test_subtraction(self):
        assert 2 == calculator.subtract(4, 2)

commit và đẩy code lên repo của bạn

kết nối với CircleCI

CircleCI cần biết bạn chạy dự án như thế nào , yêu cầu format cụ thể. CircleCi yêu cầu 1 folder .circleic trong repo của bạn và 1 file config trong đó. File config bao gồm cấu trúc cho tất cả các bước để xây dựng server cần thiết để thực thi. CircleCi yêu cầu file có tên config.yml . File này sử dụng 1 ngôn ngữ khởi tạo dữ liệu , cụ thể có thể tìm hiểu như sau. Mục đích của YAML để cho người đọc được và làm việc tốt với ngôn ngữ lập trình chung. Ở file YAML có 3 cách để diễn tả dữ liệu:

  • Mappings (key-value pairs)
  • Sequences (lists)
  • Scalars (strings or numbers)

Tạo 1 file config.yml trong thư mục .circleci tương ứng với project demo

# Python CircleCI 2.0 configuration file
version: 2
jobs:
  build:
    docker:
      - image: circleci/python:3.6

    working_directory: ~/CalculatorLibrary

    steps:
      # Step 1: obtain repo from GitHub
      - checkout
      # Step 2: create virtual env and install dependencies
      - run:
          name: install dependencies
          command: |
            virtualenv -p python3.6 .env
            source .env/bin/activate
            pip install -r requirements.txt
      # Step 3: run linter and tests
      - run:
          name: run tests
          command: |
            source .env/bin/activate
            flake8 --exclude=.env* --statistics
            pytest -v --cov=calculator

Khởi tạo quản lý circleci tại trang https://circleci.com/ . Login bằng tài khoản github của bạn và kết nối khởi tạo 1 job tương ứng với repo CalculatorLibrary Trang cũng sẽ tạo cho bạn file config.yml tương ứng với ngôn ngữ lập trình của dự án.

Push code lên và chạy thử thôi !!!

Sẽ nhận được giao diện như trên , gặp 1 sỗ lỗi pep8 rồi. fix theo comment rồi đẩy lại là xong

phần còn lại Continuous Deployment mình sẽ hẹn ở bài viết sau !! Nguồn : https://realpython.com/python-continuous-integration/#next-steps


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí