ãã®è¨äºã¯ Akerun - Qiita Advent Calendar 2024 - Qiita ã® 12æ¥ç®ã®è¨äºã§ãã
ããã«ã¡ã¯ãMiwa Akerun Technologiesãéå¶ããè³è²¸ä½å® 管çã·ã¹ãã ã®éçºãã¼ã ã§ã¨ã³ã¸ãã¢ããã¦ãã島ç°ã§ãã
ãã®ãã¼ã ã§ã¯ãCIãã¼ã«ã«CircleCIãå©ç¨ãã¦ãã¾ãã
ä»åã¯CIã®è¨å®(.circleci/config.yml
)ãè¦ãªãããããã¾ã§ã®ãã¼ã ã®èª²é¡ã¨ãã®æ¹åæ´»åãæ¯ãè¿ãããã¨æãã¾ãã
åæ
CIè¨å®ã®èª¬æãããåã«ãã¢ããªã±ã¼ã·ã§ã³ã®èª¬æããããã¨æãã¾ããã¢ããªã±ã¼ã·ã§ã³ã¯SPAããå©ç¨ãããREST APIã§ãã
å©ç¨ãã¦ããæè¡ã¹ã¿ãã¯ã®æ¦è¦ã¯ä»¥ä¸ã«ãªãã¾ãã
å½åã®CIè¨å®
ç§ããã®ããã¸ã§ã¯ãã«ã¸ã§ã¤ã³ããå½æãCIãå®è¡ãã¦ããå 容ã¯ã¶ãã¯ãªã¨ä»¥ä¸ã«ãªãã¾ãã
- ã»ããã¢ãã
- Lintãå®è¡ãã
- ãã¹ãã®å®è¡ã¨ã«ãã¬ãã¸ã®ä¿åããã
- CIã失æããå ´åã¯Slackã«éç¥ããã
version: 2.1 orbs: go: circleci/[email protected] slack: circleci/[email protected] jobs: build: docker: - image: cimg/go:1.23.1-browsers environment: ... - image: cimg/mysql:8.0 ... environment: ... steps: - checkout - go/mod-download-cached ... - run: name: setup tools command: | sudo apt update -y sudo apt install -y default-mysql-client ... go install -tags 'mysql' github.com/golang-migrate/migrate/v4/cmd/[email protected] go install github.com/jstemmer/go-junit-report/[email protected] - run: name: "Setup Database" command: | mysql -h ${TEST_DATABASE_ENDPOINT} -P ${TEST_DATABASE_PORT} --protocol tcp -u ${TEST_DATABASE_USERNAME} -p${TEST_DATABASE_PASSWORD} < db/init-database.sql migrate -database="mysql://${TEST_DATABASE_USERNAME}:${TEST_DATABASE_PASSWORD}@tcp(${TEST_DATABASE_ENDPOINT}:${TEST_DATABASE_PORT})/${TEST_DATABASE_NAME}?x-tls-insecure-skip-verity=true" -path="db/migrate" up - run: golangci-lint run - run: name: create a coverage report command: | mkdir -p ./coverage go tool cover -html=./coverage/gotest.profile -o ./coverage/cover.html - store_artifacts: path: coverage - store_test_results: path: coverage ... - slack/notify: event: fail channel: XXXX workflows: build-workflow: jobs: - build: context: slack-secrets
APIããã¥ã¡ã³ã
APIã®ããã¥ã¡ã³ãã¯OpenAPI Specification(OAS)ã®ãã©ã¼ãããã§ç®¡çãã¦ãã¾ãã
APIããã¥ã¡ã³ãã®å©ç¨ç®çã¯ã
- APIå®è£ åã®è¨è¨ã¬ãã¥ã¼ã®ãã
- ä»ãã¼ã (ä»ç¤¾ãå«ã)ã¨é£æºãããéã«I/Fã説æãããã
æ¹ååã¯ãAPIããã¥ã¡ã³ããå¥ãªãªãã¸ããªã§ç®¡çããã¦ãã¾ããã
ããã¦ãã¼ã«ã«ã§ç¢ºèªããããã«ãRedocly CLIãå©ç¨ãã¦ãã¾ããã
課é¡
以ä¸ã®ãããªèª²é¡ãããã¾ããã
- ã¬ãã¥ã¼ã®è² è·ï¼æ°è¦ã§APIãå®è£ ããéã«ãè¨è¨ã®ã¿ãã¬ãã¥ã¼ãããã«ã¯åé¡ããã¾ããããããæ¢åAPIã®è»½å¾®ãªä¿®æ£ã®å ´åã«ããã¥ã¡ã³ãã¨å®è£ ãå¥ã ã«ã¬ãã¥ã¼ããã®ã¯ã¬ãã¥ã¢ã¼ã»ã¬ãã¥ã¼ã¤ã¼ã¨ãã«è² æ ãããã¾ãããã¾ãããã¥ã¡ã³ãã®ã¬ãã¥ã¼ããã¼ã¸ãå¿ãããã¨ã度ã ããã¾ããã
- ä¿å®ã®è² è·ï¼ãªãã¸ããªã管çããä¿å®ã®è² è·(Redoclyãå©ç¨ããããã®Nodeã®ãã¼ã¸ã§ã³ç®¡çãªã©)ãããã¾ããã
æ¹åæ¡
ã¾ããAPIã®ã½ã¼ã¹ã³ã¼ãã¨åä¸ãªãã¸ããªã¼ã«ããã¥ã¡ã³ãã移è¡ãã¾ããã
CIã§Redocly CLIãå®è¡ãã¦ãå®è¡çµæã®HTMLããã«ãã¢ã¼ãã£ãã¡ã¯ãã¨ãã¦ä¿åããããã«ãã¾ããã
ãã¼ã«ã«ã§ã®ç¢ºèªæã«Nodeãå¿ è¦ã¨ããªãããã«ãVSCodeã®æ¡å¼µãRedocly OpenAPIããå©ç¨ãã¦ç¢ºèªããéç¨ã«ãã¾ããã
ããã«ãã以ä¸ã®æ¹åãå®ç¾ããäºãåºæ¥ã¾ããã
- ã³ã¼ãã¬ãã¥ã¼ã®è² æ 軽æ¸
- (ããã¥ã¡ã³ãã®)ãã¼ã¸æ¼ãããªããªã
- (ããã¥ã¡ã³ã)ãªãã¸ããªã®ä¿å®ã³ã¹ãããªããªã£ã
version: 2.1 ... jobs: build: ... doc: docker: - image: cimg/node:22.11.0 steps: - checkout - run: name: install dependencies command: npm i @redocly/cli@latest - run: name: generate docs command: | npx @redocly/cli build-docs doc/api/openapi/api.yml --output api.html --config=doc/api/openapi/redocly.yml - store_artifacts: path: api.html destination: docs/api workflows: build-workflow: jobs: - build: context: slack-secrets - doc
ãã£ã¬ã¯ããªé層
doc âââ api âââ openapi â  âââ api.yml â  âââ components â  âââ paths â  âââ redocly.yml
ERå³
DDLã®å®è¡ã«ã¯ãGo製ã®golang-migrateã¨ãããã¤ã°ã¬ã¼ã·ã§ã³ãã¼ã«ãå©ç¨ãã¦ãã¾ãã
課é¡
ãã¼ãã«ã®å ¨ä½åãç¥ããã¨ãåºæ¥ãªãã¨ãã課é¡ãããã¾ããã
Ruby on Railsã§ããã°ãschema.rb ã§å ¨ã¦ã®ãã¼ãã«ã»ã¤ã³ããã¯ã¹ã確èªãããã¨ãã§ãã¾ãã
ãããç§ãã¡ã®ããã¸ã§ã¯ãã§å©ç¨ãã¦ããmigrationãã¼ã«ã§ã¯ãUpã»Downã®å·®åå®è¡ã®ã³ã¼ããããªãããå ¨ä½åã確èªããè¡ãããã¾ããã§ããã
ãã¡ãããDBã®ã¯ã©ã¤ã¢ã³ããã¼ã«ãå©ç¨ãã¦éçºç°å¢ãªã©ã¸æ¥ç¶ããã°ç¢ºèªãããã¨ã¯å¯è½ã§ãããã ãã¹ãã¼ãå¤æ´ã®DDLã¬ãã¥ã¼ä¸ãªã©ã«ã¯ã©ã¤ã¢ã³ããã¼ã«ãèµ·åããã«ãµãã¨ç¾ç¶ã®ã¹ãã¼ããå ¨ä½åã確èªåºæ¥ãããã«ãããã¨èãã¦ãã¾ããã
æ¹å
schemaspy ãå©ç¨ããããã«ãã¾ããã
schemaspyã«æ±ºããçç±ã¯ããã¼ãã«ä¸è¦§ã»è©³ç´°ãERå³ã®è¦èªæ§ãè¯ãäºã¨ãããHTMLã§çæåºæ¥ãäºã決ãã¦ã¨ãªãã¾ããã
APIããã¥ã¡ã³ãã¨åæ§ã«ãCIã§å®è¡ãã¦çæãããã¹ãã¼ãå®ç¾©ã«é¢ããHTMLããã«ãã¢ã¼ãã£ãã¡ã¯ãã¨ãã¦ä¿åããããã«ãã¾ããã
ããã«ãã£ã¦ãç°¡åã«DBã®ã¹ãã¼ãæ§é ã俯ç°çã«ç¢ºèªãããã¨ãåºæ¥ãããã«ãªãã¾ããã
version: 2.1 ... jobs: build: docker: ... steps: - checkout - go/mod-download-cached ... - run: name: schemaspy command: | curl -L https://github.com/schemaspy/schemaspy/releases/download/v6.2.4/schemaspy-6.2.4.jar \ --output ./schemaspy.jar curl -OJL https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.30/mysql-connector-java-8.0.30.jar java -jar ./schemaspy.jar \ -t mysql \ -db ${TEST_DATABASE_NAME} \ -host ${TEST_DATABASE_ENDPOINT} \ -port ${TEST_DATABASE_PORT} \ -u ${TEST_DATABASE_USERNAME} \ -p ${TEST_DATABASE_PASSWORD} \ -dp mysql-connector-java-8.0.30.jar \ -s ${TEST_DATABASE_NAME} \ -o output \ -vizjs - store_artifacts: path: output ...
ã³ã¼ãã®è¤é度
ããã¸ã§ã¯ãåæã®è¨è¨ããæéãçµéãã¦ãæ©è½ãå¢ãã¦å¾ã ã«ã³ã¼ããã¼ã¹ã大ãããªããå¤æ´ãæ¡å¼µãããã«ããç¶æ ã¨ãªã£ã¦ãã¾ããã
ãã®ããæè»ã«å¤æ´ã»æ¡å¼µãåºæ¥ãããã«ãªãã¡ã¯ã¿ãªã³ã°ããããã¦ãããã¨ã«ãªãã¾ããã
課é¡
ãªãã¡ã¯ã¿ãªã³ã°ãé²ããã«ããã£ã¦ã
- ã©ã®ç®æãã対å¿ãã¦ãããã®åªå 度ä»ãã®åé¡
- ãã¸ãã¹ãµã¤ãã¸ã®èª¬æã¨ä½æ¥é²æã®å¯è¦å
ã¨ãã課é¡ãããã¾ããã
æ¹å
ã³ã¼ãã®è¤é度ã客観çã«å¤æã§ãã¦ãä¿®æ£é£æ度ãå¯è¦åã§ãããã¼ã«ã¨ãã¦CodeClimateã®å°å ¥ã決ãã¾ããã
ã³ã¼ãã®è¤é度ãç¥ãããã«ã¯ãCodeClimateã¨ãªãã¸ããªãåæãããã ãã§å¯è½ã«ãªãã¾ãã
CodeClimateä¸ã§ã³ã¼ãã«ãã¬ãã¸ã管çãããã£ãã®ã§ãCIã§ã«ãã¬ãã¸ã®æ å ±ãã¢ãããã¼ãããããã«ãã¾ããã
ã³ã¼ãã®è¤é度ã¨å¤æ´é »åº¦ããã客観çã«ãªãã¡ã¯ã¿ãªã³ã°ç®æã®åªå 度ãå¤æãããã¨ãåºæ¥ãããã«ãªãã¾ãããè¤é度ãæ°å¤åãã¦ãããã®ã§ãã¸ãã¹ãµã¤ãã¸ã®èª¬æããããããªãã¾ããã
ã¾ããã«ãã¬ãã¸ã®ä¸è¦§ã¯Goç´æ£ã®ãã®ãããåãããããã®ã§å¤§å¤éå®ãã¦ãã¾ãã
version: 2.1 ... jobs: build: ... steps: - checkout - go/mod-download-cached ... - run: name: Setup Code Climate test-reporter command: | curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter chmod +x ./cc-test-reporter go install github.com/jandelgado/gcov2lcov@latest ... - run: name: create a coverage report command: | mkdir -p ./coverage go test -v -count=1 -coverprofile=./coverage/gotest.profile.tmp -p 1 -covermode=set ./... -coverpkg=./... 2>&1 | go-junit-report -set-exit-code=true > ./coverage/test-report-tmp.xml cat ./coverage/gotest.profile.tmp | grep -v "**/mocks/.*.go" > ./coverage/gotest.profile go tool cover -html=./coverage/gotest.profile -o ./coverage/cover.html gcov2lcov -infile=coverage/gotest.profile -outfile=coverage/coverage.lcov - store_artifacts: path: coverage - store_test_results: path: coverage ... - run: name: CodeClimate command: | ./cc-test-reporter before-build ./cc-test-reporter format-coverage -t lcov -o coverage/codeclimate.json coverage/coverage.lcov ./cc-test-reporter upload-coverage ...
ã¾ã¨ã
以ä¸ã®ããã«ãAPIããã¥ã¡ã³ã管çãERå³ã®çæãã³ã¼ãã®è¤é度ã®å¯è¦åãªã©ãCIã®è¨å®ãéãã¦ãã¼ã ã®èª²é¡è§£æ±ºãé²ãã¦ãã¾ããã
ãããã®æ¹åã«ããå°ãã¥ã¤ã§ããçå®ã«ãéçºå¹çã®åä¸ã¨ã³ã¼ãã®å質ç¶æãå®ç¾ãããã¨ãã§ãã¦ãã¾ãã
ä»å¾ãç¶ç¶çãªæ¹åãè¡ããããè¯ãéçºç°å¢ãç®æãã¦ããããã¨æãã¾ãã
æ ªå¼ä¼ç¤¾ãã©ãã·ã³ã¹ã§ã¯ãä¸ç·ã«ãããã¯ããæé·ãããæ§ã ãªã¬ã¤ã¤ã®ã¨ã³ã¸ãã¢ãåéãã¦ãã¾ãã photosynth.co.jp
Akerunã«ãèå³ã®ããæ¹ã¯ãã¡ããã akerun.com