Ê×Ò³
ѧϰ
»î¶¯
רÇø
¹¤¾ß
TVP
·¢²¼
¾«Ñ¡ÄÚÈÝ/¼¼ÊõÉçȺ/ÓŻݲúÆ·,¾¡ÔÚС³ÌÐò
Á¢¼´Ç°Íù

ÎÒÓà GitHub Action ´î½¨ÁËÒ»Ì× CI/CD ϵͳ

±¾ÎÄÊÇ Nebula Graph ¹¤³ÌʦÀûÓà GitHub Action ´î½¨ CI/CD ϵͳµÄʵ¼ù£¬Ï£ÍûÄܹ»¶Ô¶ÁÕßÓÐËù°ïÖú£¬Í¬Ê±Ò²»¶Ó­¶ÁÕßÁôÑÔÓë×÷Õß½øÐн»Á÷¡£

1. ÔµÆð

Nebula Graph ×îÔçµÄ×Ô¶¯»¯²âÊÔÊÇʹÓôÔÚ Azure É쵀 Jenkins£¬ÅäºÏ×Å GitHub µÄ Webhook ʵÏֵģ¬ÔÚÓû§Ìá½» Pull Request ʱ£¬¼Ó¸ö ready-for-testing µÄ label ÔÙÆÀÂÛÒ»¾ä Jenkins go ¾Í¿ÉÒÔ×Ô¶¯µÄÔËÐÐÏàÓ¦µÄ UT ²âÊÔ£¬Ð§¹ûÈçÏ£º

ÒòΪÊÇ×âÓÃµÄ Azure µÄÔÆÖ÷»ú£¬¼ÓÉÏ nebula µÄ±àÒëÒªÇóµÄ»úÆ÷ÅäÖýϸߣ¬¶øÇÒÈÎÎñµÄ´¥·¢Ö÷Òª¼¯ÖÐÔÚ°×Ìì¡£ËùÒÔÉÏÊöµÄ·½°¸ÐԼ۱Ƚϵͣ¬´ÓÈ¥ÄêÍŶӾÍÔÚ¿¼ÂÇÑ°ÕÒÌæ´úµÄ·½°¸£¬×¼±¸ÏÂÏß Azure ÉϵIJâÊÔ»ú£¬²¢ÇÒ»¹ÒªÄÜÌṩ¶à»·¾³µÄ²âÊÔ·½°¸¡£

µ÷ÑÐÁËһȦÏÖÓеIJúÆ·Ö÷ÒªÓУº

  1. TravisCI
  2. CircleCI
  3. Azure Pipeline
  4. Jenkins on k8s£¨×Ô½¨£©

ËäÈ»ÉÏÃæµÄ²úÆ·¶Ô¿ªÔ´ÏîÄ¿ÓÐЩÏÞÖÆ£¬µ«ÕûÌ嶼»¹Ëã±È½ÏÓѺá£

¼øÓÚ֮ǰ GitLab CI µÄʹÓþ­Ñ飬Ìå»áµ½Èç¹ûÄܸú GitHub Éî¶È¼¯³ÉÄǵ±È»ÊÇÊ×Ñ¡¡£Ëùν¡°Éî¶È¡±±íʾ¿ÉÒÔ¹²Ïí GitHub µÄÕû¸ö¿ªÔ´µÄÉú̬ÒÔ¼°ÍêÃÀµÄ API µ÷Ó㨺󻰣©¡£Ç¡ÇÉ 2019£¬GitHub Action 2.0 ºá¿Õ³öÊÀ£¬Nebula Graph ±ãÓ¸ҵÄÈëÁË¿Ó¡£

ÕâÀï¼òµ¥¸ÅÊöÒ»ÏÂÎÒÃÇÔÚʹÓà GitHub Action ʱÌå»áµ½µÄÓŵ㣺

  1. Ãâ·Ñ¡£¿ªÔ´ÏîÄ¿¿ÉÒÔÃâ·ÑʹÓà Action µÄËùÓй¦ÄÜ£¬¶øÇÒ»úÆ÷ÅäÖýϸߡ£
  2. ¿ªÔ´Éú̬ºÃ¡£ÔÚÕû¸ö CI µÄÁ÷³ÌÀ¿ÉÒÔÖ±½ÓʹÓà GitHub ÉϵÄËùÓпªÔ´µÄ Action£¬ÄÄžÍÊÇûÓÐÂú×ãÐèÇóµÄ Action£¬×Ô¼ºÉÏÊÖдҲ²»ÊǺÜÂé·³£¬¶øÇÒ»¹Ö§³Ö docker ¶¨ÖÆ£¬Óà bash ¾Í¿ÉÒÔÍê³ÉÒ»¸öרÊôµÄ Action¡£
  3. Ö§³Ö¶àÖÖϵͳ¡£Windows¡¢macOS ºÍ Linux ¶¼¿ÉÒÔÒ»¼üʹÓ㬿çƽ̨¼òµ¥·½±ã¡£
  4. ¿É¸ú GitHub µÄ API »¥¶¯¡£Í¨¹ý GITHUB_TOKEN ¿ÉÒÔÖ±½Ó·ÃÎÊ GitHub API V3£¬ÏëÉÏ´«Îļþ£¬¼ì²é PR ״̬£¬Ê¹Óà curl ÃüÁî¼´¿ÉÍê³É¡£
  5. ×ÔÍйܡ£Ö»ÒªÌṩ workflow µÄÃèÊöÎļþ£¬½«Æä·ÅÖõ½ .github/workflows/ Ŀ¼Ï£¬Ã¿´ÎÌá½»±ã»á×Ô¶¯´¥·¢Ö´ÐÐÐ嵀 action run¡£
  6. Workflow ÃèÊöÎļþ¸ÄΪ YAML ¸ñʽ¡£Ä¿Ç°µÄÃèÊö·½Ê½Òª±È Action 1.0 ÖÐµÄ workflow Îļþ¸ü¼Ó¼ò½àÒ׶Á¡£

ÏÂÃæÔÚ½²Êµ¼ù֮ǰ»¹ÊÇÒªÏȽ²½² Nebula Graph µÄÐèÇó£ºÊ×ҪĿ±ê±È½ÏÃ÷È·¾ÍÊÇ×Ô¶¯»¯²âÊÔ¡£

×÷ΪÊý¾Ý¿â²úÆ·£¬²âÊÔÔõôǿµ÷Ò²²»Îª¹ý¡£Nebula Graph µÄ²âÊÔÖ÷Òª·Öµ¥Ôª²âÊԺͼ¯³É²âÊÔ¡£Óà GitHub Action ÆäʵÖ÷ÒªÃé×¼µÄÊǵ¥Ôª²âÊÔ£¬È»ºóÔÙ¸ø¼¯³É²âÊÔ×öЩ׼±¸£¬±ÈÈç docker ¾µÏñ¹¹½¨ºÍ°²×°³ÌÐò´ò°ü¡£Ë³´øÔÙ½â¾öһϠPM С½ã½ãµÄ·¢²¼ÐèÇ󣬾ÍÕû¸ö¹¹½¨ÆðÀ´Á˵ÚÒ»°æµÄ CI/CD Á÷³Ì¡£

2. PR ²âÊÔ

Nebula Graph ×÷ΪÍйÜÔÚ GitHub ÉϵĿªÔ´ÏîÄ¿£¬Ê×ÏÈÒª½â¾öµÄ²âÊÔÎÊÌâ¾ÍÊǵ±¹±Ï×ÕßÌá½»ÁË PR ÇëÇóºó£¬ÈçºÎ²ÅÄÜ¿ìËٵؽøÐбä¸üÑéÖ¤£¿Ö÷ÒªÓÐÒÔϼ¸¸ö·½Ãæ¡£

  • ·û²»·ûºÏ±àÂë¹æ·¶£»
  • Äܲ»ÄÜÔÚ²»Í¬ÏµÍ³É϶¼±àÒëͨ¹ý£»
  • µ¥²âÓÐûÓÐʧ°Ü£»
  • ´úÂ븲¸ÇÂÊÓÐûÓÐϽµµÈ¡£

Ö»ÓÐÉÏÊöµÄÒªÇóÈ«²¿Âú×ã²¢ÇÒÓÐÖÁÉÙÁ½Î» reviewer µÄͬÒ⣬±ä¸ü²ÅÄܽøÈëÖ÷¸É·ÖÖ§¡£

½èÖúÓÚ cpplint »òÕß clang-format µÈ¿ªÔ´¹¤¾ß¿ÉÒԱȽϼòµ¥µØʵÏÖÒªÇó 1£¬Èç¹û´ËÒªÇóδͨ¹ýÑéÖ¤£¬ºóÃæµÄ²½Öè¾Í×Ô¶¯Ìø¹ý£¬²»ÔÙ¼ÌÐøÖ´ÐС£

¶ÔÓÚÒªÇó 2£¬ÎÒÃÇÏ£ÍûÄÜͬʱÔÚÄ¿Ç°Ö§³ÖµÄ¼¸¸öϵͳÉÏÔËÐÐ Nebula Ô´ÂëµÄ±àÒëÑéÖ¤¡£ÄÇôÏñ֮ǰÔÚÎïÀí»úÉÏÖ±½Ó¹¹½¨µÄ·½Ê½¾Í²»ÔÙ¿ÉÈ¡£¬±Ï¾¹Ò»Ì¨ÎïÀí»úµÄ¼Û¸ñÒѾ­¸ß°º£¬ºÎ¿öһ̨»¹²»×ã¹»¡£ÎªÁ˱£Ö¤±àÒë»·¾³µÄÒ»ÖÂÐÔ£¬»¹Òª¾¡¿ÉÄܵļõÉÙ»úÆ÷µÄÐÔÄÜËðʧ£¬×îÖÕ²ÉÓÃÁË docker µÄÈÝÆ÷»¯¹¹½¨·½Ê½¡£ÔÙ½èÖú Action µÄ matrix ÔËÐвßÂÔ ºÍ¶Ô docker µÄÖ§³Ö£¬»¹Ëã˳ÀûµØ½«Õû¸öÁ÷³Ì×ßͨ¡£

ÔËÐеĴó¸ÅÁ÷³ÌÈçÉÏͼËùʾ£¬ÔÚ vesoft-inc/nebula-dev-docker ÏîÄ¿ÖÐά»¤ nebula ±àÒë»·¾³µÄ docker ¾µÏñ£¬µ±±àÒëÆ÷»òÕß thirdparty ÒÀÀµÉý¼¶±ä¸üʱ£¬×Ô¶¯´¥·¢ docker hub µÄ Build ÈÎÎñ£¨¼ûÏÂͼ£©¡£µ±Ð嵀 Pull Request Ìá½»ÒÔºó£¬Action ±ã»á±»´¥·¢¿ªÊ¼À­È¡×îеıàÒë»·¾³¾µÏñ£¬Ö´ÐбàÒë¡£

Õë¶Ô PR µÄ workflow ÍêÕûÃèÊö¼ûÎļþ pull_request.yaml¡£Í¬Ê±£¬¿¼Âǵ½²¢²»ÊÇÿ¸öÈËÌá½»µÄ PR ¶¼ÐèÒªÁ¢¼´ÔËÐÐ CI ²âÊÔ£¬ÇÒ×Ô½¨µÄ»úÆ÷×ÊÔ´ÓÐÏÞ£¬¶Ô CI µÄ´¥·¢×öÁËÈçÏÂÏÞÖÆ£º

  1. Ö»ÓÐ lint УÑéͨ¹ýµÄ PR ²Å»á½«ºóÐøµÄ job Ï·¢µ½×Ô½¨µÄ runner£¬lint µÄÈÎÎñ±È½ÏÇáÁ¿£¬¿ÉÒÔʹÓà GitHub Action ÍйܵĻúÆ÷À´Ö´ÐУ¬ÎÞÐèÕ¼ÓÃÏßϵÄ×ÊÔ´¡£
  2. Ö»ÓÐÌí¼ÓÁË ready-for-testing ?label µÄ PR ²Å»á´¥·¢ action µÄÖ´ÐУ¬¶ø label µÄÌí¼ÓÓÐȨÏ޵ĿØÖÆ¡£½øÒ»²½ÓÅ»¯ runner ±»ËæÒâ´¥·¢µÄÇé¿ö¡£¶Ô label µÄÏÞÖÆÈçÏÂËùʾ£º
´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
jobs:???lint:?????name:?cpplint?????if:?contains(join(toJson(github.event.pull_request.labels.*.name)),?'ready-for-testing')?

ÔÚ PR ÖÐÖ´ÐÐÍê³ÉºóµÄЧ¹ûÈçÏÂËùʾ£º

Code Coverage µÄ˵Ã÷¼û²©ÎÄ£ºÍ¼Êý¾Ý¿â Nebula Graph µÄ´úÂë±ä¸ü²âÊÔ¸²¸ÇÂÊʵ¼ù¡£

https://nebula-graph.io/cn/posts/integrate-codecov-test-coverage-with-nebula-graph/

3. Nightly ¹¹½¨

ÔÚ Nebula Graph µÄ¼¯³É²âÊÔ¿ò¼ÜÖУ¬Ï£ÍûÄܹ»ÔÚÿÌìÍíÉÏ¶Ô codebase ÖеĴúÂëÈ«Á¿ÅÜÒ»±éËùÓеIJâÊÔÓÃÀý¡£Í¬Ê±ÓÐЩеÄÌØÐÔ£¬ÓÐʱҲϣÍûÄÜ¿ìËٵشò°ü½»¸øÓû§ÌåÑéʹÓá£Õâ¾ÍÐèÒª CI ϵͳÄÜÔÚÿÌì¸ø³öµ±ÈÕ´úÂëµÄ docker ¾µÏñºÍ rpm/deb °²×°°ü¡£

GitHub Action ±»´¥·¢µÄʼþÀàÐͳýÁË pull_request£¬»¹¿ÉÒÔÖ´ÐÐ schedule ÀàÐÍ¡£schedule ÀàÐ͵Äʼþ¿ÉÒÔÏñ crontab Ò»Ñù£¬ÈÃÓû§Ö¸¶¨ÈκÎÖظ´ÈÎÎñµÄ´¥·¢Ê±¼ä£¬±ÈÈçÿÌìÁ賿Á½µãÖ´ÐÐÈÎÎñÈçÏÂËùʾ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
on:???schedule:?????-?cron:?'0?18?*?*?*'?

ÒòΪ GitHub ²ÉÓõÄÊÇ UTC ʱ¼ä£¬ËùÒÔ¶«°ËÇøµÄÁ賿 2 µã£¬¾Í¶ÔÓ¦µ½ UTC µÄÇ°ÈÕ 18 ʱ¡£

docker

ÿÈÕ¹¹½¨µÄ docker ¾µÏñÐèÒª push µ½ docker hub ÉÏ£¬²¢´òÉÏ nightly µÄ±êÇ©£¬¼¯³É²âÊ﵀ k8s ¼¯Èº£¬½« image µÄÀ­È¡²ßÂÔÉèÖÃΪ Always£¬Ã¿ÈÕ´¥·¢±ãÄܹö¶¯Éý¼¶µ½µ±ÈÕ×îнøÐвâÊÔ¡£ÒòΪµ±ÈÕµÄÎÊÌâÄ¿Ç°¶¼»á¾¡Á¿µ±ÈÕ½â¾ö£¬±ãûÓÐÔÙ¸ø nightly µÄ¾µÏñÔÙ¶îÍâ´òÒ»¸öÈÕÆÚµÄ tag¡£¶ÔÓ¦µÄ action ²¿·ÖÈçÏÂËùʾ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
-?name:?Build?image????????env:??????????IMAGE_NAME:?${{?secrets.DOCKER_USERNAME?}}/nebula-${{?matrix.service?}}:nightly????????run:?|??????????docker?build?-t?${IMAGE_NAME}?-f?docker/Dockerfile.${{?matrix.service?}}?.??????????docker?push?${IMAGE_NAME}????????shell:?bash?

package

GitHub Action ÌṩÁË artifacts µÄ¹¦ÄÜ£¬¿ÉÒÔÈÃÓû§³Ö¾Ã»¯ workflow ÔËÐйý³ÌÖеÄÊý¾Ý£¬ÕâЩÊý¾Ý¿ÉÒÔ±£Áô 90 Ìì¡£¶ÔÓÚ nightly °æ±¾°²×°°üµÄ´æ´¢¶øÑÔ£¬ÒѾ­´Â´ÂÓÐÓà¡£ÀûÓùٷ½ÌṩµÄ actions/upload-artifact@v1 ?action£¬¿ÉÒÔ·½±ãµÄ½«Ö¸¶¨Ä¿Â¼ÏµÄÎļþÉÏ´«µ½ artifacts¡£×îºó nightly °æ±¾µÄ nebula µÄ°²×°°üÈçÏÂͼËùʾ¡£

ÉÏÊöÍêÕûµÄ workflow Îļþ¼û package.yaml

https://github.com/vesoft-inc/nebula/blob/master/.github/workflows/package.yaml

4. ·ÖÖ§·¢²¼

ΪÁ˸üºÃµØά»¤Ã¿¸ö·¢²¼µÄ°æ±¾ºÍ½øÐÐ bugfix£¬Nebula Graph ²ÉÓ÷ÖÖ§·¢²¼µÄ·½Ê½¡£¼´Ã¿´Î·¢²¼Ö®Ç°½øÐÐ code freeze£¬²¢´´½¨Ð嵀 release ·ÖÖ§£¬ÔÚ release ·ÖÖ§ÉÏÖ»½ÓÊÜ bugfix£¬¶ø²»½øÐÐ feature µÄ¿ª·¢¡£bugfix »¹ÊÇ»áÔÚ¿ª·¢·ÖÖ§ÉÏÌá½»£¬×îºó cherrypick µ½ release ·ÖÖ§¡£

ÔÚÿ´Î release ʱ£¬³ýÁË source Í⣬ÎÒÃÇÏ£ÍûÄÜ°Ñ°²×°°üÒ²×·¼Óµ½ assets Öз½±ãÓû§Ö±½ÓÏÂÔØ¡£Èç¹ûÿ´Î¶¼ÊÖ¹¤ÉÏ´«£¬¼ÈÈÝÒ׳ö´í£¬Ò²·Ç³£ºÄʱ¡£Õâ¾Í±È½ÏÊÊºÏ Action À´×Ô¶¯»¯Õâ¿éµÄ¹¤×÷£¬¶øÇÒ£¬´ò°üºÍÉÏ´«¶¼×ß GitHub ÄÚ²¿ÍøÂ磬Ëٶȸü¿ì¡£

ÔÚ°²×°°ü±àÒëºÃºó£¬Í¨¹ý curl ÃüÁîÖ±½Óµ÷Óà GitHub µÄ API£¬¾ÍÄÜÉÏ´«µ½ assets ÖУ¬¾ßÌå½Å±¾ ÄÚÈÝÈçÏÂËùʾ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
curl?--silent?\??????--request?POST?\??????--url?"$upload_url?name=$filename"?\??????--header?"authorization:?Bearer?$github_token"?\??????--header?"content-type:?$content_type"?\??????--data-binary?@"$filepath"?

ͬʱ£¬ÎªÁË°²È«Æð¼û£¬ÔÚÿ´ÎµÄ°²×°°ü·¢²¼Ê±£¬Ï£Íû¿ÉÒÔ¼ÆËã°²×°°üµÄ checksum Öµ£¬²¢½«ÆäһͬÉÏ´«µ½ assets ÖУ¬ÒÔ±ãÓû§ÏÂÔغó½øÐÐÍêÕûÐÔУÑé¡£¾ßÌå²½ÖèÈçÏÂËùʾ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
jobs:???package:?????name:?package?and?upload?release?assets?????runs-on:?ubuntu-latest?????strategy:???????matrix:?????????os:???????????-?ubuntu1604???????????-?ubuntu1804???????????-?centos6???????????-?centos7?????container:???????image:?vesoft/nebula-dev:${{?matrix.os?}}?????steps:???????-?uses:?actions/checkout@v1???????-?name:?package?????????run:?./package/package.sh???????-?name:?vars?????????id:?vars?????????env:???????????CPACK_OUTPUT_DIR:?build/cpack_output???????????SHA_EXT:?sha256sum.txt?????????run:?|???????????tag=$(echo?${{?github.ref?}}?|?rev?|?cut?-d/?-f1?|?rev)???????????cd?$CPACK_OUTPUT_DIR???????????filename=$(find?.?-type?f?\(?-iname?\*.deb?-o?-iname?\*.rpm?\)?-exec?basename?{}?\;)???????????sha256sum?$filename?>?$filename.$SHA_EXT???????????echo?"::set-output?name=tag::$tag"???????????echo?"::set-output?name=filepath::$CPACK_OUTPUT_DIR/$filename"???????????echo?"::set-output?name=shafilepath::$CPACK_OUTPUT_DIR/$filename.$SHA_EXT"?????????shell:?bash???????-?name:?upload?release?asset?????????run:?|???????????./ci/scripts/upload-github-release-asset.sh?github_token=${{?secrets.GITHUB_TOKEN?}}?repo=${{?github.repository?}}?tag=${{?steps.vars.outputs.tag?}}?filepath=${{?steps.vars.outputs.filepath?}}???????????./ci/scripts/upload-github-release-asset.sh?github_token=${{?secrets.GITHUB_TOKEN?}}?repo=${{?github.repository?}}?tag=${{?steps.vars.outputs.tag?}}?filepath=${{?steps.vars.outputs.shafilepath?}}?

ÉÏÊöÍêÕûµÄ workflow Îļþ¼û release.yaml¡£

https://github.com/vesoft-inc/nebula/blob/master/.github/workflows/release.yaml

5. ÃüÁî

GitHub Action Ϊ workflow ÌṩÁËһЩ ÃüÁî ·½±ãÔÚ shell ÖнøÐе÷Óã¬À´¸ü¾«Ï¸µØ¿ØÖƺ͵÷ÊÔÿ¸ö²½ÖèµÄÖ´ÐС£³£ÓõÄÃüÁîÈçÏ£º

set-output

ÓÐʱÔÚ job µÄ steps Ö®¼äÐèÒª´«µÝһЩ½á¹û£¬Õâʱ¾Í¿ÉÒÔͨ¹ý echo "::set-output name=output_name::output_value" µÄÃüÁîÐÎʽ½«ÏëÒªÊä³öµÄ output_value ÖµÉèÖõ½ output_name ±äÁ¿ÖС£

ÔÚ½ÓÏÂÀ´µÄ step ÖУ¬¿ÉÒÔͨ¹ý $?{{steps.step_id.outputs.output_name}}?µÄ·½Ê½ÒýÓÃÉÏÊöµÄÊä³öÖµ¡£

ÉϽÚÖÐÉÏ´« asset µÄ job ÖоÍʹÓÃÁËÉÏÊöµÄ·½Ê½À´´«µÝÎļþÃû³Æ¡£Ò»¸ö²½Öè¿ÉÒÔͨ¹ý¶à´ÎÖ´ÐÐÉÏÊöÃüÁîÀ´ÉèÖöà¸öÊä³ö¡£

set-env

ͬ set-output Ò»Ñù£¬¿ÉÒÔΪºóÐøµÄ²½ÖèÉèÖû·¾³±äÁ¿¡£Óï·¨£ºecho "::set-env name={name}::{value}" ¡£

add-path

½«Ä³Â·¾¶¼ÓÈëµ½ PATH ±äÁ¿ÖУ¬ÎªºóÐø²½ÖèʹÓá£Óï·¨£ºecho "::add-path::{path}" ¡£

6. Self-Hosted Runner

³ýÁË GitHub ¹Ù·½ÍÐ¹ÜµÄ runner Ö®Í⣬Action »¹ÔÊÐíʹÓÃÏßÏÂ×Ô¼ºµÄ»úÆ÷×÷Ϊ Runner À´ÅÜ Action µÄ job¡£ÔÚ»úÆ÷ÉÏ°²×°ºÃ Action Runner Ö®ºó£¬°´ÕÕ ½Ì³Ì£¬½«Æä×¢²áµ½ÏîÄ¿ºó£¬ÔÚ workflow ÎļþÖÐͨ¹ýÅäÖà runs-on: self-hosted ¼´¿ÉʹÓá£

self-hosted µÄ»úÆ÷¿ÉÒÔ´òÉϲ»Í¬µÄ label£¬ÕâÑù±ã¿ÉÒÔͨ¹ý ²»Í¬µÄ±êÇ© À´½«ÈÎÎñ·Ö·¢µ½Ìض¨µÄ»úÆ÷ÉÏ¡£±ÈÈçÏßϵĻúÆ÷°²×°Óв»Í¬µÄ²Ù×÷ϵͳ£¬ÄÇô job ¾Í¿ÉÒÔ¸ù¾Ý runs-on µÄ label ÔÚÌض¨µÄ»úÆ÷ ÉÏÔËÐС£self-hosted Ò²ÊÇÒ»¸öÌض¨µÄ±êÇ©¡£

°²È«

GitHub ¹Ù·½ÊDz»ÍƼö¿ªÔ´ÏîĿʹÓà Self-Hosted µÄ runner µÄ£¬Ô­ÒòÊÇÈκÎÈ˶¼¿ÉÒÔͨ¹ýÌá½» PR µÄ·½Ê½£¬Èà runner µÄ»úÆ÷ÔËÐÐΣÏյĴúÂë¶ÔÆäËùÔڵĻ·¾³½øÐй¥»÷¡£

µ«ÊÇ Nebula Graph µÄ±àÒëÐèÒªµÄ´æ´¢¿Õ¼ä½Ï´ó£¬ÇÒ GitHub Ö»ÄÜÌṩ 2 ºËµÄ»·¾³À´±àÒ룬²»µÃÒÑ»¹ÊÇÑ¡ÔñÁË×Ô½¨ Runner¡£¿¼Âǵ½°²È«µÄÒòËØ£¬½øÐÐÁËÈçÏ·½ÃæµÄ°²È«¼Ó¹Ì£º

ÐéÄâ»ú²¿Êð

ËùÓÐ×¢²áµ½ GitHub Action µÄ runner ¶¼ÊDzÉÓÃÐéÄâ»ú²¿Ê𣬸úËÞÖ÷»ú×öºÃµÚÒ»²ãµÄ¸ôÀ룬Ҳ¸ü·½±ã¶Ôÿ¸öÐéÄâ»ú×ö×ÊÔ´·ÖÅ䡣һ̨¸ßÅäÖõÄËÞÖ÷»ú¿ÉÒÔ·ÖÅä¶à¸öÐéÄâ»úÈà runner À´²¢ÐеØÅÜËùÓÐÊÕµ½µÄÈÎÎñ¡£

Èç¹ûÐéÄâ»ú³öÁËÎÊÌ⣬¿ÉÒÔ·½±ãµØ½øÐл·¾³¸´Ô­µÄ²Ù×÷¡£

ÍøÂç¸ôÀë

½«ËùÓÐ runner ËùÔÚµÄÐéÄâ»ú¸ôÀëÔڰ칫ÍøÂçÖ®Í⣬ʹÆäÎÞ·¨Ö±½Ó·ÃÎʹ«Ë¾ÄÚ²¿×ÊÔ´¡£¼´±ãÓÐÈËͨ¹ý PR Ìá½»Á˶ñÒâ´úÂ룬ҲÈÃÆäÎÞ·¨·ÃÎʹ«Ë¾ÄÚ²¿ÍøÂ磬Ôì³É½øÒ»²½µÄ¹¥»÷¡£

Action Ñ¡Ôñ

¾¡Á¿Ñ¡Ôñ´ó³§ºÍ¹Ù·½·¢²¼µÄ action£¬Èç¹ûÊÇʹÓøöÈË¿ª·¢ÕßµÄ×÷Æ·£¬×îºÃÄܼìÊÓÒ»ÏÂÆä¾ßÌåʵÏÖ´úÂ룬ÃâµÃ³öÏÖÍøÉϱ¬³öÀ´µÄ й©Òþ˽ÃÜÔ¿ µÈÊÂÇé·¢Éú¡£

±ÈÈç GitHub ¹Ù·½Î¬»¤µÄ action ÁÐ±í£º

https://github.com/actions

˽ԿУÑé

GitHub Action »á×Ô¶¯Ð£Ñé PR ÖÐÊÇ·ñʹÓÃÁËһЩ˽Կ£¬³ýÈ´ GITHUB_TOKEN Ö®ÍâµÄÆäËû˽Կ£¨Í¨¹ý $ {{secrets.MY_TOKENS}} ÐÎʽÒýÓ㩾ùÊDz»¿ÉÒÔÔÚ PR ʼþ´¥·¢µÄÏà¹ØÈÎÎñÖÐʹÓã¬ÒÔ·ÀÓû§Í¨¹ý PR µÄ·½Ê½Ë½×Ô´òÓ¡Êä³öÇÔÈ¡ÃÜÔ¿¡£

»·¾³´î½¨ÓëÇåÀí

¶ÔÓÚ×Ô½¨µÄ runner£¬ÔÚ²»Í¬ÈÎÎñ£¨job£©Ö®¼ä×öÎļþ¹²ÏíÊÇ·½±ãµÄ£¬µ«ÊÇ×îºó²»ÒªÍü¼Çÿ´ÎÔÚÕû¸ö action Ö´ÐнáÊøºó£¬ÇåÀí²úÉúµÄÖмäÎļþ£¬²»È»ÕâЩÎļþÓпÉÄÜ»áÓ°Ïì½ÓÏÂÀ´µÄÈÎÎñÖ´ÐкͲ»¶ÏµØÕ¼ÓôÅÅ̿ռ䡣

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
-?name:?Cleanup????????if:?always()????????run:?rm?-rf?build?

½« step µÄÔËÐÐÌõ¼þÉèÖÃΪ always() È·±£Ã¿´ÎÈÎÎñ¶¼ÒªÖ´Ðиò½Ö裬¼´±ãÖÐ;³ö´í¡£

»ùÓÚ Docker µÄ Matrix ²¢Ðй¹½¨

ÒòΪ Nebula Graph ÐèÒªÔÚ²»Í¬µÄϵͳÉÏ×ö±àÒëÑéÖ¤£¬ÔÚ¹¹½¨·½Ê½ÉϲÉÓÃÁËÈÝÆ÷µÄ·½°¸£¬Ô­ÒòÊǹ¹½¨Ê±²»Í¬»·¾³µÄ¸ôÀë¼òµ¥·½±ã£¬GitHub Action ¿ÉÒÔÔ­ÉúÖ§³Ö»ùÓÚ docker µÄÈÎÎñ¡£

Action Ö§³Ö matrix ²ßÂÔÔËÐÐÈÎÎñµÄ·½Ê½£¬ÀàËÆÓÚ TravisCI µÄ build matrix¡£Í¨¹ýÅäÖò»Í¬ÏµÍ³ºÍ±àÒëÆ÷µÄ×éºÏ£¬ÎÒÃÇ¿ÉÒÔ·½±ãµØÉèÖÃÔÚÿ¸öϵͳÏÂʹÓà gcc ºÍ clang À´Í¬Ê±±àÒë nebula µÄÔ´Â룬ÈçÏÂËùʾ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
jobs:???build:?????name:?build?????runs-on:?ubuntu-latest?????strategy:???????fail-fast:?false???????matrix:?????????os:???????????-?centos6???????????-?centos7???????????-?ubuntu1604???????????-?ubuntu1804?????????compiler:???????????-?gcc-9.2???????????-?clang-9?????????exclude:???????????-?os:?centos7?????????????compiler:?clang-9?

ÉÏÊöµÄ strategy »áÉú³É 8 ¸ö²¢ÐеÄÈÎÎñ£¨4 os x 2 compiler£©£¬Ã¿¸öÈÎÎñ¶¼ÊÇ£¨os, compiler£©µÄÒ»¸ö×éºÏ¡£ÕâÖÖÀàËƾØÕóµÄ±í´ï·½Ê½£¬¿ÉÒÔ¼«´óµÄ¼õÉÙ²»Í¬Î³¶ÈÉϵÄÈÎÎñ×éºÏµÄ¶¨Òå¡£

Èç¹ûÏëÅųý matrix ÖеÄij¸ö×éºÏ£¬Ö»Òª½«×éºÏµÄÖµÅäÖõ½ exclude Ñ¡ÏîÏÂÃæ¼´¿É¡£Èç¹ûÏëÔÚÈÎÎñÖзÃÎÊ matrix ÖеÄÖµ£¬Ò²Ö»ÒªÍ¨¹ýÀàËÆ $ {{matrix.os}} »ñÈ¡ÉÏÏÂÎıäÁ¿ÖµµÄ·½Ê½Äõ½¡£ÕâЩ·½Ê½ÈÃÄ㶨ÖÆ×Ô¼ºµÄÈÎÎñʱ¶¼±äµÃÊ®·Ö·½±ã¡£

ÔËÐÐʱÈÝÆ÷

ÎÒÃÇ¿ÉÒÔΪÿ¸öÈÎÎñÖ¸¶¨ÔËÐÐʱµÄÒ»¸öÈÝÆ÷»·¾³£¬ÕâÑù¸ÃÈÎÎñϵÄËùÓв½Ö裨steps£©¶¼»áÔÚÈÝÆ÷µÄÄÚ²¿»·¾³ÖÐÖ´ÐС£Ïà½ÏÓÚÔÚÿ¸ö²½ÖèÖж¼Ì×Óà docker ÃüÁîÒª¼ò½àÃ÷ÁË¡£

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
container:??????image:?vesoft/nebula-dev:${{?matrix.os?}}??????env:????????CCACHE_DIR:?/tmp/ccache/${{?matrix.os?}}-${{?matrix.compiler?}}?

¶ÔÈÝÆ÷µÄÅäÖã¬ÏñÔÚ docker compose ÖÐÅäÖà service Ò»Ñù£¬¿ÉÒÔÖ¸¶¨ image/env/ports/volumes/options µÈµÈ ²ÎÊý¡£ÔÚ self-hosted µÄ runner ÖУ¬¿ÉÒÔ·½±ãµØ½«ËÞÖ÷»úÉϵÄĿ¼¹ÒÔص½ÈÝÆ÷ÖÐ×öÎļþµÄ¹²Ïí¡£

ÕýÊÇ»ùÓÚ Action ÉÏÃæµÄÈÝÆ÷ÌØÐÔ£¬²Å·½±ãµÄÔÚ docker ÄÚ×öºóÐø±àÒëµÄ»º´æ¼ÓËÙ¡£

7. ±àÒë¼ÓËÙ

Nebula Graph µÄÔ´Âë²ÉÓà C++ ±àд£¬Õû¸ö¹¹½¨¹ý³Ìʱ¼ä½Ï³¤£¬Èç¹ûÿ´Î CI ¶¼ÍêÈ«µØÖØпªÊ¼£¬»áÀË·ÑÐí¶à¼ÆËã×ÊÔ´¡£ÒòΪÿ̨ runner Åܵģ¨ÈÝÆ÷£©ÈÎÎñ²»¶¨£¬ÐèÒª¶Ôÿ¸öÔ´Îļþ¼°¶ÔÓ¦µÄ±àÒë¹ý³Ì½øÐо«×¼Åбð²ÅÄÜÈ·ÈϸÃÔ´ÎļþÊÇ·ñÕæµÄ±»Ð޸ġ£Ä¿Ç°Ê¹ÓÃ×îа汾µÄ ccache À´Íê³É»º´æµÄÈÎÎñ¡£

ËäÈ» GitHub Action ±¾ÉíÌṩ cache µÄ¹¦ÄÜ£¬ÓÉÓÚ Nebula Graph Ä¿Ç°µ¥Ôª²âÊÔµÄÓÃÀý²ÉÓþ²Ì¬Á´½Ó£¬±àÒëºóÌå»ý½Ï´ó£¬³¬³öÆä¿ÉÓõÄÅä¶î£¬ËìʹÓñ¾µØ»º´æµÄ²ßÂÔ¡£

ccache

ccache ÊǸö±àÒëÆ÷µÄ»º´æ¹¤¾ß£¬¿ÉÒÔÓÐЧµØ¼ÓËÙ±àÒëµÄ¹ý³Ì£¬Í¬Ê±Ö§³Ö gcc/clang µÈ±àÒëÆ÷¡£Nebula Graph ʹÓà C++ 14 ±ê×¼£¬µÍ°æ±¾µÄ ccache ÔÚ¼æÈÝÐÔÉÏÓÐÎÊÌ⣬ËùÒÔÔÚËùÓÐµÄ vesoft/nebula-dev ¾µÏñ Öж¼²ÉÓÃÊÖ¶¯±àÒëµÄ·½Ê½°²×°¡£

Nebula Graph ÔÚ cmake µÄÅäÖÃÖÐ×Ô¶¯Ê¶±ðÊÇ·ñ°²×°ÁË ccache£¬²¢¾ö¶¨ÊÇ·ñ¶ÔÆä´ò¿ªÆôÓá£ËùÒÔÖ»ÒªÔÚÈÝÆ÷»·¾³ÖÐ¶Ô ccache ×öЩÅäÖü´¿É£¬±ÈÈçÔÚ ?ccache.conf ?ÖÐÅäÖÃÆä×î´ó»º´æÈÝÁ¿Îª 1 G£¬³¬³öºó×Ô¶¯Ìæ»»½Ï¾É»º´æ¡£

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
max_size?=?1.0G?

ccache.conf ÅäÖÃÎļþ×îºÃ·ÅÖÃÔÚ»º´æĿ¼Ï£¬ÕâÑù ccache ¿É·½±ã¶ÁÈ¡ÆäÖÐÄÚÈÝ¡£

tmpfs

tmpfs ÊÇλÓÚÄÚ´æ»òÕß swap ·ÖÇøµÄÁÙʱÎļþϵͳ£¬¿ÉÒÔÓÐЧµØ»º½â´ÅÅÌ IO ´øÀ´µÄÑÓ³Ù£¬ÒòΪ self-hosted µÄÖ÷»úÄÚ´æ×ã¹»£¬ËùÒÔ½« ccache µÄĿ¼¹ÒÔØÀàÐ͸ÄΪ tmpfs£¬À´¼õÉÙ ccache ¶Áдʱ¼ä¡£ÔÚ docker ÖÐʹÓà tmpfs µÄ¹ÒÔØÀàÐÍ¿ÉÒԲο¼ ÏàÓ¦Îĵµ¡£ÏàÓ¦µÄÅäÖòÎÊýÈçÏ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
env:??????CCACHE_DIR:?/tmp/ccache/${{?matrix.os?}}-${{?matrix.compiler?}}????options:?--mount?type=tmpfs,destination=/tmp/ccache,tmpfs-size=1073741824?-v?/tmp/ccache/${{?matrix.os?}}-${{?matrix.compiler?}}:/tmp/ccache/${{?matrix.os?}}-${{?matrix.compiler?}}?

½«ËùÓÐ ccache ²úÉúµÄ»º´æÎļþ£¬·ÅÖõ½¹ÒÔØΪ tmpfs ÀàÐ͵ÄĿ¼Ï¡£

²¢ÐбàÒë

make ±¾Éí¼´Ö§³Ö¶à¸öÔ´ÎļþµÄ²¢ÐбàÒ룬ÔÚ±àÒëʱÅäÖà -j $(nproc) ±ã¿ÉͬʱÆô¶¯ÓëºËÊýÏàͬµÄÈÎÎñÊý¡£ÔÚ action µÄ steps ÖÐÅäÖÃÈçÏ£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
-?name:?Make???????run:?cmake?--build?build/?-j?$(nproc)?

8. ¿Ó

˵ÁËÄÇô¶àµÄÓŵ㣬ÄÇÓÐûÓв»×ãÄØ£¿Ê¹ÓÃÏÂÀ´Ö÷ÒªÌå»áµ½Èçϼ¸µã£º

Ö»Ö§³Ö½Ïа汾µÄϵͳ¡£ºÜ¶à Action ÊÇ»ùÓÚ½ÏÐ嵀 Nodejs °æ±¾¿ª·¢£¬Ã»·¨·½±ãµØÔÚÀàËÆ CentOS 6 µÈÀÏ°æ±¾ docker ÈÝÆ÷ÖÐÖ±½ÓʹÓ᣷ñÔò»á±¨ Nodejs ÒÀÀµµÄ¿âÎļþÕÒ²»µ½£¬´Ó¶øÎÞ·¨Õý³£Æô¶¯ action µÄÖ´ÐС£ÒòΪ Nebula Graph Ï£Íû¿ÉÒÔÖ§³Ö CentOS 6£¬ËùÒÔÔÚ¸ÃϵͳϵÄÈÎÎñ²»µÃ²»ÐèÒªÌØÊâ´¦Àí¡£

²»ÄÜ·½±ãµØ½øÐб¾µØÑéÖ¤¡£ËäÈ»ÉçÇøÓиö¿ªÔ´ÏîÄ¿ act£¬µ«Ê¹ÓÃÏÂÀ´»¹ÊÇÓÐÖî¶àÏÞÖÆ£¬ÓÐʱ²»µÃ²»Í¨¹ýÔÚ×Ô¼º²Ö¿âÖз´¸´Ìá½»ÑéÖ¤²ÅÄÜÈ·±£ action µÄÐÞ¸ÄÕýÈ·¡£

Ä¿Ç°»¹È±ÉٱȽϺõÄÖ¸µ¼¹æ·¶£¬µ±¶¨ÖƵÄÈÎÎñ½Ï¶àʱ£¬×ÜÓÐÖÖÔÚ YAML ÅäÖÃÖÐд³ÌÐòµÄ¸ÐÊÜ¡£Ä¿Ç°µÄ×ö·¨Ö÷ÒªÓÐÒÔÏÂÈýÖÖ£º

  1. ¸ù¾ÝÈÎÎñ²ð·ÖÅäÖÃÎļþ¡£
  2. ¶¨ÖÆרÊô action£¬Í¨¹ý GitHub µÄ SDK À´ÊµÏÖÏëÒªµÄ¹¦ÄÜ¡£
  3. ±àд´óµÄ shell ½Å±¾À´Íê³ÉÈÎÎñÄÚÈÝ£¬ÔÚÈÎÎñÖе÷Óøýű¾¡£

Ä¿Ç°Õë¶Ô¾¡Á¿¶àʹÓÃСÈÎÎñµÄ×éºÏ»¹ÊÇʹÓôóÈÎÎñµÄ·½Ê½£¬ÉçÇøҲûÓж¨ÂÛ¡£²»¹ýСÈÎÎñ×éºÏµÄ·½Ê½¿ÉÒÔ·½±ãµØ¶¨Î»ÈÎÎñʧ°ÜλÖÃÒÔ¼°È·¶¨Ã¿²½µÄÖ´ÐÐʱ¼ä¡£

Action µÄһЩÀúÊ·¼Ç¼ĿǰÎÞ·¨ÇåÀí£¬Èç¹ûÖÐ;¸ü¸ÄÁË workflows µÄÃû×Ö£¬ÄÇôÀ쵀 check runs ¼Ç¼»¹ÊÇ»áÒ»Ö±±£ÁôÔÚ Action Ò³Ã棬ӰÏìʹÓÃÌåÑé¡£

Ä¿Ç°»¹È±ÉÙÏñ GitLab CI ÖÐÊÖ¶¯´¥·¢ job/task ÔËÐеŦÄÜ¡£ÎÞ·¨ÔËÐÐÖмä½øÐÐÈ˹¤¸ÉÔ¤¡£

action µÄ¿ª·¢Ò²ÔÚ²»Í£µÄµü´úÖУ¬ÓÐʱÐèҪά»¤Ò»ÏÂаæµÄÉý¼¶£¬±ÈÈ磺checkout@v2

²»¹ý×ÜÌåÀ´Ëµ£¬GitHub Action ÊÇÒ»¸öÏà¶ÔÓÅÐãµÄ CI/CD ϵͳ£¬±Ï¾¹Õ¾ÔÚ GitLab CI/Travis CI µÈÇ°È˼ç°òÉϵIJúÆ·£¬»¹ÊÇÓкܶྭÑé¿ÉÒÔ½è¼øʹÓá£

9. ºóÐø

¶¨ÖÆ Action

Ç°¶Îʱ¼ä docker ·¢²¼ÁË×Ô¼ºµÄµÚÒ»¿î Action£¬¼ò»¯Óû§Óë docker Ïà¹ØµÄÈÎÎñ¡£ºóÐø£¬Õë¶Ô Nebula Graph µÄһЩ CI/CD µÄ¸´ÔÓÐèÇó£¬ÎÒÃÇÒà»á¶¨ÖÆһЩרÊôµÄ action À´¸ø nebula µÄËùÓÐ repo ʹÓá£Í¨Óõľͻᴴ½¨¶ÀÁ¢µÄ repo£¬·¢²¼µ½ action Êг¡À±ÈÈç×·¼Ó assets µ½ release ¹¦ÄÜ¡£×¨ÊôµÄ¾Í¿ÉÒÔ·ÅÖà repo µÄ .github/actions Ŀ¼Ï¡£

ÕâÑù¾Í¿ÉÒÔ¼ò»¯ workflows ÖÐµÄ YAML ÅäÖã¬Ö»Òª use ij¸ö¶¨ÖÆ action ¼´¿É¡£Áé»îÐÔºÍÍØÕ¹ÐÔ¶¼¸üÓÅ¡£

¸ú¶¤¶¤ /slack µÈ IM ¼¯³É

ͨ¹ý GitHub µÄ SDK ¿ÉÒÔ¿ª·¢¸´Ô action Ó¦Óã¬ÔÙ½áºÏ ¶¤¶¤/slack µÈ bot µÄ¶¨ÖÆ£¬¿ÉÒÔʵÏÖÐí¶à×Ô¶¯»¯µÄÓÐÒâ˼µÄСӦÓᣱÈÈ磬µ±Ò»¸ö PR ±» 2 ¸öÒÔÉ쵀 reviewer approve ²¢ÇÒËùÓÐµÄ check runs ¶¼Í¨¹ý£¬ÄÇô¾Í¿ÉÒÔÏò¶¤¶¤ÈºÀï·¢ÏûÏ¢²¢ @ һЩÈËÈÃÆäÈ¥ merge ¸Ã PR¡£ÃâÈ¥ÁËÿ´Î¶¼È¥ PR list ÀïÃæ check ÿ¸ö PR ״̬µÄÐÁ¿à¡£

µ±È»Î§ÈÆ GitHub µÄÖܱßͨ¹ýһЩ bot »¹¿ÉÒԱŷ¢Ðí¶àÓÐÒâ˼µÄÍæ·¨¡£

  • ·¢±íÓÚ:
  • Ô­ÎÄÁ´½Ó£ºhttp://news.51cto.com/art/202005/616393.htm
  • ÈçÓÐÇÖȨ£¬ÇëÁªÏµ cloudcommunity@tencent.com ɾ³ý¡£

ɨÂë

Ìí¼ÓÕ¾³¤ ½ø½»Á÷Ⱥ

ÁìȡרÊô 10ÔªÎÞÃż÷ȯ

˽Ïí×îР¼¼Êõ¸É»õ

ɨÂë¼ÓÈ뿪·¢ÕßÉçȺ
Áìȯ
http://www.vxiaotou.com