æ¬ããã¥ã¡ã³ãã¯ãGRDM çµå詊éšã®æ©æ¢°åã«ã€ããŠãã¢ãŒããã¯ãã£ããã³å©ç𿹿³ã«ã€ããŠèšèŒããŠããŸãã
æ¬ã·ã¹ãã ã¯ãçŸåšã人æã§å®æœããŠãã GRDM çµå詊éšã«ãããŠãçŸè¡ã®æé æžãšåçã®å å®¹ãæ©æ¢°çã«å®æœã§ããç°å¢ãæŽåããããšãç®çãšããŠããŸãã
E2Eãã¹ãïŒPlaywrightãªã©ïŒã¯åŒ·åãªãã¹ãããŒã«ã§ãããUIã®æ§é ã«äŸåããéšåãå€ããäºæããªã圢ã§ãã¹ããå£ããããšããããŸãããã¹ãã倱æããéãã©ãã§å€±æããŠããããæ£ç¢ºã«ææ¡ããã®ãå°é£ã§ãUIã®å°ããªå€æŽã§ããã¹ãã³ãŒãã®ä¿®æ£ãå¿ èŠã«ãªãããšãå€ããä¿å®ã³ã¹ããé«ããªããã¡ã§ãã
Jupyter Notebookã䜿ãããšã§ããã®åé¡ã解決ããŸããã»ã«ããšã«å®è¡ã§ãããããStep-by-Stepã§å®è¡ããªããåé¡ç®æãç¹å®ã§ããŸããåã¹ãããã§ã¹ã¯ãªãŒã³ã·ã§ããã確èªããªããé²ãããããããèŠèŠçã«ãã¹ãã®é²è¡ç¶æ³ãææ¡ã§ããŸãããã¹ãã倱æããå Žåã§ãããã®çŽåã®ã»ã«ãŸã§ã®å®è¡çµæãæ®ã£ãŠãããããåé¡ã®åãåãã容æã§ããã€ã³ã¿ã©ã¯ãã£ããªç°å¢ã§è©Šè¡é¯èª€ããªãããã¹ãã³ãŒããä¿®æ£ã§ãããããä¿å®äœæ¥ãå¹ççã«è¡ããŸãã
ãœãããŠã§ã¢éçºã§ã¯ãæ°æ©èœãä¿®æ£ãæ£ããåäœããããšã確èªãããåãå ¥ããã¹ãããšãã³ãŒã倿Žã®åºŠã«èªåçã«å®è¡ããããç¶ç¶çãã¹ãïŒCI/CDïŒãã®äž¡æ¹ãå質ä¿èšŒã«äžå¯æ¬ ã§ããç¹ã«OSSéçºãè€æ°ãã³ãã忥ããç°å¢ã§ã¯ãç°ãªãéçºè ã«ãã倿Žãæ¢åæ©èœãç Žå£ããŠããªãããšãç¶ç¶çã«æ€èšŒããCI/CDã®ä»çµã¿ããã³ãŒãããŒã¹ã®åè³ªç¶æã«æ¥µããŠéèŠãªåœ¹å²ãæãããŸãã ãããåŸæ¥ããããã¯å¥ã ã®ããŒã«ãã³ãŒãã§å®è£ ãããããšãå€ãããã¹ãå 容ãç°ãªã圢åŒã§äºéã«ç®¡çããå¿ èŠããããŸããããã®æ©æ¢°åãããçµå詊éšã®é©æ°çãªç¹ã¯ãJupyter Notebookã§èšè¿°ããäžã€ã®ãã¹ãã³ãŒãããéçºè ãæåã§ç¢ºèªããéã«ã¯ã€ã³ã¿ã©ã¯ãã£ãã«å®è¡ã§ããåããã®ãGitHub Actionsãªã©ã®èªååç°å¢ã§ããã®ãŸãŸå®è¡ã§ããããšã§ããã€ãŸããéçºæã«åäœç¢ºèªãããã¹ããããã®ãŸãŸä»åŸèªåå®è¡ãããå質ãã§ãã¯ãšããŠæ©èœããã®ã§ãã
æ¬ã·ã¹ãã ã¯ãäž»ã«ä»¥äžã®2ã€ã®å±é¢ã§æŽ»çšãããŸãã
æ©èœéçºããã°ä¿®æ£åŸã®åäœç¢ºèªã«ãããŠãJupyter Notebookã®ã€ã³ã¿ã©ã¯ãã£ããªç¹æ§ãæå€§éã«æŽ»çšããŸããéçºè ããã¹ã¿ãŒã¯ä»¥äžã®ãããªå©ç¹ã享åã§ããŸãïŒ
- ã¹ããããã€ã¹ãããå®è¡: ã»ã«ããšã«å®è¡ããŠåé¡ç®æãå³åº§ã«ç¹å®
- èŠèŠçãªç¢ºèª: åã¹ãããã§ã¹ã¯ãªãŒã³ã·ã§ããã確èªããªããé²è¡
- å€éšã·ã¹ãã ãšã®é£æº: Googleãã°ã€ã³ãªã©ãå€éšã®ã·ã¹ãã ã«å¯Ÿããæäœãå«ããã¹ããå®çŸå¯èœ
ãã®å Žé¢ã§ã®å©ç𿹿³ã¯ çµå詊éšç°å¢ã®ã¢ãŒããã¯ã㣠ã»ã¯ã·ã§ã³ä»¥éã§è©³ãã説æããŸãã
GitHub Actionsãªã©ã®CI/CDãã€ãã©ã€ã³ã«çµã¿èŸŒã¿ãpapermillã«ããã³ãã³ãã©ã€ã³å®è¡ã掻çšããç¶ç¶çãªå質ä¿èšŒãå®çŸããŸãïŒ
- èªåå®è¡: pushãPull Requestæã«èªåçã«ãã¹ããå®è¡
- ãããåŠç: papermillã䜿çšããŠNotebookãé察話çã«å®è¡
- 䞊åå®è¡: matrixæŠç¥ã«ããè€æ°ã®ãã¹ãã°ã«ãŒãã䞊åã§å®è¡
- çµæã®å¯èŠå: å®è¡çµæãArtifactsãšããŠä¿åããåç»ãNotebookã§ç¢ºèªå¯èœ
ãã®å Žé¢ã§ã®å©ç𿹿³ã¯ CI/CD (GitHub Actions) ã»ã¯ã·ã§ã³ã§è©³ãã説æããŸãã
ãªããã€ã³ã¿ã©ã¯ãã£ããªå ¥åãå¿ èŠãšããNotebookã®äžéšã¯CIç°å¢ã§ã¯å®è¡ã§ããªãå ŽåããããŸããããã®ãããªå Žåã¯ä»¥äžã®å¯ŸçãåããŸãïŒ
- ãã©ã¡ãŒã¿åã«ããå€éšããå€ãæ³šå ¥
- æ¡ä»¶åå²ã«ããã¹ãããåŠçã®å®è£
- CIå°çšã®ä»£æ¿åŠçã®çšæïŒäŸïŒFakeCASã䜿çšããã¢ãã¯èªèšŒïŒ
ãã¹ãŠã®åãå ¥ããã¹ãããã®ãŸãŸCI/CDã«çµã¿èŸŒãããšã¯å°é£ãªå ŽåããããŸãããæ¬ã·ã¹ãã ã«ããå€ãã®è©Šéšãç¶ç¶çãã¹ãã«çµã¿èŸŒãããšãå¯èœã«ãªããŸããããã«ããïŒ
- ååž°ãã¹ãã®èªåå: æ¢åæ©èœãæ°ãã倿Žã«ãã£ãŠå£ããŠããªãããšãç¶ç¶çã«ç¢ºèª
- æ©æåé¡çºèŠ: åé¡ãéçºãµã€ã¯ã«ã®æ©ã段éã§çºèŠããä¿®æ£ã³ã¹ããåæž
- éçºå¹çã®åäž: æåãã¹ãã®å·¥æ°ãåæžããããåµé çãªäœæ¥ã«éäž
ãã®ããã«ãåãå ¥ããã¹ããšCI/CDã®äž¡é¢ããå質確ä¿ã«è²¢ç®ããGRDMã³ãŒãããŒã¹ã®å®å®æ§ãšä¿¡é Œæ§ã®åäžã«å¯äžããŸãã
ãã®ãªããžããªã§ã¯GitHub Actionsã䜿çšããŠE2Eãã¹ããèªåå®è¡ããŠããŸãããã¹ãã¯pushãpull requestæã«èªåçã«å®è¡ãããGRDMã³ãŒãããŒã¹ã®åäœãç¶ç¶çã«æ€èšŒããŸãã çŸåšã¯ãã®ãªããžããªã§ã®å®è¡ã®ã¿ã§ãããRDM-osf.ioã³ãŒãããŒã¹åŽã§ãE2Eãã¹ããå®è¡ããããšã§ãç¶ç¶çãªååž°ãã¹ãã®å®çŸãç®æããŠããŸãã
ãã€ã°ã¬ãŒã·ã§ã³ãã¹ãã¯ãGRDMã®ããŒãžã§ã³ã¢ããååŸã§ããŒã¿ãšæ©èœãæ£ããåäœããããšã確èªãããã¹ãã§ãã
- ãã€ã°ã¬ãŒã·ã§ã³å: æ§ããŒãžã§ã³ã§ãã¹ãããŒã¿ãäœæïŒäŸïŒ
åããŸãšã-Migrationå-20250906.ipynbïŒ - ãã€ã°ã¬ãŒã·ã§ã³å®è¡: ã·ã¹ãã ãæ°ããŒãžã§ã³ãžã¢ããã°ã¬ãŒã
- ãã€ã°ã¬ãŒã·ã§ã³åŸ: æ°ããŒãžã§ã³ã§ããŒã¿ã®æŽåæ§ãšæ©èœã確èªïŒäŸïŒ
åããŸãšã-MigrationåŸ-20250906.ipynbïŒ
GitHub Actionsã®ã¯ãŒã¯ãããŒã§ã¯ãmatrixèšå®ã§migration_fromãæå®ããããšã§å®è¡ãããŸãããã€ã°ã¬ãŒã·ã§ã³ãã¹ãçšã®Notebookã¯migrations/ãã£ã¬ã¯ããªã«é
眮ãããŠããŸãã
ãã€ã°ã¬ãŒã·ã§ã³ååŸã§ç¢ºèªãããåŠçã远å ããå Žåã¯ãmigrations/ãã£ã¬ã¯ããªå
ã®å¯Ÿå¿ããåããŸãšãNotebookãç·šéããå¿
èŠã«å¿ããŠæ°ãããã¹ãæé NotebookãäœæããŠãã ããã
ç°ãªãããŒãžã§ã³ããã®ãã€ã°ã¬ãŒã·ã§ã³ãã¹ãã远å ããå Žåã¯ã.github/workflows/e2e-test.ymlã®matrixèšå®ã«æ°ãããšã³ããªã远å ãã察å¿ããæ¥ä»ã®åããŸãšãNotebookïŒåããŸãšã-Migrationå-YYYYMMDD.ipynbãšåããŸãšã-MigrationåŸ-YYYYMMDD.ipynbïŒãmigrations/ãã£ã¬ã¯ããªã«äœæããŠãã ããã
ãã¹ãå®è¡åŸãçµæã¯GitHub Actionsã®Artifactsãã確èªã§ããŸãïŒ
-
test-results-failed - 倱æãããã¹ãã®Notebookã®ã¿ãå«ãã¢ãŒã«ã€ã
- ãšã©ãŒãçºçããNotebookïŒ.ipynbïŒãã¡ã€ã«
- é¢é£ãããµãNotebookãå®è¡çµæ
- åé¡ã®èª¿æ»ã«å¿ èŠãªæå°éã®ãã¡ã€ã«ã»ãã
-
test-results-full - ãã¹ãŠã®ãã¹ãçµæãå«ãå®å šãªã¢ãŒã«ã€ã
- å®è¡ããããã¹ãŠã®NotebookïŒ.ipynbïŒãã¡ã€ã«
- ã¹ã¯ãªãŒã³ãã£ããã£åç»ïŒ.webm圢åŒïŒ
- åãã¹ãã¹ãããã®å®è¡çµæãšèšŒè·¡
åãã¹ãã®å®è¡éçšã¯åç»ïŒ.webm圢åŒïŒãšããŠèšé²ãããŠããŸãïŒ
- åç»ã¯ãã©ãŠã¶ã§çŽæ¥åçå¯èœ
- ãã¹ãã®åã¹ããããã©ã®ããã«å®è¡ãããããèŠèŠçã«ç¢ºèªã§ãã
- ãšã©ãŒçºçæã®ç»é¢ç¶æ ãæ£ç¢ºã«ææ¡ã§ãã
ãã¹ãçµæã®Notebookãã¡ã€ã«ã«ã¯ä»¥äžã®æ å ±ãå«ãŸããŠããŸãïŒ
- åã»ã«ã®å®è¡çµæ
- ãšã©ãŒã¡ãã»ãŒãžãšã¹ã¿ãã¯ãã¬ãŒã¹
- å®è¡æã®ãã©ã¡ãŒã¿
- ã¹ã¯ãªãŒã³ã·ã§ããïŒãšã©ãŒçºçæïŒ
ãããã®Notebookã¯Jupyterç°å¢ã§éãããšã§ããšã©ãŒã®è©³çްã確èªããå¿ èŠã«å¿ããŠåå®è¡ããããã°ãå¯èœã§ãã
GRDMçµå詊éšã®æ©æ¢°åã«ã¯ã以äžã®ãœãããŠã§ã¢ãå©çšããŸãã
- OperationHub https://github.com/NII-cloud-operation/OperationHub
- papermill https://github.com/nteract/papermill
- Jenkins https://www.jenkins.io/
OperationHubã¯ãã€ã³ãã©éçšåãã«ã«ã¹ã¿ãã€ãºãããJupyterHubã§ãããçµå詊éšçšã«äœæãããJupyter Notebookã®éçºã»å®è¡ç°å¢ãæäŸããŸãã papermillã¯ãJupyter Notebookãããã°ã©ã ããæ©æ¢°çã«å®è¡ããããã®ã©ã€ãã©ãªã§ããå®è¡æã«ãã©ã¡ãŒã¿ãäžããããšã§Jupyter Notebookã®åäœãã«ã¹ã¿ãã€ãºããŠå®è¡ããããšãå¯èœã§ããpapermillã®ãã©ã¡ãŒã¿æ©èœãçšããããšã§ãçµå詊éšã®ã¿ãŒã²ããã«é¢ããæ¥ç¶æ å ±ããã¹ãã¬ãŒãžã«é¢ããèªèšŒæ å ±ãªã©ãå€éšããäžããããšãã§ããŸãã Jenkinsã¯ãOperationHubã«ãŠäœæãããJupyter Notebookã宿çã«å®è¡ããããã®CI/CDããŒã«ã§ãã
æ¬ã·ã¹ãã ã§ã¯ããã¹ã宿œè ã¯ä»¥äžã®ããã«ããŠçµå詊éšãè¡ãããšãã§ããŸãã
- 詊éšé ç®ã®éçºã»ä¿å®: 詊éšé ç®ãéçºã»ä¿å®ããéã¯ãOperationHubäžã§çµå詊éšçšJupyter NotebookãäœæãããJupyter Notebookã®Web UIãã詊éšçšã®ã¹ã¯ãªãã(ãã©ãŠã¶äžã«è¡šç€ºãããŠããèŠçŽ ãååŸããŠè¡šç€ºãåäœãæ€èšŒãã)ãäœæããŸããJupyter Notebookã®UIãéããŠè©Šè¡é¯èª€çã«ã¹ã¯ãªããéçºãè¡ãããšãã§ããŸããå®è¡çµæã«é¢ããŠãå¿çæ§èœãåéãããã蚌跡ãèšé²ããããšãã£ãåŠçãèšè¿°ããããšãå¯èœã§ãã
- 詊éšé ç®ã®å®è¡: 詊éšé ç®ãå®è¡ãããšã³ãžãã¢ã¯ã詊éšå®æœJupyter Notebookãå®è¡ãããpapermillã¯ãæå®ããããã©ã¡ãŒã¿ãšãšãã«Jupyter Notebookãå®è¡ããŸãã
詊éšã®å®æœãæåã»å€±æã®å€å®ãšã蚌跡ã®åéã¯Jupyter Notebookãè¡ããŸããJupyter Notebookç°å¢ã«ã¯pandas, numpyçã®ããŒã¿åŠçã©ã€ãã©ãªãã€ã³ã¹ããŒã«ãããŠããããããã¹ãçµæã®åæãå¯èŠåã容æã«è¡ããŸãã
çµå詊éšã®æ©æ¢°åã«ãããã詊éšåäœã®èšèšãè¡ããŸãããGRDMã¯äž»ã«ç ç©¶è ã«å¯ŸããŠç ç©¶ããŒã¿ã管çããããã®ã¹ãã¬ãŒãžãµãŒãã¹ãæäŸããããšãäž»çŒã§ããã詊éšé ç®ã¯ã¹ãã¬ãŒãžã«å¯ŸããããŒã¿ã®ç»é²ãèªã¿åºããšãã£ãæäœãäžå¿ãšãªããŸãããŸãããã®ããŒã¿ãæ ŒçŽããããããžã§ã¯ãã«å¯ŸããŠèª°ãã¢ã¯ã»ã¹ã§ããããšãã£ãã¢ã¯ã»ã¹ç¯å²ãå¶åŸ¡ããæ©èœãéèŠãªè©Šéšé ç®ãšãªããŸãã
ãããã£ãŠãäž»èŠãªãã¹ãã®èгç¹ã以äžã®ããã«åé¡ããŸããã
- ã¢ã¯ã»ã¹äž»äœ ... 誰ãããŒã¿ã«ã¢ã¯ã»ã¹ããããèŠå®ããŸãããããžã§ã¯ãã®ãªãŒããŒããèªã¿èŸŒã¿ã®ã¿ã®ã¡ã³ããŒãèªã¿æžãå¯èœãªã¡ã³ããŒãšèšã£ãçš®é¡ãèŠå®ããŸãã
- ã¢ã¯ã»ã¹æ¹æ³ ... ã¹ãã¬ãŒãžãµãŒãã¹ã®çš®å¥ããã®èªèšŒæ å ±ã«å ããAPIçµç±ãWeb UIçµç±ãšãã£ãã¢ã¯ã»ã¹æ¹æ³ãèŠå®ããŸãã
- æäœ ... ã¹ãã¬ãŒãžã«å¯ŸããããŒã¿ã®ç»é²ãèªã¿åºããåé€ãšãã£ãã詊éšå¯Ÿè±¡ã®æ©èœãèŠå®ããŸãã
詊éšã¯æäœã«å¯ŸããŠå®çŸ©ãããã®ãšããã¢ã¯ã»ã¹äž»äœãšã¢ã¯ã»ã¹æ¹æ³ã¯ãã©ã¡ãŒã¿ãšããŠäžããããããã«ããããšãåºæ¬æ¹éãšããŸããäŸãã°ãããªãŒããŒã«ãããã¡ã€ã«æäœãããéãªãŒããŒã«ãããã¡ã€ã«æäœããšãã£ã圢ã§åå¥ã«è©Šéšé ç®ãåããããšã¯ãããããã¡ã€ã«æäœ(ã¢ã¯ã»ã¹äž»äœ, ãã§ãã¯é ç®)ããšãã£ã圢ã§è©Šéšé ç®ããã©ã¡ãŒã¿åããŠèããããšã§ãã®çš®é¡ãæå°éã«æããä¿å®æ§ãé«ããããã§ãã
ãã©ã¡ãŒã¿åã®äŸãšããŠã¯ä»¥äžã®ããã«ãªããŸãã
- ãã¡ã€ã«ã¢ããããŒãã»ããŠã³ããŒãã®è©Šéš(ã¹ãã¬ãŒãžçš®å¥, ã¢ã¯ã»ã¹äž»äœ(ãªãŒããŒ/æžãèŸŒã¿æš©ããéãªãŒããŒ))
æäœã¯äºãã«äŸåããå ŽåããããŸããäŸãã°ãããã¡ã€ã«ã¢ããããŒãã»ããŠã³ããŒãã®è©Šéš(æšæºã¹ãã¬ãŒãž)ãã¯ç¬ç«ããŠå®è¡ããããšãã§ããŸãããAmazon S3çã®å€éšã¹ãã¬ãŒãžã«å¯Ÿãã詊éšãè¡ãå Žåã¯ãäºåã«ã¹ãã¬ãŒãžã®èªèšŒæ å ±ãç»é²ããŠããå¿ èŠããããŸããããããªãããèªèšŒæ å ±ã®èšå®æ¹æ³ã¯ã¹ãã¬ãŒãžãµãŒãã¹ã®çš®é¡ããšã«ç°ãªããããããã¯å¥ã ã®æäœãšããŠæ±ãããšãšããŸããäŸãã°ãAmazon S3ã«å¯Ÿãã詊éšã®æ§æã¯ã以äžã®2ã€ã®æäœããæ§æãããŸãã
- Amazon S3ã®èªèšŒæ
å ±ç»é²ã»åé€è©Šéš
- ãã¡ã€ã«ã¢ããããŒãã»ããŠã³ããŒã詊éš(Amazon S3)
ãã¡ã€ã«ã¢ããããŒãã»ããŠã³ããŒã詊éšã¯ãAmazon S3ã®èªèšŒæ å ±ãç»é²ãããæç¹ã§å®è¡ããå¿ èŠããããŸãããŸãããã¡ã€ã«ã¢ããããŒãã»ããŠã³ããŒã詊éšå®æœåŸã¯ãAmazon S3ã®èªèšŒæ å ±ãåé€ãã詊éšãå®è¡ããå¿ èŠããããŸãããã®ãããAmazon S3ã®èªèšŒæ å ±ç¹é²ã»åé€è©Šéšããããã¡ã€ã«ã¢ããããŒãã»ããŠã³ããŒã詊éšãåŒã³åºãããã«èšèšããŸããã©ã®è©ŠéšãåŒã³åºããã¯ãpapermillã®ãã©ã¡ãŒã¿æå®æ©èœãçšããŠãåŒã³åºãJupyter Notebookåãæå®ããããšã§å®çŸããŸããããã«ããã詊éšã®å®è¡é åºãäŸåé¢ä¿ãæè»ã«ç®¡çããããšãã§ããŸãã
äºãã«äŸåããªã詊éšé ç®ã¯ç¬ç«ããŠã䞊åã«å®è¡ã§ããããã«èšèšããŸãã䞊åå®è¡å¯èœã«ããé æ ®ãšããŠã¯ã以äžã®ãããªãã®ããããŸãã
- 詊éšã§äœ¿çšãããªãœãŒã¹ (ãããžã§ã¯ããã¹ãã¬ãŒãžç) ã詊éšããšã«æãåºã
- 詊éšçµäºåŸã«ã¯ãæãåºãããªãœãŒã¹ãè§£æŸãã
ãããžã§ã¯ããã¹ãã¬ãŒãžã詊éšããšã«å ±æããŠããŸããšã詊éšã®å®æœé åºã«ãã 詊éšçµæãå€ãã£ãŠããŸãå¯èœæ§ããããŸãã ãããã®é æ ®ã«ããã詊éšç°å¢ã®ç«¶åãé¿ãã詊éšã®ç¬ç«æ§ãä¿ã€ããšãã§ããŸãã
çµå詊éšã¯Jupyter Notebookã®èªåå®è¡ã«ããå®çŸããŸããJupyter Notebookã¯å€§ãã以äžã®2ã€ã®ã«ããŽãªã«åé¡ãããŸãã
- ãã¹ãæé Jupyter Notebook - äŸ:
ãã¹ãæé -ã¹ãã¬ãŒãžå ±é.ipynb - çµå詊éšå®è¡ã»åããŸãšã Jupyter Notebook - äŸ:
çµå詊éš-å®è¡.ipynb
ãã¹ãæé Jupyter Notebookã¯ãå®ç¹ç£èŠæã®ãã¹ãæé ãèšèŒããJupyter Notebookã§ããPlaywright https://playwright.dev/ ãçšããHeadlessãã©ãŠã¶æäœãè¡ãããã®ã³ãŒããèšèŒãããŠããŸãã ãã®Notebookã¯ãçµäºæã«åç»ãã£ããã£ãšéä¿¡å 容ãèšé²ããharãã¡ã€ã«ããšã©ãŒçµäºããå Žåã¯æåŸã®ãã£ããã£ç»åããæå®ã®ãã£ã¬ã¯ããªã«ä¿åããŸãã çµå詊éšå®è¡ã»åããŸãšã Jupyter Notebookã¯ããã¹ãæé Jupyter Notebookãå®è¡ããçµæãåããŸãšããJupyter Notebookã§ãã ãã®Notebookã¯ãã¹ãæé Notebookãå®è¡ãããã®çµæããµããªãšããŠãŸãšãã蚌跡ãšããŠãã¡ã€ã«ã«ä¿åããŸãã
æ°ããJupyter Notebookã远å ããéã«ã¯ãã¡ã€ã«åãããã¹ãæé -ãããåããŸãšã-ãããå§ããããšã§ã1.ãš2.ãã©ã¡ãã®çš®é¡ã§ããããããããã«ããŠãã ãããçµå詊éš-å®è¡.ipynbã¯ãã®ã«ãŒã«ã®äŸå€ã§ããçµå詊éš-å®è¡.ipynbã¯çµæãåéããŠãµããªã«ãŸãšããéã«ããã®ãã¡ã€ã«åã®æ§é ãå©çšããŠããŸãã
ãã¹ãæé Jupyter Notebookã¯ã以äžã®ãããªæ§æã«ãªã£ãŠããŸãã
- ãã©ã¡ãŒã¿ã®èšå®
- ãã¹ãæé ã®èšè¿°
ãã©ã¡ãŒã¿ã®èšå®ã¯ãpapermillã®èŠçŽã«åŸããparametersã¿ã°ãä»äžãããã»ã«ã«èšè¿°ããŸãã
ãã¹ãæé -äžè¬ãŠãŒã¶ãŒãã°ã€ã³ããã¡ã€ã«æäœ-å®ç¹ç£èŠçš.ipynb ã§ã¯ãå
é ã»ã«ã«ä»¥äžã®ããã«èšè¿°ãããŠããŸãã
rdm_url = 'https://rdm.nii.ac.jp/'
idp_name = 'GakuNin RDM IdP'
idp_username = None
idp_password = None
default_result_path = None
project_name = 'ãã¹ãçšãããžã§ã¯ã'
close_on_fail = Falseãããã®å€æ°ã¯æ¥ç¶å ã®URLããã°ã€ã³æ å ±ãçµæã®ä¿åå ããããžã§ã¯ãåããšã©ãŒçºçæã®æåãå¶åŸ¡ããããã®å€æ°ã§ãã äžèšã«ç€ºããããã«ããããã®å€ãã¯ç©ºã§ãããåŒã³åºãå ãšãªããã¹ãå®è¡ã»åããŸãšã Jupyter Notebookããpapermillã«ããå€ãäžæžããããŸãã
papermillããã§ã¯ãªããæäœæ¥ã§ãã¹ãæé Jupyter Notebookãäœæããå Žåã«åããŠãèšå®ã«ãã£ãŠã¯å€ã空ã®å Žåã«ãŠãŒã¶ãŒããå ¥åãæ±ããããã«ããŠããŸãã
if idp_username is None:
idp_username = input(prompt=f'Username for {idp_name}')
if idp_password is None:
idp_password = getpass(prompt=f'Password for {idp_username}@{idp_name}')
(len(idp_username), len(idp_password))äžèšã®ã³ãŒãã¯ãidp_username ããã³ idp_password ã空ã®å Žåã«ããŠãŒã¶ãŒã«å¯ŸããŠãã®å
容ã®å
¥åãæ±ããã³ãŒãã§ãã
papermillã«ããã³ãã³ãã©ã€ã³å®è¡æã«ã¯ããã®ãããªå
¥åãæ±ããã³ãŒãã¯å®è¡ããããšãã§ããŸããããã®ãããpapermillãããããã®å€æ°ã®å€ãæå®ããå¿
èŠããããŸãã
ãã¹ãæé ã®èšè¿°ã¯ãPlaywrightã®APIãçšããŠãã©ãŠã¶ã®æäœãè¡ãã³ãŒããèšè¿°ãããŸãã
ã»ã«å®è¡æã«åºåçµæã«ãã£ããã£ç»åã貌ãä»ãããããšã©ãŒçºçæã«å¿
èŠãªæ
å ±ãååŸããããã®ãŠãŒãã£ãªãã£ã¹ã¯ãªãããçšæããŠããŸãã
ãã㯠scripts/ ãã£ã¬ã¯ããªã«æ ŒçŽãããŠããŸãã
ãã®ãŠãŒãã£ãªãã£ã¹ã¯ãªãã scripts/playwright.py ã䜿ãå Žåã¯ã以äžã®ããã«åæåãè¡ããŸãã
import importlib
import pandas as pd
import scripts.playwright
importlib.reload(scripts.playwright)
from scripts.playwright import *
from scripts import grdm
await init_pw_context(close_on_fail=close_on_fail, last_path=default_result_path)ãã®ã³ãŒãã¯ãPlaywrightã®åæåãè¡ããçµæã®ä¿åå
ããšã©ãŒçºçæã®æåãèšå®ããŸãã
close_on_fail ã True ã«ãããšããšã©ãŒçºçæã«é¢é£ãããªãœãŒã¹ããã¹ãŠç Žæ£ããåç»ãã£ããã£ãharãã¡ã€ã«ã®ä¿åãè¡ããŸãã
False ã«ãããšãç»é¢ãã£ããã£ãæ®ãã ãã§ããªãœãŒã¹ã¯ç¶æããŸãã
Jupyter Notebookãäœæããå Žåã¯ã close_on_fail ã False ã«ããŠãããšããã®åŸã®æäœãç¶ç¶çã«è¡ãããšãã§ããŸãã
papermillã®èªåå®è¡æã¯ True ã«ããŠãããšããšã©ãŒçºçæã«ãªãœãŒã¹ãè§£æŸããé¢é£ããåç»ãã£ããã£ãharãã¡ã€ã«ãªã©ã®ããŒã¿ãåŒãæããããšãã§ããŸãã
default_result_path ã«ã¯ãçµæã®ä¿åå
ãæå®ããŸãã None ã®å Žåã¯ã ~/last-screenshots ã«ä¿åãããŸãã
ãã¹ãæé ã®èšè¿°ã¯ã以äžã®ãããªåœ¢åŒã§èšè¿°ããŸãã
async def _step(page):
await page.goto(rdm_url)
# åæãã ãã¯ãªãã¯
await page.locator('//button[text() = "åæãã"]').click()
# åæãã ã衚瀺ãããªããªã£ãããšã確èª
await expect(page.locator('//button[text() = "åæãã"]')).to_have_count(0, timeout=500)
await run_pw(_step)run_pw 颿°ãå©çšããããšã§ãæå®ãããæé ãå®è¡ããããšãã§ããŸãã
run_pw ã¯ãŠãŒãã£ãªãã£ã¹ã¯ãªãããæäŸãã颿°ã§ãPlaywrightã®ã³ã³ããã¹ããåæåããæå®ãããæé ãå®è¡ããŸãã
å®äºæã«ã¯ã¹ã¯ãªãŒã³ãã£ããã£ãæ»ãå€ãšããŠè¿ããããç»é¢ã®æ§åã確èªããããšãã§ããŸãã
run_pw ã«äžãã颿° _step ã¯ãPlaywrightã® page ãªããžã§ã¯ããåŒæ°ã«åãããã®äžã§ãã©ãŠã¶ã®æäœãè¡ããŸãã
ãã®é¢æ°ã®äžã§ã¯ã倧ããåããŠä»¥äžã®ãããªæäœãè¡ããŸãã
- ããŒãžã§ã®æäœ
- æäœåŸã®ç¶æ ã®ç¢ºèª
ããŒãžã§ã®æäœã¯ãPlaywrightã®APIãçšããŠè¡ããŸããäŸãã°ã page.goto ã§æå®ãããURLã«é·ç§»ãã page.locator ã§æå®ãããèŠçŽ ã«å¯Ÿã㊠click ãåŒã³åºããã¯ãªãã¯ãå®è¡ããããšãã§ããŸãã
https://playwright.dev/python/docs/pages ã«èšèŒãããŠããAPIãå©çšããããšã§ããã©ãŠã¶ã®æäœãèªååããããšãã§ããŸãã
æäœåŸã®ç¶æ
ã®ç¢ºèªã¯ã expect 颿°ãçšããŠè¡ããŸãã expect 颿°ã¯ãæå®ãããæ¡ä»¶ãæºãããããŸã§åŸ
æ©ããæ¡ä»¶ãæºããããå Žåã«æ¬¡ã®åŠçãè¡ããŸãã
https://playwright.dev/python/docs/test-assertions ã«èšèŒãããŠããAPIãå©çšããããšã§ãããŒãžäžã®èŠçŽ ã®ç¶æ
ã確èªããããšãã§ããŸãã
timeout ã§æå®ãããæéå
ã«æ¡ä»¶ãæºããããªãå Žåã¯ããšã©ãŒãšãªããŸãã
ãã¹ãæé ã®èšè¿°éšåã¯å žåçã«ã¯ä»¥äžã®ããã«ã»ã«ã䞊ã³ãŸãã
- ã¬ãã«1ã®èŠåºãã1è¡ç®ãšããMarkdownã»ã«
- ã¬ãã«2ã®èŠåºãã2è¡ç®ãšããMarkdownã»ã«
_step颿°ãå®çŸ©ãããŠãŒãã£ãªãã£run_pwã«ãã£ãŠãããå®è¡ããã»ã«- (2.ãš3.ã亀äºã«ç¹°ãè¿ã)
- çµäºåŠç
å®éã«ã¯ã1.ãã4.ãã²ãšãããŸããšããŠããããè€æ°å䞊ã¹ãŠãæ§ããŸããã
ãã®ã²ãšãããŸããStepSequenceã1.ãStepSequence HeaderãšåŒã³ãŸããåæ§
ã«ã2.ãš3.ã®ã²ãšãããŸããStepã2.ãStep HeaderãšåŒã³ãŸãã3.ã«ã¯è€æ°ã®
ã»ã«ãé
眮ããŠãæ§ããŸãããäŸãã°ãäžã§è¿°ã¹ãinit_pw_contextã«ããå
æåã»ã«ãªã©ã¯ãã®å®äŸã§ãã
StepSequence Headerã®2è¡ç®ä»¥éã«ä»¥äžã®å 容ãå«ããããšãæšå¥šãããŸãã
- ãµãã·ã¹ãã å: {}
- ããŒãž/ã¢ããªã³: {}
- æ©èœåé¡: {}
- ã·ããªãªå: {}
- çšæãããã¹ãããŒã¿: {}
ãã ãã{}ã¯ãã¬ãŒã¹ãã«ãã§ããã®StepSequenceã«æ²¿ã£ãå
容ãèšè¿°ããŠã
ã ãããèŠåºãã®å
容ãå«ãããããã¯ãã¹ãçµæããŸãšããxlsxãã¡ã€ã«ã«
åæ ãããã®ã§ãé©åã«èšè¿°ããŠããããšçµæãçè§£ãããããªããšæåŸ
ãããŸ
ãã
Step Headerã®èŠåºãã®å 容ããããŠ2è¡ç®ä»¥éã®å 容ãããã¯ãxlsxãã¡ã€ã«ã« åæ ãããã®ã§ãå¿ èŠã«å¿ããŠ2è¡ç®ä»¥éã«ãã®Stepã®èª¬æãèšè¿°ããŠãããšç è§£ãå©ããŸãã
StepSequence HeaderãStep Headerã©ã¡ãã«ã€ããŠãã1è¡ç®ã®èŠåºãè¡ã¯#ã«
ãã衚çŸãå©çšããŠèšè¿°ããŠãã ããã
1ã€ã®Stepã§2å以äžrun_pwãåŒã³åºãããšã¯æšå¥šãããŸããã圢åŒçã«ã¯èš±å®¹
ãããŸãããrun_pwãã¹ã¯ãªãŒã³ã·ã§ããã®ãã¡ããã®Stepã§æåŸã«çæãã
ããã®ããçµæãã£ã¬ã¯ããªã«ä¿åãããŸããã
æäœå¯Ÿè±¡ãšããŠèŠçŽ ãç¹å®ããå Žåã¯ãpage.locator() ãå©çšããŸããpage.locator() ã¯ãCSSã»ã¬ã¯ã¿ãXPathãçšããŠèŠçŽ ãç¹å®ããããšãã§ããŸããèŠçŽ ãç¹å®ããããã®ã»ã¬ã¯ã¿ã¯ã以äžã®ãããªèšè¿°ãè¡ãããšãæšå¥šããŸãã
- id屿§ãæå®ãã ... èŠçŽ ã«æå®ããã id屿§ã¯ãååãšããŠäžæã§ãããããGUIã®å€æŽã«åŒ·ãèšè¿°ãããããšãã§ããŸãã
- data-test屿§ãæå®ãã ... GRDMã§äœæãããGUIã®äžéšã«ã¯ãèŠçŽ ã«
data-test屿§ãä»äžããããšã§ããã¹ãã³ãŒãããèŠçŽ ãç¹å®ããããã®å±æ§ã§ããããšãæç€ºãããŠãããã®ããããŸãã - ããã¹ããæå®ãã ... ãã¿ã³ã«è¡šç€ºãããããã¹ããæå®ããããšãã§ããŸãããã®æ¹æ³ã®å Žåãå€èšèªå¯Ÿå¿ãå¿ èŠã«ãªã£ãå Žåã«ä¿®æ£ç®æãå€ããªãå¯èœæ§ããããŸãã
- è€æ°ã®èŠçŽ ã®çµã¿åããã§æå®ãã ... 察象ã®èŠçŽ ã«äžèšã®å±æ§ããªãå Žåãè€æ°ã®èŠçŽ ãçµã¿åãããŠç¹å®ããããšãã§ããŸããäŸãã°ããã©ã«ãã¢ã€ã³ã³ã«é£æ¥ããç¹å®ã®ããã¹ããæå®ããããšãã£ãæ¹æ³ãèããããŸãã
XPathãCSSã»ã¬ã¯ã¿ã®äŸã«ã€ããŠã¯ãJupyter Notebookãåèã«ããŠãã ããã æ¢åã®GUIã®å€æŽããã£ãå Žåã«ããããã®èšè¿°ã®ä¿®æ£ãå¿ èŠã«ãªãå ŽåããããŸããèŠçŽ ãèŠã€ãããªããšãã£ããšã©ãŒãçºçããå Žåã¯ãçŽåã¹ã¯ãªãŒã³ã·ã§ãããåç §ããç»é¢ãç¹å®ããäžã§ããã©ãŠã¶ã® éçºè ããŒã«ãçšããŠèŠçŽ ãç¹å®ããã»ã¬ã¯ã¿ãä¿®æ£ããå¿ èŠããããŸãã
ãªãããã©ãŠã¶ã®éçºè ããŒã«ãçšããŠç¢ºèªããããšãã§ããŸããã //*[@id="tb-tbody"]/div/div/div[11]/div[1]/span[2]/span ã®ããã«ãèŠçŽ ãéå±€ãé åºãXPathå éšã«å«ãŸããŠããŸããããGUIã®å€æŽã«è¿œåŸããŠä¿®æ£ããå¿ èŠãçãããããæšå¥šãããŸããã
GRDMã«ã¯ãäžè¬çãªGUIæäœãè¡ãããã®ãŠãŒãã£ãªãã£é¢æ°çŸ€ãçšæãããŠããŸãã scripts/grdm.py ã«å®çŸ©ãããŠããŸãã
- expect_idp_login ... IdPãžã®ãã°ã€ã³ã宿œå¯èœãªç¶æ ãšãªããŸã§åŸ ã¡ãŸããID/PWã®å ¥åãã©ãŒã ã衚瀺ããããŸã§åŸ æ©ããŸãã
- login_idp ... IdPã«ãã°ã€ã³ãããID/PWãå ¥åããŠãã°ã€ã³ããŸãã
- ensure_project_exists ... æå®ãããååã®ãããžã§ã¯ããååšããªãå Žåããããžã§ã¯ããäœæããŸãã
- delete_project ... æå®ããããããžã§ã¯ããåé€ããŸãã
- get_select_storage_title_locator, get_select_storage_title_xpath ... ãNII Storageãçãã¹ãã¬ãŒãžåã瀺ãèŠçŽ ãç¹å®ããããã®é¢æ°ã§ãã
- get_select_expanded_storage_title_locator, get_select_expanded_storage_title_xpath ... å±éãããç¶æ ã®ã¹ãã¬ãŒãžåã瀺ãèŠçŽ ãç¹å®ããããã®é¢æ°ã§ããã¹ãã¬ãŒãžã®å 容ãããŒãããããŸã§åŸ æ©ããå Žåã«å©çšããŸãã
- get_select_folder_title_locator, get_select_folder_title_xpath, get_select_folder_toggle_locator, get_select_folder_toggle_xpath ... ãã©ã«ãåã瀺ãèŠçŽ ãç¹å®ããããã®é¢æ°ã§ããtitle ã¯ããã©ã«ãåã®ããã¹ããtoggle ã¯ããã©ã«ãã®å±éã»æãããã¿ã¢ã€ã³ã³ã瀺ãèŠçŽ ãç¹å®ããããã®é¢æ°ã§ãã
- get_select_file_title_locator, get_select_file_title_xpath ... ãã¡ã€ã«åã瀺ãèŠçŽ ãç¹å®ããããã®é¢æ°ã§ãã
- get_select_file_extension_locator, get_select_file_extension_xpath ... ãã¡ã€ã«ã®çš®å¥ã瀺ãã¢ã€ã³ã³èŠçŽ ã瀺ãèŠçŽ ãç¹å®ããããã®é¢æ°ã§ãã
- wait_for_uploaded ... ãã¡ã€ã«ãã¢ããããŒãããããŸã§åŸ æ©ããããã®é¢æ°ã§ãããã¡ã€ã«ã®ããã°ã¬ã¹ããŒã衚瀺ãããŠããéåŸ æ©ããŸãã
- upload_file, drop_file ... ãã¡ã€ã«ãã¢ããããŒãããããã®é¢æ°ã§ããupload_fileã¯ã¹ãã¬ãŒãžããã©ã«ãéžææã«çŸãããã¢ããããŒãããã¿ã³ã䜿ããdrop_fileã¯ãã¡ã€ã«ãç»é¢ã«ããããããŠã¢ããããŒãããŸããdrop_fileã¯ãã¡ã€ã«ãJavaScriptã«å€æããŠå®è¡ãããããæ°MBçšåºŠãŸã§ã®ãã¡ã€ã«ã«ã®ã¿å©çšå¯èœã§ãã
çµå詊éšå®è¡ã»åããŸãšã Jupyter Notebookã¯ã以äžã®ãããªæ§æã«ãªã£ãŠããŸãã
- ãã©ã¡ãŒã¿ã®èšå®
- ãã¹ãæé Jupyter Notebookã®å®è¡
- çµæã®åããŸãšã
æåã® ãã©ã¡ãŒã¿ã®èšå® ã§ã¯ã察象ãšãªãçµå詊éšã®å®è¡ã«å¿ èŠãªå€æ°ãèšå®ããŸãããã®æ å ±ã¯ãå®è¡ãããNotebookã«æž¡ãããåŒæ°ãšããŠäœ¿çšãããŸããäŸãã°ãã·ã¹ãã ã®URLããŠãŒã¶ãŒèªèšŒæ å ±ãªã©ãå«ãŸããŸãã æ¬¡ã«ã ãã¹ãæé Jupyter Notebookã®å®è¡ ã§ã¯ãpapermillã䜿çšããŠãæå®ãããã¹ãæé Jupyter Notebookããã©ã¡ãŒã¿ä»ãã§å®è¡ããŸãããã®æ®µéã§ããã¹ãçšã®NotebookãåŠçãããåã¹ãããã®çµæãçæãããŸãããã¹ãã®æ§æã«ãããå®è¡ãããNotebookãããã«å¥ã® NotebookãåŒã³åºãããšããããŸãã çµæã®åããŸãšãã§ã¯ããã¹ãã®å®è¡åŸãåŸãããçµæãåéããçµæãåããŸãšããŸãããã®åããŸãšãã«ã¯ã倱æãããã®ãããå Žåã¯ãã®ãµããªãæ§èœæ å ±ã®èŠèŠåãå«ãŸããŸãã
å šãŠã®ãã¹ãæé Jupyter Notebookã®å®è¡çµæã«ã¯ãåç»ã§ã®ã¹ã¯ãªãŒã³ãã£ããã£ãæ·»ä»ããããšã§ãç¶æ³ã®ç¢ºèªã®å©ããšããŸããåç»ã®ã·ãŒã³ããã¹ãã®ã©ã®æé ã«å¯Ÿå¿ããŠãããã®åèã«ã§ãããããå®è¡äžã®ã»ã«ã®èŠåºãæååãåå¹ãšããŠæ¿å ¥ãããŸãã
ãã®ãªããžããªãGitã§ç®¡çã»å ¬éããéã¯ãæ©å¯æ å ±ã®æµåºãé²ãããã«pre-commit hookãèšå®ããŠãã ããã
-
å¿ èŠãªããŒã«ã®ã€ã³ã¹ããŒã«
# macOSã®å Žå brew install gitleaks # pre-commitãã€ã³ã¹ããŒã« pip install pre-commit
-
pre-commit hookã®æå¹å
# ãªããžããªã®ã«ãŒããã£ã¬ã¯ããªã§å®è¡ pre-commit install -
åäœç¢ºèª
# å šãã¡ã€ã«ããã§ã㯠pre-commit run --all-files
pre-commit hookã¯ä»¥äžã®æ å ±ãèªåçã«æ€åºããã³ãããããããã¯ããŸãïŒ
- AWSã¢ã¯ã»ã¹ããŒãã·ãŒã¯ã¬ããããŒ
- APIããŒã¯ã³ãèªèšŒããŒã¯ã³
- ãã©ã€ããŒãããŒ
- ãã®ä»ã®æ©å¯æ å ±ãã¿ãŒã³
ãŸããNotebookãã¡ã€ã«ã®ã³ãããæã«ã¯èªåçã«äžèŠãªã¡ã¿ããŒã¿ïŒlc_server_signature.historyïŒãåé€ãããŸãã
Jupyter Notebookã®åºåã»ã«ã«ã¯å®è¡æã®æ å ±ãèšé²ãããããšããããŸããå¿ èŠã«å¿ããŠã»ã«ã®åºåãæ¶å»ããŠãã ããã