Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Cách xuất bản dữ liệu sự kiện GitHub với Tác vụ và Trang GitHub

Các nhóm làm việc trên GitHub dựa vào dữ liệu sự kiện để cộng tác. Dữ liệu được ghi lại dưới dạng các vấn đề, yêu cầu kéo và nhận xét trở nên quan trọng để hiểu dự án.

Với tính khả dụng chung của GitHub Actions, chúng tôi có cơ hội truy cập theo chương trình và lưu giữ dữ liệu sự kiện GitHub trong kho lưu trữ của chúng tôi. Việc biến dữ liệu trở thành một phần của chính kho lưu trữ là một cách bảo quản nó bên ngoài GitHub. Nó cũng cung cấp cho chúng tôi khả năng làm nổi bật dữ liệu trên trang web giao diện người dùng, chẳng hạn như với Trang GitHub.

Và, nếu bạn giống tôi, bạn có thể biến các nhận xét trên số báo GitHub thành một trang lưu bút tuyệt vời của thập niên 90.

Bất kể cách sử dụng, các khái niệm nguyên tắc đều giống nhau. Chúng tôi có thể sử dụng Tác vụ để truy cập, bảo quản và hiển thị dữ liệu sự kiện GitHub - chỉ với một tệp quy trình làm việc. Để minh họa quá trình này, tôi sẽ hướng dẫn bạn qua mã quy trình làm việc giúp cuốn sổ lưu bút của tôi trở nên nổi bật.

Để có cái nhìn giới thiệu về Hành động GitHub bao gồm cách quy trình công việc được kích hoạt, hãy xem Luồng CI / CD nhẹ, không công cụ với các Hành động GitHub.

Truy cập dữ liệu sự kiện GitHub

Dòng công việc Hành động chạy trong môi trường có một số biến môi trường mặc định. Nhiều thông tin thuận tiện có sẵn ở đây, bao gồm cả dữ liệu sự kiện. Cách đầy đủ nhất để truy cập dữ liệu sự kiện là sử dụng $GITHUB_EVENT_PATH biến, đường dẫn của tệp có tải trọng sự kiện JSON hoàn chỉnh.

Đường dẫn được mở rộng trông giống như /home/runner/work/_temp/_github_workflow/event.json và dữ liệu của nó tương ứng với sự kiện webhook của nó. Bạn có thể tìm thấy tài liệu cho dữ liệu sự kiện webhook trong Loại sự kiện API GitHub REST và Tải trọng. Để cung cấp dữ liệu JSON trong môi trường dòng công việc, bạn có thể sử dụng một công cụ như jq để phân tích cú pháp dữ liệu sự kiện và đưa nó vào một biến môi trường.

Dưới đây, tôi lấy ID nhận xét từ một sự kiện nhận xét vấn đề:

ID="$(jq '.comment.id' $GITHUB_EVENT_PATH)"

Hầu hết dữ liệu sự kiện cũng có sẵn qua github.event biến ngữ cảnh mà không cần phân tích cú pháp JSON. Các trường được truy cập bằng ký hiệu dấu chấm, như trong ví dụ dưới đây, nơi tôi lấy cùng một ID nhận xét:

ID=${{ github.event.comment.id }}

Đối với sổ lưu bút của mình, tôi muốn hiển thị các mục nhập bằng tay cầm của người dùng và ngày giờ. Tôi có thể nắm bắt dữ liệu sự kiện này như sau:

AUTHOR=${{ github.event.comment.user.login }}
DATE=${{ github.event.comment.created_at }}

Tuy nhiên, các biến Shell rất hữu ích để truy cập dữ liệu. Môi trường dòng công việc được tạo mới sau mỗi lần chạy, và ngay cả các biến shell được đặt trong một bước cũng không tiếp tục với các bước khác. Để duy trì dữ liệu đã thu thập, bạn có hai tùy chọn:sử dụng tạo tác hoặc chuyển nó vào kho lưu trữ.

Bảo quản dữ liệu sự kiện:sử dụng phần mềm

Bằng cách sử dụng tạo tác, bạn có thể duy trì dữ liệu giữa các công việc quy trình làm việc mà không cần chuyển nó vào kho lưu trữ của bạn. Điều này rất hữu ích khi, chẳng hạn, bạn muốn chuyển đổi hoặc kết hợp dữ liệu trước khi đưa nó vào một nơi lâu dài hơn. Cần phải duy trì dữ liệu giữa các công việc quy trình làm việc vì:

Mỗi công việc trong một dòng công việc chạy trong một phiên bản mới của môi trường ảo. Khi công việc hoàn thành, trình chạy kết thúc và xóa cá thể của môi trường ảo. (Dữ liệu quy trình làm việc tồn tại bằng cách sử dụng phần mềm tạo tác)

Hai hành động hỗ trợ việc sử dụng cấu phần phần mềm:upload-artifactdownload-artifact . Bạn có thể sử dụng các hành động này để cung cấp tệp cho các công việc khác trong cùng quy trình làm việc. Để có ví dụ đầy đủ, hãy xem chuyển dữ liệu giữa các công việc trong quy trình làm việc.

upload-artifact action của action.yml chứa giải thích về các từ khóa. Các tệp đã tải lên được lưu trong .zip định dạng. Một công việc khác trong cùng một lần chạy quy trình công việc có thể sử dụng download-artifact hành động để sử dụng dữ liệu trong một bước khác.

Bạn cũng có thể tải xuống bản lưu trữ theo cách thủ công trên trang chạy dòng công việc, trong tab Hành động của kho lưu trữ.

Dữ liệu quy trình làm việc liên tục giữa các công việc không thực hiện bất kỳ thay đổi nào đối với tệp kho lưu trữ, vì các tạo tác được tạo chỉ tồn tại trong môi trường quy trình làm việc.

Cá nhân tôi, cảm thấy thoải mái khi làm việc trong môi trường shell, tôi thấy trường hợp sử dụng hiện vật hạn hẹp, mặc dù tôi không muốn đề cập đến chúng. Bên cạnh việc chuyển dữ liệu giữa các công việc, chúng có thể hữu ích để tạo .zip định dạng kho lưu trữ, chẳng hạn, kiểm tra dữ liệu đầu ra. Trong trường hợp ví dụ về sổ lưu bút của tôi, tôi chỉ đơn giản chạy tất cả các bước cần thiết trong một công việc, loại bỏ mọi nhu cầu chuyển dữ liệu giữa các công việc.

Lưu trữ dữ liệu sự kiện:đẩy các tệp dòng công việc vào kho lưu trữ

Để bảo toàn dữ liệu được ghi lại trong quy trình làm việc trong chính kho lưu trữ, cần phải thêm và đẩy dữ liệu này vào kho lưu trữ Git. Bạn có thể thực hiện việc này trong quy trình làm việc bằng cách tạo tệp mới với dữ liệu hoặc bằng cách nối dữ liệu vào tệp hiện có, sử dụng lệnh shell.

Tạo tệp trong quy trình làm việc

Để làm việc với các tệp kho lưu trữ trong quy trình làm việc, hãy sử dụng checkout hành động để lần đầu tiên có một bản sao để làm việc với:

- uses: actions/checkout@master
  with:
    fetch-depth: 1

Để thêm nhận xét vào sổ lưu bút của mình, tôi biến dữ liệu sự kiện được ghi lại trong các biến shell thành các tệp thích hợp, sử dụng các thay thế trong mở rộng tham số shell để làm sạch thông tin nhập của người dùng và dịch dòng mới thành đoạn văn. Tôi đã viết trước đây về lý do tại sao đầu vào của người dùng nên được xử lý cẩn thận.

- name: Turn comment into file
  run: |
    ID=${{ github.event.comment.id }}
    AUTHOR=${{ github.event.comment.user.login }}
    DATE=${{ github.event.comment.created_at }}
    COMMENT=$(echo "${{ github.event.comment.body }}")
    NO_TAGS=${COMMENT//[<>]/\`}
    FOLDER=comments

    printf '%b\n' "<div class=\"comment\"><p>${AUTHOR} says:</p><p>${NO_TAGS//$'\n'/\<\/p\>\<p\>}</p><p>${DATE}</p></div>\r\n" > ${FOLDER}/${ID}.html

Bằng cách sử dụng printf và định hướng đầu ra của nó bằng > sang tệp mới, dữ liệu sự kiện được chuyển đổi thành tệp HTML, được đặt tên bằng số ID nhận xét, chứa dữ liệu sự kiện đã thu thập. Được định dạng, nó trông giống như:

<div class="comment">
  <p>victoriadrake says:</p>
  <p>This is a comment!</p>
  <p>2019-11-04T00:28:36Z</p>
</div>

Khi làm việc với nhận xét, một tác dụng của việc đặt tên tệp bằng ID nhận xét là tệp mới có cùng ID sẽ ghi đè tệp trước đó. Điều này rất hữu ích cho một cuốn sổ lưu bút, vì nó cho phép bất kỳ chỉnh sửa nào đối với một nhận xét để thay thế tệp nhận xét ban đầu.

Nếu bạn đang sử dụng trình tạo trang web tĩnh như Hugo, bạn có thể tạo tệp định dạng Markdown, dán tệp đó vào content/ của bạn thư mục, và bản dựng trang thông thường sẽ lo phần còn lại.

Trong trường hợp sổ lưu bút đơn giản của tôi, tôi có thêm một bước để hợp nhất các tệp nhận xét riêng lẻ thành một trang. Mỗi lần chạy, nó sẽ ghi đè index.html hiện có với header.html phần (> ), sau đó tìm và nối (>> ) tất cả nội dung của tệp nhận xét theo thứ tự giảm dần và cuối cùng nối footer.html phần cuối trang.

- name: Assemble page
  run: |
    cat header.html > index.html
    find comments/ -name "*.html" | sort -r | xargs -I % cat % >> index.html
    cat footer.html >> index.html

Cam kết các thay đổi đối với hệ thống lưu trữ

Kể từ khi checkout hành động không hoàn toàn giống như nhân bản kho lưu trữ, tại thời điểm viết bài, vẫn còn một số vấn đề cần giải quyết. Một vài bước bổ sung là cần thiết để pull , checkoutpush thành công thay đổi trở lại master nhánh, nhưng điều này được thực hiện khá nhẹ nhàng trong shell.

Dưới đây là bước thêm, cam kết và đẩy các thay đổi được thực hiện bởi quy trình làm việc trở lại master của kho lưu trữ chi nhánh.

- name: Push changes to repo
  run: |
    REMOTE=https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
    git config user.email "${{ github.actor }}@users.noreply.github.com"
    git config user.name "${{ github.actor }}"

    git pull ${REMOTE}
    git checkout master
    git add .
    git status
    git commit -am "Add new comment"
    git push ${REMOTE} master

Trên thực tế, điều khiển từ xa, kho lưu trữ của chúng tôi, được chỉ định bằng cách sử dụng github.repository biến ngữ cảnh. Để quy trình làm việc của chúng tôi được phép đẩy lên thành thạo, chúng tôi sử dụng secrets.GITHUB_TOKEN biến.

Vì môi trường quy trình làm việc sáng bóng và mới sinh, chúng ta cần phải định cấu hình Git. Trong ví dụ trên, tôi đã sử dụng github.actor biến ngữ cảnh để nhập tên người dùng của tài khoản bắt đầu quy trình làm việc. Email được định cấu hình tương tự bằng cách sử dụng noreply mặc định Địa chỉ email GitHub.

Hiển thị dữ liệu sự kiện

Sửa chữa ngày 6 tháng 11 năm 2019:GitHub Actions yêu cầu Mã truy cập cá nhân để kích hoạt xây dựng trang Pages.

Nếu bạn đang sử dụng Trang GitHub với secrets.GITHUB_TOKEN mặc định biến và không có trình tạo trang, việc đẩy các thay đổi vào kho lưu trữ trong quy trình làm việc sẽ chỉ cập nhật các tệp kho lưu trữ. Quá trình xây dựng Trang GitHub sẽ không thành công với lỗi "Trang web của bạn đang gặp sự cố khi xây dựng:Quá trình tạo trang không thành công".

Để cho phép Hành động kích hoạt xây dựng trang Pages, bạn cần tạo Mã thông báo truy cập cá nhân. Mã thông báo này có thể được lưu trữ dưới dạng bí mật trong cài đặt kho lưu trữ và được chuyển vào quy trình làm việc thay cho secrets.GITHUB_TOKEN mặc định Biến đổi. Tôi đã viết thêm về môi trường Hành động và các biến trong bài đăng này.

Với việc sử dụng Mã truy cập cá nhân, một lần đẩy do dòng công việc Tác vụ khởi xướng cũng sẽ cập nhật trang Pages. Bạn có thể tự mình thấy điều đó bằng cách để lại bình luận trong sổ lưu bút của tôi! Sự kiện tạo nhận xét kích hoạt quy trình làm việc, sau đó mất khoảng 30 giây đến một phút để chạy và cập nhật trang sổ lưu bút.

Trong trường hợp cần xây dựng trang web để xuất bản các thay đổi, chẳng hạn như khi sử dụng Hugo, một Hành động cũng có thể thực hiện điều này. Tuy nhiên, để tránh tạo các vòng lặp ngoài ý muốn, một dòng công việc Action sẽ không kích hoạt dòng công việc khác. Thay vào đó, vô cùng thuận tiện để xử lý quá trình xây dựng trang web bằng Makefile, mà sau đó bất kỳ dòng công việc nào cũng có thể chạy. Chỉ cần thêm chạy Makefile làm bước cuối cùng trong công việc quy trình làm việc của bạn, với mã thông báo kho lưu trữ nếu cần:

- name: Run Makefile
  env:
    TOKEN: ${{ secrets.GITHUB_TOKEN }}
  run: make all

Điều này đảm bảo rằng bước cuối cùng của quy trình làm việc của bạn là xây dựng và triển khai trang web được cập nhật.

Không còn đường chân trời dữ liệu sự kiện nữa

GitHub Actions cung cấp một cách gọn gàng để nắm bắt và sử dụng dữ liệu sự kiện để dữ liệu đó không chỉ có sẵn trong GitHub. Khả năng chỉ có giới hạn như trí tưởng tượng của bạn! Dưới đây là một vài ý tưởng về những thứ mà chúng ta có thể tạo ra:

  1. Một hội đồng giải quyết vấn đề công khai, nơi khách hàng không có tài khoản GitHub có thể xem và đưa ra phản hồi về các vấn đề của dự án.
  2. Nguồn cấp dữ liệu RSS tự động cập nhật các vấn đề, nhận xét hoặc PR mới cho bất kỳ kho lưu trữ nào.
  3. Hệ thống nhận xét dành cho các trang web tĩnh, sử dụng các nhận xét về vấn đề GitHub làm phương thức nhập.
  4. Một trang lưu bút tuyệt vời của thập niên 90.

Tôi đã đề cập đến việc tôi đã làm một trang lưu bút của thập niên 90? Nội tâm-Geocities-mọt sách của tôi có một chút phấn khích.