Các hành động của GitHub là một nền tảng DevOps cho phép bạn tích hợp các thực hành tích hợp liên tục [CI] và phân phối liên tục [CD] với kho lưu trữ mã của bạn trong GitHub. Trong bài đăng trên blog này, tôi sẽ giải thích CI là gì và tại sao bạn nên sử dụng nó cũng như cách triển khai nó trong GitHub Actions với một dự án Python ví dụ đi kèm
Tích hợp liên tục là gì?
Tích hợp liên tục là một quy trình DevOps và về cơ bản có nghĩa là tự động hóa quy trình tích hợp các thay đổi mã vào kho lưu trữ mã. Ý tưởng chung là như sau. bạn thực hiện các thay đổi đối với kho lưu trữ mã từ xa [e. g. GitHub], kích hoạt quá trình xây dựng và thử nghiệm tự động – mã đã cam kết được xây dựng trên một máy chủ từ xa và các thử nghiệm được chạy đối với nó. Đó là cốt lõi của CI
Khía cạnh tự động hóa của CI làm giảm kịch tính và ma sát liên quan đến việc đưa ra các thay đổi đối với cơ sở mã. Lợi ích chính của việc này là bạn nhận được phản hồi nhanh chóng về việc liệu thay đổi của bạn có xung đột với những thay đổi do người khác thực hiện hay không. Điều này khuyến khích phát triển lô nhỏ – thay đổi càng nhỏ thì càng ít có khả năng xảy ra xung đột hợp nhất và khi có xung đột thì sẽ dễ giải quyết hơn vì chỉ một lượng nhỏ mã đã thay đổi
Phát triển lô nhỏ là một khía cạnh chính của các nguyên tắc DevOps vì những lý do khác ngoài lý do này. thắt chặt các vòng phản hồi, tăng năng suất của nhà phát triển, tăng chất lượng mã, giảm rủi ro khi triển khai mã. Đó là chìa khóa cho ý tưởng mang lại giá trị liên tục thông qua những thay đổi nhỏ, gia tăng và thường xuyên
Ngoài việc chỉ ra xung đột hợp nhất và có lẽ quan trọng hơn, CI cung cấp phản hồi nhanh về chất lượng và tính chính xác của mã thông qua các bước xây dựng và kiểm tra. Vì lý do này, CI cũng bổ sung cho sự phát triển lô nhỏ. Thông thường, mã không vượt qua các giai đoạn xây dựng và thử nghiệm của quy trình CI sẽ không được tự động hợp nhất vào cơ sở mã chính, do đó, quy trình đóng vai trò là bộ lọc chất lượng xung quanh cơ sở mã chính – dẫn đến ít lỗi hơn và mã chất lượng cao hơn
Tóm lại, CI là thành phần chính của mục tiêu DevOps nhằm mang lại giá trị liên tục cho khách hàng. Nó tự động hóa một phần quy trình tích hợp các thay đổi mã vào cơ sở mã và do đó thắt chặt các vòng phản hồi, từ đó làm tăng chất lượng mã và bổ sung cho phát triển lô nhỏ, mang lại nhiều lợi ích bổ sung
Triển khai CI với các hành động GitHub
GitHub Actions sử dụng một hệ thống các sự kiện và quy trình công việc để thực thi các quy trình DevOps. Ví dụ: khi một cam kết được đẩy lên chính [sự kiện kích hoạt], hãy chạy quy trình công việc xây dựng và chạy thử nghiệm đối với mã đã cam kết [quy trình công việc]
Quy trình công việc về cơ bản là một tập hợp các nhiệm vụ được thực hiện để đáp ứng với một sự kiện. Quy trình công việc được xác định trong một tệp được viết theo cú pháp YAML mà bạn đưa vào kho lưu trữ dự án của mình và theo dõi bằng kiểm soát nguồn và đẩy lên GitHub cùng với mã của bạn
Các tệp quy trình làm việc bao gồm một vài thành phần khác nhau mà tôi sẽ nhanh chóng lướt qua. Đầu tiên là sự kiện – sự kiện kích hoạt quá trình chạy quy trình công việc [e. g. khi cam kết được đẩy lên chính hoặc yêu cầu kéo được gửi]. Công việc xác định trình tự các bước. Các bước được thực hiện theo trình tự theo thứ tự mà chúng được xác định trong công việc mà chúng thuộc về; . g. một lệnh trình bao duy nhất] hoặc một hành động sẽ được chạy. Một hành động giống như một đoạn mã có thể tái sử dụng có thể chạy trên nền tảng Hành động GitHub để thực hiện các tác vụ thông thường. Nhiều hành động được cung cấp hoặc hỗ trợ bởi GitHub, ví dụ: hành động
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
2 được sử dụng rất phổ biến và bạn sẽ thấy hành động đó trong ví dụ bên dướiLúc đầu, thuật ngữ cho các thành phần khác nhau liên quan đến việc sử dụng các hành động GitHub có thể hơi khó hiểu, ví dụ bên dưới sẽ giúp bạn thấy các phần khớp với nhau như thế nào. Bài viết Tìm hiểu hành động GitGub này trên GitHub cũng là một hướng dẫn hữu ích
Dự án Python ví dụ
Tôi đã tập hợp một kho lưu trữ Python đơn giản để trình bày cách triển khai CI với các Tác vụ GitHub. cấu trúc của kho lưu trữ được hiển thị bên dưới
shapes
┣ .github
┃ ┗ workflows
┃ ┃ ┗ python-app.yml
┣ shapes
┃ ┣ shapes_2d.py
┃ ┣ shapes_3d.py
┃ ┗ __init__.py
┣ tests
┃ ┣ test_shapes_2d
┃ ┃ ┗ test_circle.py
┃ ┣ test_shapes_3d
┃ ┃ ┗ test_sphere.py
┣ poetry.lock
┣ pyproject.toml
┗ README.md
Có một số tệp và thư mục khác [như
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
3 và name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
4] nằm trong kho lưu trữ của tôi nhưng không được hiển thị trong sơ đồ ở trên vì chúng không liên quan đến chủ đề của bài đăng trên blog nàyChúng tôi có một vài mô-đun Python bên trong thư mục
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
5 - name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
6 và name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
7 - chứa một số mã nguồn để làm việc với các hình dạng, ví dụ: name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
6 trông như thế này…Chúng tôi cũng có một số mã kiểm tra bên dưới thư mục
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
9, ví dụ như name: Python package
0 trông như thế này…Tệp quy trình làm việc
Bên trong thư mục
name: Python package
1 ở thư mục gốc của repo là tệp quy trình công việc cho repo này. name: Python package
2. name: Python package
1 là thư mục nổi tiếng mà GitHub Actions tìm kiếm các tệp quy trình công việc, vì vậy hãy đảm bảo lưu trữ chúng tại đâyname: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
Hãy xem qua tệp quy trình công việc này từng bước
name: Python package
Chỉ định tên của dòng công việc
on: [push]
Chỉ định trình kích hoạt cho quy trình làm việc. Tôi đang sử dụng sự kiện
name: Python package
4, nghĩa là quy trình làm việc sẽ được kích hoạt bất cứ khi nào một cam kết được đẩy vào repoTiếp theo,
name: Python package
5 là chìa khóa có con là công việc. Có một công việc duy nhất trong quy trình công việc này được gọi là name: Python package
6, các khóa con của công việc này xác định các thuộc tính của công việc, thuộc tính đầu tiên làruns-on: ubuntu-latest
Điều này chỉ định HĐH trên VM [hoặc cái mà GitHub gọi là trình chạy] mà công việc sẽ chạy là phiên bản Ubuntu mới nhất
Tiếp theo, chúng ta có
strategy:
matrix:
python-version: ["3.9", "3.10"]
Phím
name: Python package
7 cho phép bạn xác định name: Python package
8 cấu hình công việc, điều này cho phép bạn tạo nhiều lần chạy công việc – một lần chạy cho mỗi kết hợp của các biến được chỉ định, tất cả sẽ chạy khi quy trình công việc được kích hoạt. Vì vậy, trong trường hợp này, chúng tôi có name: Python package
9, có nghĩa là bất cứ khi nào quy trình công việc này được kích hoạt, công việc này sẽ được chạy hai lần. một lần sử dụng Python 3. 9 và một lần sử dụng Python 3. 10. Bạn cũng có thể xác định một ma trận của các hệ điều hành, e. g. on: [push]
0. Nếu tôi cũng có điều đó trong ví dụ của mình, thì công việc này sẽ được thực hiện bốn lần cho mỗi lần kết hợp on: [push]
1 x on: [push]
2Tiếp theo là khóa
on: [push]
3, là khóa con của id công việc [on: [push]
4], và đây là trung tâm của công việc. nó xác định các bước xác định công việc mà công việc thực hiện. Như tôi đã đề cập trước đó, một bước có thể là tập lệnh trình bao [có thể chỉ là một lệnh đơn lẻ] hoặc Hành độngBước đầu tiên của công việc
on: [push]
4 là- uses: actions/checkout@v3
sẽ chạy phiên bản 3 của tác vụ
on: [push]
6. Đây là một hành động được tạo bởi GitHub và là hành động mà bạn sẽ thường xuyên bắt gặp; Bước tiếp theo là
- name: Install Poetry
run: pipx install poetry
Tên của bước, 'Cài đặt thơ', sẽ xuất hiện trong trình xem chạy quy trình làm việc trên GitHub. Nó thực thi lệnh shell
on: [push]
7, lệnh này sẽ cài đặt gói Python có tên là Thơ, đây là công cụ quản lý phụ thuộc mà tôi đang sử dụng trong dự án nàyBước tiếp theo là
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
Ở đây tôi đang sử dụng bối cảnh gọi GitHub trong tên của bước. Ngữ cảnh là đối tượng chứa các thuộc tính chứa thông tin mà bạn có thể truy cập, trong trường hợp này tôi đang truy cập thuộc tính
on: [push]
1 trên đối tượng ngữ cảnh name: Python package
8. Đồng đô la và dấu ngoặc nhọn dành cho phép nội suy chuỗiBước này sử dụng tác vụ
runs-on: ubuntu-latest
0 mà GitHub khuyên bạn nên sử dụng khi sử dụng Tác vụ GitHub với các dự án Python, chức năng cơ bản của nó là cài đặt một phiên bản Python và thêm nó vào biến môi trường runs-on: ubuntu-latest
1. Từ khóa runs-on: ubuntu-latest
2 cho phép bạn xác định giá trị cho các tham số đầu vào trên hành động, ở đây tôi chuyển các giá trị runs-on: ubuntu-latest
3 và runs-on: ubuntu-latest
4 cho các tham số on: [push]
1 và runs-on: ubuntu-latest
6 tương ứngBước tiếp theo,
- name: Install dependencies
run: poetry install
chạy
runs-on: ubuntu-latest
7 để cài đặt các phụ thuộc của dự án được chỉ định trong tệp runs-on: ubuntu-latest
8 trong repo. Đây là một điểm quan trọng khi sử dụng các hành động GitHub. bạn cần đảm bảo môi trường bên trong VM mà mã của bạn đang được chạy trên đó đã cài đặt các phụ thuộc cần thiết mà mã của bạn yêu cầu. Nói rộng hơn, bạn muốn môi trường trên máy ảo của người chạy phản ánh môi trường sản xuất mà mã của bạn sẽ chạy trong đóname: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
0Bước này chạy các bài kiểm tra đơn vị được xác định trong repo
name: Python package
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10"]
steps:
- uses: actions/checkout@v3
- name: Install Poetry
run: pipx install poetry
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
cache: "poetry"
- name: Install dependencies
run: poetry install
- name: Test with Pytest
run: poetry run pytest
- name: Lint with flake8
run: poetry run flake8
1Và cuối cùng, bước này chạy kẻ nói dối qua mã
Xem quy trình công việc chạy trong GitHub
Hình ảnh trên cho thấy kết quả của một quy trình công việc duy nhất được chạy trong tab Hành động trong GitHub cho kho lưu trữ này. Khắc phục sự cố xơ vải là thông báo được thêm vào cam kết đã kích hoạt quá trình chạy quy trình công việc cụ thể này. Bạn có thể thấy rằng hai công việc, cho hai phiên bản Python khác nhau được chỉ định trong
name: Python package
8, đã chạy thành côngBạn cũng có thể xem các bước tạo nên công việc ['build [3. 9]' trong trường hợp này], với tên ở đây tương ứng với tên chúng tôi đã cung cấp trong tệp YAML. Mỗi bước trong số này đều có thể mở rộng trong giao diện người dùng, vì vậy bạn có thể hoàn thành công việc mà mỗi bước đã thực hiện