ãã®è¨äºã¯ Money Forward Engineering Advent Calendar 2021 - Adventar ã®6æ¥ç®ã®è¨äºã§ãã
æ¨æ¥ã¯ TONY (id:galepilot) ããã«ããããã¼ã ã§å®è·µããKPTã®ããªã¥ã¼ã ãå¢ããã³ããã§ããã
ãµããããããªãã¨ãªããã£ã¦ãã¾ãã¨æ°æ§ã«ãªãã®ã§ã¡ããã¨ãã¼ã ã§æå³ãçè§£ããããã§å®æ½ããã®ã¯å¤§åã§ããã
CIãéãããæå³
CIãéãããæå³ã¯ãªãã§ããããã
DORA(DevOps Research and Assessment) 2021å¹´ã® Accelerate State of DevOps Report ã«ããã¨ãã¨ãªã¼ããã¼ã ã®ãªã¼ãã¿ã¤ã ã¯1æé以å ã¨ãããã¨ã ããã§ãã æ¬å½ãã¨ããæãã®çãã§ããããããã¤é »åº¦ã¯å¤ããããªã³ããã³ãã¨ãããã¨ãªã®ã§ããã1æé以å ã«ãã©ã³ã¯ã«ãã¼ã¸ãããã¨ããã¨ããããã¤åæ°ãããããã¨ã«ãªã£ã¦ãããã§ãã
ãã¦ããããã¤ããããã«ãã©ã³ã¯ã«ã³ã¼ãããã¼ã¸ããã¨ããã¨ä½ãèµ·ããã§ããããã ãã CI (Continuous Integration) ã®å®è¡ã§ãã
ä¾ãã°ä»®ã«1æ¥ã«1åãããã¤ããã¨ãã¦ããå¹´ã«240åãããã¤ãã¦ãããã¨ã«ãªãã¾ãããã®ã¨ããã©ã³ã¯ã§ã®CIã®å®è¡ã«30åããã£ãã¨ããã¨120æéãã®æéãCIãå¾ ã£ã¦ããæéã«ä½¿ããã¦ãã¾ãã¾ãããããã¤å¾ ã¡ã ãã§ãããããããããã®ã§ããããã©ã³ã¯ã«ãã¼ã¸ãã¦ãããªãã³ã¼ããåãããã¨éæ¹ããªãæéãCIå¾ ã¡ã«ä½¿ã£ã¦ãããã¨ã«ãªãã¾ãã
ããã§ã¯ãªã¼ãã¿ã¤ã ãä¸ãã£ã¦ãã¾ãã¾ãããçµæãããã¤é »åº¦ãä¸ããã¾ããã¾ãå½ç¶ä¸å ·åããã£ãã¨ãã«ä¿®æ£ãããããã¨ãã¦ãåãã ãå¾ ã¤å¿ è¦ã§ãã
ãããCIãéãããã¹ãçç±ã®ã²ã¨ã¤ã§ãã
ã¾ã1ã¨ã³ã¸ãã¢ã®ç«å ´ããã¿ã¦ããCIãå¾ ã£ã¦ããæéã¨ã¦ãç¡é§ã§ããã ãã£ã¼ãããã¯ãé ãã¨ãããã¨ã¯ããã ãéçºã®ãã³ããé ãã¨ãããã¨ã§ãã
å°ããªãããã®ã§ãããããããã¼ã£ã¨ç¶ãã¨èããã¨ã¢ããã¼ã·ã§ã³ãä½ä¸ãã¾ãããã ããã徿¥å¡ã¨ã³ã²ã¼ã¸ã¡ã³ãã®ä½ä¸ãæãã¾ãã
Four keys metric ã«ã¤ãã¦ã¯Leanã¨DevOpsã®ç§å¦ã詳ããã®ã§ãã²ã覧ãã ããã
texta.fm ã®Leanã¨DevOpsã®ç§å¦ã®åãé常ã«ããããã§ãã
æ¨æ¸¬ãããªè¨æ¸¬ãã
éãããã¨è¨ã£ã¦ãéé²ã«ä½æ¥ããã ãã§ã¯æ¥½ããã ãã§æå³ã¯ããã¾ããã ã¡ããã¨è¨æ¸¬ãã¦å¹ããããªã¨ããããæãå ¥ãã¦ããã¾ãããã
幸ããªãã¨ã« CircleCI ã«ã¯ Insights ãããã®ã§ããããçºãããããã ãã§ããã£ãããªæ å ±ãå¾ããã¾ãã éã§æ®´ãã¨éããªã£ãããããã®ã§ããããã®è¾ºã¯ãã©ã³ã¹ãªã®ã§ã¡ããã¨ã³ã¹ããçºãã¦ããã¾ãããã
鿬¡å®è¡ãããã
ãã«ããããã¨ã«ã¦ããããã¹ãã¨E2Eãã¹ããå®è¡ãã¦ã¹ãã¼ã¸ã³ã°ã«ãããã¤ãããããªã¯ã¼ã¯ããã¼ãèãã¦ã¿ã¾ãããã ããã§ããã«ããã¯ã«ãªã£ã¦ããã®ã¯E2Eã«ãããæéã®ããã§ãã
以ä¸ã®ãã㪠workflow ãããã¨ãã㨠unit_test
㨠e2e_test
ã®ã¸ã§ãã¯é次å®è¡ããã¾ãã
ãããããããã¯ç¬ç«ãã¦å®è¡å¯è½ã ã¨ããã¨ã¦ããããã¹ãã¨åæã«E2Eãã¹ããå®è¡ããæ¹ãå¹çãè¯ãããã§ãã
build_and_deploy: jobs: - build - unit_test: requires: - build - e2e_test: requires: - unit_test - deploy: requires: - e2e_test
ããã¯ãã®ããã« ãã¡ã³ã¢ã¦ã/ãã¡ã³ã¤ã³ ãããã¨ã§è§£æ±ºãã¾ãã
build_and_deploy: jobs: - build - unit_test: requires: - build - e2e_test: requires: - build - deploy: requires: - unit_test - e2e_test
ã¯ã¼ã¯ã¹ãã¼ã¹ã®ä¿åãæé©å
ãã¦ããã§E2Eãã¹ãã®å½±é¿ã§æ¥µç«¯ã«é ããªãã¨ãããã¨ããªããªã£ãããã§ãããããä»åº¦ã¯ãã«ãã®æéãæ°ã«ãªã£ã¦ãã¾ããã
ããã¤ãæ¹åãã¤ã³ããããããã§ãããå®è¡æéãçºãã¦ã¿ãã¨ã©ããã persist_to_workspace ãã¦ããã¨ãããé ããã¨ãåããã¾ããã
ããã¿ãã¨ãªãã¸ããªå ¨ä½ãä¿åãã¦ããããã§ãã
- persist_to_workspace: root: . paths: - ./
persist_to_workspace
ã¯å¯¾è±¡ã®ãã¡ã¤ã«ã®tarãã¼ã«ãä½ã£ã¦gzipãããã®ãã¢ãããã¼ããã¦ãããã attach_workspace ã§å±éãã¦ãã¾ãã
ã¤ã¾ã対象ã®ãã¡ã¤ã«ãå¢ããã°å¢ããã»ã©tarãã¼ã«ãä½ã£ã¦ã¢ãããã¼ãããã®ããããããã¦ã³ãã¼ããã¦å±éããã®ãé ããªãã¾ãã
ãã£ã¦å¿ è¦ãªãã¡ã¤ã«ã ããä¿åããããã«ãã¾ãããã
- persist_to_workspace: root: . paths: - file1 - file2
ããããæããããã§ build
ã¸ã§ãã ããããªãã¦ãä¿åããããã¡ã¤ã«ã使ã£ã¦ããå¾ç¶ã®ã¸ã§ããéããªãã¾ããã
ããã¯ãªãã¸ããªã太ãã°å¤ªãã»ã©å¹æã大ããã®ã§ãé·å¹´éçºãã¦ãããããã¯ãã«ã¯ç¹ã«ããããã§ãã
ãã§ãã¯ã¢ã¦ããéããã
CircleCiã«ã¯ checkout ã¨ããçµã¿è¾¼ã¿ã®ã¹ããããããã¾ãã
ããã使ãã¨æ°è»½ã®ãªãã¸ããªãããã¡ã¤ã«ããã§ãã¯ã¢ã¦ãåºæ¥ãã®ã§ãããå®ã¯ãã®ã¹ãããã¯ããã¾ãè³¢ããªãã¦ãªãã¸ããªãã¾ããã¨ãã§ãã¯ã¢ã¦ããã¦ãã¦ãã¾ãã®ã§ãå ã»ã©ã®è©±ã«ãã£ãã¨ãããªãã¸ããªã太ã£ã¦ããã¨ã©ãã©ãé ããªãã¾ãã
1ã¤ã®åé¿çã¨ã㦠.git/
ããã£ãã·ã¥ãã¦ããã¨ããæ¹æ³ãç´¹ä»ããã¦ããããã§ãããããã¯çµå±ãã£ãã·ã¥ã®åºãå
¥ãã«ãããæéãèããã¨ã»ã¨ãã©æå³ããªãã¨æãã¾ãã
諦ãã¦èªåã§ãã§ãã¯ã¢ã¦ãããæ¹ãéãã®ã§ä»¥ä¸ã®ãã㪠ã³ãã³ããå®ç¾© ãã¦ããã¨ã¹ããã§ãã
shallow_checkout: steps: - run: name: Checkout repository command: | git init git remote add origin ${CIRCLE_REPOSITORY_URL} GIT_SSH_COMMAND="ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" git fetch --depth=1 origin ${CIRCLE_SHA1} git checkout ${CIRCLE_SHA1}
ãããããç¨åº¦å¹´æ°ã®çµã£ã¦ãããªãã¸ããªã«ã¯åçã«å¹ãã®ã§ããããã§ã§ãã
ãµã¤ãã«ãã£ãã·ã¥ãã
ãã¨ã¯å²ã¨ãµã¤ãã®è©±ãªã®ã§ãããæ¬¡åã®å®è¡ãéããªãããã«ã¤ã³ã¹ãã¼ã«ããã©ã¤ãã©ãªãªã©ããã£ãã·ã¥ãã¾ãã
ãã£ã·ã¥ã復å ããã¨ãã«ã¯è¤æ°ãã¼ãæå®ã§ãã¦ãåæ¹ä¸è´ãã¦ãããã®ã§è¤æ°ã®ãã¼ã使ã£ã¦æ®µéçãªãã£ãã·ã¥ã«ãªãããã«ãã¦ããã®ããã¤ã³ãã§ãã
ä¾ãã° npm ã®å ´åã ã¨ä»¥ä¸ã®ããã«ããã¨ä½¿ãåæãè¯ãããã§ãã( nodenv ãªã©ã使ã£ã¦ã㦠.node-version
ãã¡ã¤ã«ãããåæ)
- save_cache: key: npm-cache-v1-{{ checksum ".node-version" }}-{{ checksum "package-lock.json" }} paths: - ~/.npm
ãã£ãã·ã¥ãæ»ãã¨ãã«ä»¥ä¸ã®ããã«ãã¼ãæå®ããã¨ãã¾ã㯠package-lock.json
ã®å
容ãåããã©ãã確èªããéã£ã¦ããã° .node-version
ã®å
容ã確èªããã
ãããéã£ãå ´å㯠npm-cache-v1-
ã¨ãããã¼ã§ãã£ãã·ã¥ãæ¢ãã®ã§ãä½ãæ´æ°ããªããã°ææ°ã®ãã£ãã·ã¥ã使ããã¦ãããã§ãªãã¦ãåã Node.js ã®ãã¼ã¸ã§ã³ã®ãã£ãã·ã¥ã使ããããªã©åºæ¥ãéãç¾ç¶ã«è¿ããã£ãã·ã¥ã鏿ã§ããã®ã§ãç¡é§ãå°ãªããªãã¾ãã
- restore_cache: keys: - npm-cache-v1-{{ checksum ".node-version" }}-{{ checksum "package-lock.json" }} - npm-cache-v1-{{ checksum ".node-version" }}- - npm-cache-v1-
ã¡ãªã¿ã« node_modules/
ã§ã¯ãªã㦠~/.npm
ããã£ãã·ã¥ãã¦ããã®ã¯ npm ci
ã使ã£ã¦åæ§ã®è§£æ±ºãã¹ããããã代ããã« node_modules/
ãæ¯åæ¶ãã¦ããããã§ãã
ããã¯åæ¹ä¸è´ãªãã£ãã·ã¥ãã¼ãæ±ãã¨ãã«ãããã¡ãªãã¹ã ãã©ã
npm-cache-v1
ã§ã¯ãªãnpm-cache-v1-
ï¼æ«å°¾ã«ãã¤ãã³ãä»ãã¦ããï¼ï¼ã«ããªãã¨ãä¾ãã°npm-cache-v10
ã«æå³ããä¸è´ãã¦ãã¾ããããªåé¡ãããã
id:r7kamura ããããææããã ãã¦ä¿®æ£ãã¾ããã
ã¤ã¡ã¼ã¸ã®æé©å
ãã®è¾ºãã¾ã§ãã£ã¦ããã¨åãã¨ãããæ¸ã£ã¦ããã®ã§ãExecutor ã¨ãã¦ä½¿ã£ã¦ããDockerã¤ã¡ã¼ã¸ã«ããã«ããã¯ãç§»åãã¦ããå¯è½æ§ãããã¾ãããã®å ´åã¯ä¸è¦ãªãã®ãå«ã¾ãªãé©åãªã¤ã¡ã¼ã¸ã鏿ããããã«ãã¦ãã ããã
ã»ã¨ãã©ã®ã±ã¼ã¹ã§ã¯ CircleCi ã® ãã«ãæ¸ Docker ã¤ã¡ã¼ã¸ ã使ãã¨ããã§ãããã
ã¡ãªã¿ã«ãã¼ã¿ãã¼ã¹ã§ã®ãã¡ã¤ã«ã¸ã®æ°¸ç¶åãå¿
è¦ãªãå ´åã¯ã¡ã¢ãªã¹ãã¬ã¼ã¸ã使ã£ã¦ããã -ram
ããªã¢ã³ãã使ãã®ãããããã§ãã
ãã¹ããåå²ãã
ãããã®æé©åã§ build
ã¸ã§ãã¯ã ãã¶éããªã£ãã¨æãã®ã§æ¬¡ã¯ãã¹ãèªä½ãããå°ãã©ãã«ããã¾ãããã
ãã¡ããæ ¹æ¬çã«ãã¹ããéãããã¨ããã®ãæã广çã ã¨ã¯æãã®ã§ããããã¹ããå®å ¨ã«æ¹åããã®ã¯ãªããªãé£ããããã®ä½æ¥ã¯å°é£ã極ããå ´åãããã§ãããã
å®å¿ãã¦ãã ãããæã ã«ã¯éã§æ®´ãã¨ããæ¹æ³ãæ®ããã¦ãã¾ããæéãéã§è²·ãã®ã§ãã
CircleCIã«ã¯ ãã¹ãã®ä¸¦åå®è¡ ãããããã®ä»çµã¿ãç¨æããã¦ããããããç¨ããã¨è¤æ°ã®ãµã¼ãã¼ã§ãã¹ããåæã«å®è¡ãããã¨ãã§ãã¾ãã
æ¹æ³ãã¨ã¦ãç°¡åã§ãã¸ã§ãã® parallelism
ãã¼ãæå®ãããã¨ã§ä¸¦åå®è¡ãããããã«ãªãã¾ãã
jobs: unit_test: parallelism: 10 steps: - ...
ããã§éè¦ãªã®ã¯ä¸¦åå®è¡ãããã¸ã§ãã®ã©ãã§ã©ã®ãã¹ããå®è¡ãããã§ãã
ãµã¤ãã«ããã¨ã¡ãã£ã¨é£ãããã§ãããCircleCIã§ã¯circleci tests
ã³ãã³ãã使ã£ã¦ãã¹ããé©åã«åå²ãããã¨ãã§ãã¾ãã
TESTFILES=$(circleci tests glob 'spec/**/*_spec.rb' | circleci tests split --split-by=timings)
ãã¨ã¯ $TESTFILES
ã«æ ¼ç´ããããã¹ããã¡ã¤ã«ãå®è¡ããã ãã§ãã
--split-by=timings
ã使ãã¨ä¸¦åå®è¡ãããããããã®ãã¹ããã ãããåããããã®æéã§å®äºããããã«åå²ãã¦ããã¾ãã
ããã«ã¯å®è¡çµæã®ãã¼ã¿ãå¿ è¦ãªã®ã§ store_test_results ã®ããã«ãã¹ãçµæãä¿åããã®ãå¿ããªãã§ãã ããã
- store_test_results: path: /path/to/test-results
ãã¨ã¯ã©ã®ãããåå²ããã¨å¹çè¯ããã¹ããåããããå®é¨ããªããè¦ã¤ãã¾ããããå½ç¶ã§ããå岿°ãå¢ããã»ã©ã®æ¶è²»ããã¯ã¬ã¸ããã®æ°ãå¢ããã®ã§ãéããããã¾ãã
æå¾ã«
å°æå ã§åºæ¥ãæãç´¹ä»ãã¦ãã¾ãããããªãã¨ããã«æ¸ããããã¨ã®å¤§åãå ¬å¼ã®ããã°ã«æ²è¼ããã¦ãã¾ãã ã¿ãªããæéãç¡é§ã«ãã¾ãããã
ã¾ãã¯ä¸æ¬¡æ å ±ãå½ããã¾ãããã¨ããæè¨ãå¾ããã¾ãããã
Money Forward Engineering Advent Calendar 2021 - Adventar ãææ¥ã¯ maya akahane ããã§ãã社ã®Slackã«ããDeepLãããã«ã¯ã¨ã¦ããä¸è©±ã«ãªã£ã¦ããã®ã§æ°ã«ãªãã¾ãã
ãã®è¨äºã¯ Cornelius ã§æ¸ãã¾ããã