يبدو لي أنه سيكون من الممتع تجميع منشور يسمى "Life of GitHub Action". في التدريب التمهيدي من Google ، يتم توجيهك عبر "Life of Request" ، وكان لي أحد العناصر المفضلة لدي. لذلك ، استخدم نهجًا مشابهًا لـ GitHub Action.
بالنسبة لأولئك الموجودين في الخزان ، تعتبر Actions بمثابة ميزة GitHub تم إطلاقها في Universe العام الماضي. تريد اختبار بيتا؟ اذهب هنا .
الفكرة العامة هي GitHub مع دعم البرمجة النصية ، لكنني لن أعاني من القمامة وانتشرت في التفسيرات. من الأفضل أن تقودك خلال الأحداث التي تحدث عندما يبدأ الإجراء.
المشكلة
هنا سير عمل نموذجي :
- أقوم بإنشاء طلب سحب إلى المستودع.
- يتم امتصاص طلب السحب.
- يتم الحفاظ على الفرع حتى نهاية الوقت ، ويأكلني ذلك الجزء من الدماغ الذي يحب النظافة والنظام.

الفروع المتبقية هي ألمي ، والتركيز على ذلك. على الرغم من أن المشكلة عامة ، فلنقم بإنشاء إجراء لإزالة الفروع بعد استيعاب طلب السحب.
منوجابوكاف؟ كل رمز للعمل هنا .
ملف سير العمل
إذا كنت تريد - إنشاء إجراءات من خلال واجهة المستخدم ، ولكن إذا كنت تريد - اكتب ملف سير العمل مع الأقلام. في هذه المقالة ، أنا فقط استخدام ملف.
هكذا يبدو الأمر ، وسأشرح كل هذا في التعليقات على الملف. وهو موجود في .github/main.workflow
في .github/main.workflow
.
workflow "on pull request merge, delete the branch" { ## On pull_request defines that whenever a pull request event is fired this ## workflow will be run. on = "pull_request" ## What is the ending action (or set of actions) that we are running. ## Since we can set what actions "need" in our definition of an action, ## we only care about the last actions run here. resolves = ["branch cleanup"] } ## This is our action, you can have more than one but we just have this one for ## our example. ## I named it branch cleanup, and since it is our last action run it matches ## the name in the resolves section above. action "branch cleanup" { ## Uses defines what we are running, you can point to a repository like below ## OR you can define a docker image. uses = "jessfraz/branch-cleanup-action@master" ## We need a github token so that when we call the github api from our ## scripts in the above repository we can authenticate and have permission ## to delete a branch. secrets = ["GITHUB_TOKEN"] }
الحدث
لذا ، بما أن المقالة تسمى "حياة العمل" ، فإننا نبدأ بما يحدث للظلام. يتم تشغيل جميع الإجراءات من خلال الحدث جيثب. قائمة الأحداث المدعومة هنا .
أعلاه ، pull_request
الحدث pull_request
. يبدأ عند تعيين طلب سحب أو تخصيصه أو وضع علامة عليه أو إلغاء تحديده أو فتحه أو تحريره أو إغلاقه أو إعادة فتحه أو تزامنه أو طلب طلب سحب أو حذف طلب سحب.
حسنًا ، لقد بدأنا هذا الحدث ، و ...
يوجد خطأ في طلب السحب ...
وإليك GitHub: "لعنة الفطيرة ، هناك خطأ في طلب السحب! أنا figu من كل الأدوات للمشاكل! "
بالنظر إلى ملف سير العمل (انظر أعلاه) ، يقول جيثب: "سأبدأ الآن سير العمل لاستيعاب طلب السحب ، وسأحذف الفرع."
ماذا يؤدي هذا إلى؟ أوه ، "تنظيف الفرع". اسمحوا لي أن أبسط الخطوات اللازمة لتنظيف الفرع (في هذه الحالة ، لا يوجد شيء) وتشغيلها بالترتيب / بالتوازي للوصول إلى "الفرع النظيف".
العمل
تعلن GitHub هنا: "أيها الأشخاص ، يجب أن أبدأ" تنظيف الفرع "هنا. اسمحوا لي أن معرفة ذلك ".
هذا يعيدنا إلى قسم uses
في ملفنا. jessfraz/branch-cleanup-action@master
إلى المستودع: jessfraz/branch-cleanup-action@master
.
يحتوي هذا المستودع على Dockerfile. إنه يحدد البيئة التي سيتم فيها تنفيذ أعمالنا.
Dockerfile
ألقِ نظرة على ذلك ، وسأحاول شرح كل شيء في التعليقات.
## FROM defines what Docker image we are starting at. A docker image is a bunch ## of files combined in a tarball. ## This image is all the files we need for an Alpine OS environment. FROM alpine:latest ## This label defines our action name, we could have named it butts but ## I decided to be an adult. LABEL "com.github.actions.name"="Branch Cleanup" ## This label defines the description for our action. LABEL "com.github.actions.description"="Delete the branch after a pull request has been merged" ## We can pick from a variety of icons for our action. ## The list of icons is here: https://developer.github.com/actions/creating-github-actions/creating-a-docker-container/#supported-feather-icons LABEL "com.github.actions.icon"="activity" ## This is the color for the action icon that shows up in the UI when it's run. LABEL "com.github.actions.color"="red" ## These are the packages we are installing. Since I just wrote a shitty bash ## script for our Action we don't really need all that much. We need bash, ## CA certificates and curl so we can send a request to the GitHub API ## and jq so I can easily muck with JSON from bash. RUN apk add --no-cache \ bash \ ca-certificates \ curl \ jq ## Now I am going to copy my shitty bash script into the image. COPY cleanup-pr-branch /usr/bin/cleanup-pr-branch ## The cmd for the container defines what arguments should be executed when ## it is run. ## We are just going to call back to my shitty script. CMD ["cleanup-pr-branch"]
السيناريو
فيما يلي محتويات البرنامج النصي التجريبي الذي أقوم بتشغيله.
#!/bin/bash set -e set -o pipefail # This is populated by our secret from the Workflow file. if [[ -z "$GITHUB_TOKEN" ]]; then echo "Set the GITHUB_TOKEN env variable." exit 1 fi # This one is populated by GitHub for free :) if [[ -z "$GITHUB_REPOSITORY" ]]; then echo "Set the GITHUB_REPOSITORY env variable." exit 1 fi URI=https://api.github.com API_VERSION=v3 API_HEADER="Accept: application/vnd.github.${API_VERSION}+json" AUTH_HEADER="Authorization: token ${GITHUB_TOKEN}" main(){ # In every runtime environment for an Action you have the GITHUB_EVENT_PATH # populated. This file holds the JSON data for the event that was triggered. # From that we can get the status of the pull request and if it was merged. # In this case we only care if it was closed and it was merged. action=$(jq --raw-output .action "$GITHUB_EVENT_PATH") merged=$(jq --raw-output .pull_request.merged "$GITHUB_EVENT_PATH") echo "DEBUG -> action: $action merged: $merged" if [[ "$action" == "closed" ]] && [[ "$merged" == "true" ]]; then # We only care about the closed event and if it was merged. # If so, delete the branch. ref=$(jq --raw-output .pull_request.head.ref "$GITHUB_EVENT_PATH") owner=$(jq --raw-output .pull_request.head.repo.owner.login "$GITHUB_EVENT_PATH") repo=$(jq --raw-output .pull_request.head.repo.name "$GITHUB_EVENT_PATH") default_branch=$( curl -XGET -sSL \ -H "${AUTH_HEADER}" \ -H "${API_HEADER}" \ "${URI}/repos/${owner}/${repo}" | jq .default_branch ) if [[ "$ref" == "$default_branch" ]]; then # Never delete the default branch. echo "Will not delete default branch (${default_branch}) for ${owner}/${repo}, exiting." exit 0 fi echo "Deleting branch ref $ref for owner ${owner}/${repo}..." curl -XDELETE -sSL \ -H "${AUTH_HEADER}" \ -H "${API_HEADER}" \ "${URI}/repos/${owner}/${repo}/git/refs/heads/${ref}" echo "Branch delete success!" fi } main "$@"
لذلك ، في الوقت الحالي ، نفذت GitHub نصنا في وقت التشغيل.
سيقوم GitHub بالإبلاغ عن حالة الإجراء إلى واجهة المستخدم ، ويمكنك رؤيته في علامة التبويب "إجراءات".
نأمل أن يجلب هذا بعض الوضوح حول كيفية تنفيذ العمليات في إجراءات جيثب. لا استطيع الانتظار لمعرفة ما يحدث معك.