Hướng dẫn hành động GitHub Python

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ưới

Lú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ày

Chú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 đây

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

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 repo

Tiế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]
2

Tiế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 động

Bướ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ày

Bướ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ỗi

Bướ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 ứng

Bướ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
0

Bướ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
1

Và 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ông

Bạ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

Tôi có thể chạy tập lệnh Python trong GitHub Actions không?

Chạy hành động tập lệnh Python. Viết tập lệnh Python trong tệp quy trình Hành động . Hành động này cho phép bạn xác định tập lệnh Python tùy chỉnh bên trong tệp YAML của quy trình làm việc. Viết mã Python của bạn làm đối số tập lệnh và sử dụng tính năng chuỗi nhiều dòng YAML để xác định tập lệnh nhiều dòng.

Làm cách nào để cài đặt Python trong GitHub Actions?

Chèn bước cài đặt phụ thuộc vào các bước. trường trong công việc quy trình làm việc GitHub với cấu hình như thế này. .
Vỡ nợ. Sử dụng yêu cầu đường dẫn. .
Xác định các yêu cầu. đường dẫn txt. .
Tắt pip , setuptools và cài đặt/cập nhật bánh xe

Tác vụ GitHub có tốt không?

So với các công cụ tự động hóa hoặc CI/CD khác, GitHub Actions cung cấp các khả năng gốc ngay trong quy trình GitHub của bạn . Nó cũng giúp bạn dễ dàng tận dụng bất kỳ hành động nào trong số hơn 10.000 hoạt động tự động hóa và CI/CD được viết sẵn và thử nghiệm trong GitHub Marketplace cũng như khả năng tự viết của riêng bạn bằng các tệp YAML dễ sử dụng.

Tác vụ GitHub được sử dụng để làm gì?

GitHub Actions là nền tảng tích hợp liên tục và phân phối liên tục [CI/CD] cho phép bạn tự động hóa quy trình xây dựng, thử nghiệm và triển khai. You can create workflows that build and test every pull request to your repository, or deploy merged pull requests to production.

Chủ Đề