Overview
ã¨ã ã¹ãªã¼ã¨ã³ã¸ãã¢ãªã³ã°ã°ã«ã¼ã AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã½ããã¦ã§ã¢ã¨ã³ã¸ãã¢ããã¦ããä¸æ(po3rin) ã§ããæ¤ç´¢ã¨Goã好ãã§ãã
AIã»æ©æ¢°å¦ç¿ãã¼ã ã§ã¯éçºã®å¹çåã®ãããããã¸ã§ã¯ãã®éå½¢ãèªåçã«çæããcookiecutterã®ããã¸ã§ã¯ãtemplateãå©ç¨ãã¦ãã¾ããä¸è¨ã¯APIéçºã§å©ç¨ãã¦ããcookiecutterããã¸ã§ã¯ãtemplateã«ã¤ãã¦ã®è¨äºã§ãã
ããããtemplateããä½æããããã¸ã§ã¯ãã¯templateãæ°ãããªã£ãå ´åã«ããã®å¤æ´ã«è¿½å¾ããã®ãå°é£ã«ãªãã¾ããããã§ãä»åã¯cruftã¨ãããã¼ã«ãå°å ¥ãã¦ãææ°cookiecutter templateã¸ã®è¿½å¾ã楽ã«ã§ããããã«ãã¾ãããä»åã¯cruftã®ç´¹ä»ã¨ããããã©ã®ããã«å°å ¥ããããã話ããã¾ãã
- Overview
- cookiecutterã®èª²é¡
- cruftã¨ã¯
- æ¢åããã¸ã§ã¯ãã¸ã®cruftå°å ¥
- CIã®è¨å®
- cookiecutter templateèªä½ã¸ã®cruftå°å ¥
- ãã¼ã ã¸ã®å°å ¥
- ã¾ã¨ã
- We're hiring!
cookiecutterã®èª²é¡
cookiecutterã使ã£ãããã¸ã§ã¯ãä½æããå¾ã«ãtemplateå´ã«éè¦ãªæ´æ°ãå ¥ã£ãå ´åããã®templateããä½ã£ãããã¸ã§ã¯ãã«ãã®å¤æ´ãå ãããæãããã¾ããä¾ãã°ãã¼ã«ã®ãã¼ã¸ã§ã³ã¢ãããæ°ããã»ãã¥ãªãã£ãã§ãã¯ãCIã«å°å ¥ããå ´åãtemplateã®æ´æ°ã¯ãã¡ããããã®templateããä½ã£ãå ¨ã¦ã®ããã¸ã§ã¯ãã«ãã®å¤æ´ãå ãã¦ããå¿ è¦ãããã¾ãã
ã©ã®ããã¸ã§ã¯ãã«å¤æ´ã追å ãããã管çããã®ã¯é常ã«å°é£ã§ãå¼ãã¼ã ã§ã¯éè¦ãªå¤æ´ã®ã¨ãã¯ã¹ãã¬ããã·ã¼ãã使ã£ã¦å¤æ´ãé©ç¨ããããã¸ã§ã¯ãã«ãã§ãã¯ãå ¥ãã¦ããããã¾ã å¤æ´ãåãè¾¼ãã§ããªãããã¸ã§ã¯ãã管çãããªã©ã®æä½æ¥ãçºçãã¦ãã¾ããã
ã¾ããéè¦ã§ãªãæ¹åã®åæ ã¯ããã¸ã§ã¯ãã¾ããã«ãªã£ã¦åæ ãããªããã¨ãå¤ããããã¸ã§ã¯ããã¨ã«ãã¹ããã©ã¯ãã£ã¹ã«è¿½å¾ã§ãã¦ããªãç¶æ ã«ãªã£ã¦ãã¾ããã
ããã§cruftã®ç»å ´ã§ãã
cruftã¨ã¯
cruftã使ç¨ããã¨ãtemplateã®ææ°ç¶æ ã¸ã®è¿½å¾ããå¤æ´ã®ãã§ãã¯ãªã©ãç°¡åã«è¡ãã¾ããcookiecutter templateæ©è½ã¨å®å ¨ã«äºææ§ãããã®ã§ãcookiecutterã使ã£ã¦ãããã¼ã ã¯ããã«åãå ¥ãããã¨ãã§ãã¾ãã
ãªãã¸ããªã¯ãã¡ãã§ãã
ãã®ãã¼ã«ãå°å ¥ãããã¨ã§ãcookiecutterã§ä½ã£ãæ¢åã®ããã¸ã§ã¯ããææ°ã®templateã¸è¿½å¾ããã®ã楽ã«ãã¾ããã
æ¢åããã¸ã§ã¯ãã¸ã®cruftå°å ¥
cookiecutter templateããä½ã£ãæ¢åããã¸ã§ã¯ãã«cruftãå°å ¥ããæ¹æ³ã解説ãã¾ããã¾ãã¯ä¸è¨ãå®è¡ãã¾ãã
cruft link https://github.com/m3dev/cookiecutter-gokart
ä¸è¨ã³ãã³ãã§ãcookiecutterããããã¸ã§ã¯ããä½ãæã¨åãããã«ãtemplateã®å¤ã«ã¤ãã¦ã®è³ªåãããã®ã§ãããã¸ã§ã¯ããä½ã£ãæã¨åãå¤ãåçãã¾ããããããã¨ä¸è¨ã®ããã«cruft.json
ãä½æããã¾ãã
{ "template": "https://github.com/m3dev/cookiecutter-gokart", "commit": "25b2ea60fd1b3145908b750fc0e42e130913c7c5", "checkout": null, "context": { "cookiecutter": { "project_name": "xxx", "package_name": "xxx", // ... "_template": "https://github.com/m3dev/cookiecutter-gokart" } }, "directory": null, }
確å®ã«diffãåºã¦ãã¾ããã¡ã¤ã«ã«é¢ãã¦ã¯cruft.json
ã«skip
ãã£ã¼ã«ãã追å ã§ãã¾ãã
{ "template": "https://github.com/m3dev/cookiecutter-gokart", ... "skip": [ "xxx", ".venv", "poetry.lock", "pyproject.toml" ] }
ãã®ç¶æ
ã§ä¸è¨ãå®è¡ããã¨cruft.json
ã®commit
ãææ°ã®cookiecutterã®commitã«è¿½å¾ãã¦ãããã¨ã確èªã§ãã¾ãã
cruft check
ãããä¸è¨ã³ãã³ãã«å¤±æããå ´åã¯ãcruft.json
ã®commit
ã¨cookiecutterã®ææ°ã³ãããã¨å·®åãããã®ã§ããã®å·®åããã§ãã¯ããå¯è½ãªããã®ã¾ã¾åãè¾¼ã¿ã¾ãã
cruft update
cruft check
ã«å¤±æãã¦ããå ´åãCUIã§ã©ã®ã¢ã¯ã·ã§ã³ãè¡ãããåããã¾ããcruft.json
ã®commit
ããææ°ã®ã³ãããã¾ã§ã®å¤æ´ã確èªãããå ´åã¯[v]ãå¤æ´ãé©ç¨ãããå ´åã¯[y]ãé¸æãã¾ããé©ç¨ããããªãå ´åã¯[s]ãé¸æãã¾ããããã§ç°¡åã«cookiecutterã®ææ°ã®commitã«è¿½å¾ã§ãã¾ãã
cruft.json
ã®commit
ããææ°ã®ã³ãããã¾ã§ã®å¤æ´ã§ã¯ãªããææ°cookiecutterã¨ç¾å¨ã®ããã¸ã§ã¯ãã®å·®åã丸ã
è¦ããå ´åã¯ä¸è¨ãå®è¡ãã¾ãã
cruft diff
å¤ãæ¢åããã¸ã§ã¯ãã«å°å ¥ããå ´åã¯è¤æ°ã®diffãåºãã®ã§ãdiffåä½ã§ç¢ºèªããªããé©ç¨ãããdiffã ããé©ç¨ããä¸è¨ã®ã³ãã³ãã便å©ã§ãã
cruft diff | git apply - && git add -p
CIã®è¨å®
cruftã使ã£ã¦å¸¸ã«ææ°ã®ç¶æ
ã確èªãã¦å¿
è¦ãªdiffãåãè¾¼ãã ãããã§ãã¯ããããã«ãå¼ãã¼ã ã§ã¯cruft check
ãè¡ãCIãè¨å®ãã¾ãããå¼ç¤¾ã§ã¯GitLabãå©ç¨ãã¦ããã®ã§ãGitLabã§ã®è¨å®æ¹æ³ã主ã«èª¬æãã¾ãã
CIã§cruft check
ããããã®è¨å®ã.gitlab-ci.yml
追å ãã¾ãããã®éã«ãã¼ã¸ãªã¯ã¨ã¹ãã«ã³ã¡ã³ããæ®ãããå ´åã¯gitlab-commentã便å©ã§ãããã®ãã¼ã«ã¯å¼ç¤¾SREã®yuyabanãããéçºãã¦ãã¾ãã
## `GITLAB_ACCESS_TOKEN`ãç¨æãã¦ããã cruft_check: stage: test image: <<ä½ãããç´ æµãªpython image>> before_script: # Gitã®ã»ããã¢ãããªã©... # ... - pip install --upgrade pip - pip install cruft - wget -q https://github.com/yuyaban/gitlab-comment/releases/download/v0.2.3/gitlab-comment_0.2.3_linux_amd64.tar.gz - tar -zxvf gitlab-comment_0.2.3_linux_amd64.tar.gz - chmod +x gitlab-comment - mv gitlab-comment /usr/bin/gitlab-comment - rm gitlab-comment_0.2.3_linux_amd64.tar.gz script: - | export GITLAB_ACCESS_TOKEN=$CRUFT_GITLAB_TOKEN cruft check || exit_code=$? if [ $exit_code -ne 0 ]; then export GITLAB_ACCESS_TOKEN=$CRUFT_GITLAB_TOKEN gitlab-comment post -k cruft_check -u 'Comment.HasMeta && Comment.Meta.TemplateKey == "cruft_check"' --var target:"${CI_JOB_NAME}" exit 1 fi
ããã§Gitã®ã»ããã¢ããããã¦ãã¾ãããããã¯cruftãå é¨ã§cookiecutter templateãcloneãã¦diffã確èªããããã§ããcookiecutter templateããã©ã¤ãã¼ããªãã¸ããªã«ããå ´åã¯ã¢ã¯ã»ã¹ã§ããããã«ãã¦ããã¾ãããã
ãã®CIã®è¨å®ã¯æ¢åããã¸ã§ã¯ãã«ããã«å°å ¥ã§ããããã«ãtemplateåãã¦ãã¼ã å ã§å©ç¨ã§ããããã«ãã¦ããã¾ãã詳ããã¯GitLab CIã®templateåºç¤ãæ§ç¯ããéã«æ¸ããä¸è¨ã®ããã°ãã覧ãã ããã
ããã¦ãcheckçµæãMRã®ã³ã¡ã³ãæ¬ã«éç¥ããããã«ãgitlab-comment.yamlã追å ãã¾ã
ããã§gitlab-comment
ãã©ã®ã³ã¡ã³ããæ´æ°ããã°è¯ãããå¤å¥ã§ãã¾ãã
--- post: default: | hello gitlab-comment ! cruft_check: # update: 'Comment.HasMeta && Comment.Meta.TemplateKey == "cruft_check"' template: | ææ°ã®cookiecutterã«è¿½å¾ã§ãã¦ãã¾ããããã¼ã«ã«ã§ ```cruft update``` ãå®è¡ãã¦ãææ°ã®cookiecutterã«è¿½å¾ãã¾ãããã https://*****(ããã¥ã¡ã³ãã¸ã®ãªã³ã¯ãªã©)
ããã§CIã§cruft check
ããã¦ãããææ°çã«è¿½å¾ãã¦ããªãå ´åã¯ãã¼ã¸ãªã¯ã¨ã¹ãã«ã³ã¡ã³ããæ®ãã¾ããcruftã®éç¨ããã¥ã¡ã³ããªã©ã¸ã®ãªã³ã¯ãç½®ãã¦ããã¨ä¾¿å©ã§ãã
å¼ãã¼ã ã®éç¨ã§ã¯ãã¡ã¤ã³ã®ãã¸ãã¯ãããã«ã¦ã§ã¢ãããã¸ã§ã¯ããã¨ã«éãã®ã§ãå
¨ã¦ã®ããã¸ã§ã¯ãã«ç¢ºå®ã«å·®åãåºã¦ãã¾ãã¾ããããããã¨æ¯åãã¼ã¸ãªã¯ã¨ã¹ãã®ãã³ã«ã³ã¡ã³ããæ稿ããã¦ãã¾ãã¾ãããã®ããä»åã¯CIã«cruft diff
ã®çµæãã¢ãããã¼ãããéç¨ã¯è¦éãã¾ããã
cookiecutter templateèªä½ã¸ã®cruftå°å ¥
cookiecutter templateã«ã¯ä¸è¨ã§èª¬æããCIã®è¨å®ãç½®ãã¦ããã ãã§OKã§ãã
ããã«çºå±ã®éç¨ã¨ãã¦ãtemplateã§cruft.jsonã®å
±éè¨å®ãç½®ãã¦ããããå ´åãªã©ã®å¯¾å¿ãç´¹ä»ãã¾ããä¾ãã°cruft.json
ã®skip
ãã£ã¼ã«ããtemplateã«è¨å®ã¨ãã¦ç½®ãã¦ããããå ´åãªã©ãæãããã¾ãã
ããã§ãtemplateã«cruft.json
ãäºåã«è¿½å ãã¦ãããªã©ã®å¯¾å¿ãã§ãã¾ããããããããã§cruft.json
ã«è¨å®ããcommit
ãã£ã¼ã«ãã¯ã©ãã©ãå¤ããªã£ã¦ããã¾ãããã®å¯¾å¿ã¨ãã¦cookiecutterããããã¸ã§ã¯ããä½æãã段éã§ææ°ã®ã³ãããã«ããããã«Post-Generate Hooksãè¨å®ã§ãã¾ãã
Pre/Post-Generate Hooksæ©è½ã«é¢ããããã¥ã¡ã³ãã¯ãã¡ã
ããã¸ã§ã¯ãä½ææã«cruft update
ãèµ°ãããã«ããã³ã¼ãä¾ã¯ä¸è¨ã«ãªãã¾ããcruft update
ã³ãã³ãã«-s
ãªãã·ã§ã³ãã¤ãããã¨ã§ãã³ãããIDã®æ´æ°ã ããè¡ã£ã¦ããã¾ãã
import subprocess from pathlib import Path import shutil # setup cruft subprocess.check_call(['poetry', 'run', 'cruft', 'update', '-s'])
ãããããã¥ã¡ã³ãã®éãhooks
ãã£ã¬ã¯ããªã«å
¥ãã¦ããã°cookiecutterããã®ããã¸ã§ã¯ãä½ææã«æ°ããã³ãããIDã«æ¸ãæãã¦ããã¾ããå¼ç¤¾ã§ã¯skip
ãããã£ã¬ã¯ããªããã¡ã¤ã«ãããã¸ã§ã¯ããã¨ã«ããªãå¤ããã®ã§ãä¸æ¦ã¯cruft.json
ãtemplateã«ç½®ãã¦ããã®ã§ã¯ãªããcruft create
ã³ãã³ãã§ã§ããcruft.json
ã«ããã¸ã§ã¯ããã¨ã«æåã§skip
ãªã©ã®è¨å®ã追å ããéç¨ãåã£ã¦ãã¾ãã
ãã¼ã ã¸ã®å°å ¥
cruftããã¼ã ã¸å°å ¥ããéã®éå£ã¯cookiecutterã§ä½ã£ãæ¢åã®å ¨ã¦ã®ããã¸ã§ã¯ãã«å°å ¥ããå¿ è¦ããããã¨ã§ãããããããã¨èªååãããã¨ã¯é£ãããã(ä½ãç´ æµãªã¢ã¤ãã¢ãããã°æãã¦ã»ãã)ããã¼ã ã®ã¿ããªã«ååãã¦ãããå¿ è¦ãããã¾ãã
ãã®ããã«åãè¡ã£ãåãçµã¿ã¯ä¸è¨ã§ãã
- æ¢åããã¸ã§ã¯ãã¸ã®å°å ¥ã®ããã®ããã¥ã¡ã³ããæ¸ã
- åèã¨ãã¦å°å ¥äºä¾ã®ããã¸ã§ã¯ããä¸åä½ã
- ç°¡åã«CIãã»ããã¢ããã§ããããã«GitLab CI templateãç¨æ
- ãã¼ã ã§é±1ã§è¡ã£ã¦ããæè¡å ±æä¼ã§cruftãç´¹ä»ãéç¨æ¹æ³ã«ã¤ãã¦åæãåãã
ãã®ããã«å¤§éã®ããã¸ã§ã¯ãã«å¤æ´ããå ´åã¯ããã¼ã ã¡ã³ãã¼ã«ååãã¦ãããããã®éå£ãè½ã¨ãå¿ è¦ãããã¾ããä»ã¾ã§ã»ãã¥ãªãã£ãã§ãã¯ãã¼ã«ãªã©ãå°å ¥ããå ´åã«ã¯åããããªãã¨ããã¦ãã¾ããããcruftå°å ¥ãçªç ´ãã¦ãã¾ãã°æ¥½ãªã®ã§ããã°ãã¾ãããã
ã¾ã¨ã
cruftã®å°å ¥ã«ãã£ã¦ãææ°çcookiecutterã¸ã®è¿½å¾ãå¤æ´ã®ç¢ºèªãç°¡åã«è¡ãæ¹æ³ãç´¹ä»ããå®éã«ãã¼ã ã«å°å ¥ããæ¹æ³ãªã©ãç´¹ä»ãã¾ãããcookiecutterããããã¸ã§ã¯ããä½æãã¦ã¬ã³ã¬ã³éçºãããããªãã¼ã ã§ããã°æ¯éå°å ¥ãæ¤è¨ãã¦ã¿ã¦ãã ããã
We're hiring!
ã¨ã ã¹ãªã¼ã§ã¯ã¨ã³ã¸ãã¢ã®éçºä½é¨ãã´ãªã´ãªæ¹åãã仲éãåéãã¦ãã¾ããæããã¯ã¨ããæ¹ã¯ãã²ä»¥ä¸ãããå¿åãã ããï¼