ä»å¹Žã«å ¥ã£ãŠ Octopassãšãããããã¯ããå ¬éããŸãããããã¯ãLinuxã®ãŠãŒã¶ãæš©éãGithubã®Teamãšé£æºããŠéçšã楜ã«ãããšããããŒã«ã§ããã
è²ããªæ¹ã ã®ãååã«ãããå€ãã®Retweetãã¯ãŠã¶ããã ããããšã§ãããçšåºŠã Octopass ãå¿ èŠãšããããªäººã®ç®ã«è§Šããã®ã§ã¯ãªãããšæã£ãŠããŸãã ïŒGithubã®ã¹ã¿ãŒæ°ãå°ãªãã®ã¯ä»åŸã®èª²é¡ïŒ ãã®äžã§ãããã䟿å©ãããã²å°å ¥ãããããšãããã£ãŒãããã¯ã¯ã ç¶ç¶ããŠæ©èœè¿œå ããŠãããšããã¢ãããŒã·ã§ã³ã«ã€ãªãã£ãŠããŠãéåžžã«ãããããã§ãã
ããŠããã® Octopass ã¯ãLinuxãŠãŒã¶åå解決ãããããã«ã® glibc ã® libnssã¢ãžã¥ãŒã«ãCã§å®è£ ããŠããŸãã cgoããã®ä»ã®èšèªã§Shared ObjectãåãåºããŠãè¯ãã£ãã®ã§ãããããã ãšæè¡çææŠãè¶³ããªããšããŠãè§ŠããŠããªãã£ãCã«ææŠããŸããã
ãã ããªãªãŒã¹åœåãèªèšŒãå ¬ééµãååŸããéšåã¯goã§æžããŠããŠãïŒãããžã§ã¯ãã®äžã«ïŒçš®é¡ã®èšèªã䜿ã£ãŠæãç«ã£ãŠããŸãããã 管çãè€éã«ãªãããšãšãåæ§ã®å®è£ ã2ã€ååšããŠããŸãããšãç¡é§ã§ããããšãæããŠã v0.2ãšããŠgoã®éšåãCã«çœ®ãæãããšããäœæ¥ãè¡ãçŽç²ã«Cã®ãããã¯ããšããŸããã ãã®ããšã§ãCIãã·ã³ãã«ã«ã§ããé¡äŒŒã®å®è£ ãããªããŠè¯ããªããŸããããèŠéããããã¶ãè¯ããªã£ãæ°ãããŸãã
ä»åãCã®ãããã¯ããäœãã«ããã£ãŠãCãå匷ãã以å€ã«ã©ããªããšããã£ããæ¯ãè¿ã£ãŠã¿ãããšæããŸãã
Clang Format
ãŸããèªåãäœãã®ãlibnssã®ã¢ãžã¥ãŒã«ãªã®ã§æ¢åã®ãã®ãgithubã§æ€çŽ¢ããŠã²ãããèªãã§ã¿ãŸããã æåã«æ°ã«ãªã£ãã®ããcoding styleããã©ãã©ãªããšïŒ æåãªãããã¯ãã§ãã£ãŠããããŸããããã¹ã¿ã³ããŒããšãããã®ããªãããããã©ãããããšããç¶æ ã«ãªã£ãŠããŸããã
ãã㯠@matsumotory ããã« clang-format ãšããæŽåœ¢ããŒã«ãããããšããæ å ±ãåŸãŸããã
clang-formatãå°å ¥ãããšãåºæ¬ã¹ã¿ã€ã«ãšãããã®ããã£ãŠã LLVMã»Googleã»Mozillaã»Linux⊠ãšãã£ãããããã®æµæŽŸãéžæã§ããæ§ã«ãªã£ãŠããã®ã§ãšãŠã䟿å©ã§ããã
æ©éé©åœã«formatãå®çŸ©ãïŒèšå®ã¯äžèšïŒãvimãšé£æºããããšã§ä¿åæã«ãããã«æŽåœ¢ããããšããæãã«ãªããŸããã
# requires clang-format >= 3.6
BasedOnStyle: "LLVM"
IndentWidth: 2
ColumnLimit: 120
BreakBeforeBraces: Linux
AllowShortFunctionsOnASingleLine: None
SortIncludes: false
AlignConsecutiveAssignments: true
AlignTrailingComments: true
AllowShortBlocksOnASingleLine: true
ãŸãããã仮㫠Pull-Requestãããã£ãæã«æå®ãããã©ãŒãããããå€ããŠãããã ç§ãPull-Requestããããæ¹ã«ãããæ§ãCIã§ formatã®diffããã§ãã¯ããããã«ãããŸããã
Criterion
次ã«ãUnit Testãè²ã Cã®ãããžã§ã¯ãèŠãŠãããšãmainæžããŠæäœéã®ãã¹ããæžããŠããã èªåã§assertionäœã£ãŠãããšããŠçµæ§ã«ãªã¹ã§ãã äœãããtest frameworkã¯ãªãããªãšèª¿ã¹ããšè¯ããããªãã®ãããã€ããããŸãã
- CUnit
- googletest
- Unity
- Criterion
çé¢ç®ã«æ¯èŒããæéã¯ãªãã£ãã®ã§exampleãå€ããã®ãšåºåãåããããããã®ããšãããã䜿ã£ãŠã¿ãããš Criterion ã䜿ãå§ããŸããã
#include <criterion/criterion.h>
Test(suite_1, failing) {
cr_assert(0);
}
Test(suite_1, passing) {
cr_assert(1);
}
Criterion ã¯çµæ§äŸ¿å©ã§ è²ã 㪠assertion ãæºåãããŠãã®ã¯ãã¡ããã§ããã ç°åžžç³»ã®ãã¹ããšã㊠exit codeã signalãæ€èšŒããä»çµã¿ããããŸãã ããã¯ãCriterion ããã¹ãã±ãŒã¹ã®ããã»ã¹ãåé¢ããŠå®è¡çµæãã¬ããŒãããä»çµã¿ã«ãããã®ã§ãã ãŸããTheoryãã¹ããç°¡åã«ãããããã¹ãã¹ã€ãŒããæ¥œã«èšå®ã§ããã®ãã¡ãªãããªã®ããªãšïŒä»ã®ãã¬ãŒã ã¯ãŒã¯ã䜿ã£ãŠæ¯èŒããŠãªãã®ã§ïŒæ³åããŠããŸãã
Makefile
次ã«ããã¹ããé »ç¹ã«å®è¡ãã ããšã³ã³ãã€ã«ããŠãã¹ãå®è¡ãšããã®ãé¢åã«ãªã£ãŠããŸãã ãããããš GNU Make ã®åºçªã§ããã«ãããã«ãã«å¿ èŠãªäŸåã©ã€ãã©ãªçãã»ããã¢ããããããšãå®çŸ©ããŠãããŸãã ãããŠãMake ã®èªå·±ææžåãšããè£æããããããªã®ã§å°å ¥ããŸãããç°¡åã«èšãã° Make ã§ rake -T ã¿ãããªããšãã§ããŸãã
- Makefileãèªå·±ææžåããhttp://postd.cc/auto-documented-makefile/
pkg: ## Create some distribution packages
rm -rf builds && mkdir builds
docker-compose up
dist: ## Upload archives on Mac
@test -z $(GITHUB_TOKEN) || $(MAKE) github_release
@test -z $(PACKAGECLOUD_TOKEN) || $(MAKE) packagecloud_release
help:
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(INFO_COLOR)%-30s$(RESET) %s\n", $$1, $$2}'
ã¿ãŒã²ããåã®åŸãã«ã³ã¡ã³ããæžãããšã§ããããã¿ãŒã²ããã®äžèЧãšãªãããã«ããŠããŸãã
Packaging
ãããã¯ãã宿ãããšã䜿ããããããããã«ãããã±ãŒãžã«ããããªã£ãŠããŸãã ãã®ããã±ãŒãžåãæã§ãã£ãŠããé¢åãªã®ã§ docker-compose up ã§äžæ°ã«äœæãããããã«ããŸãã
rpm:
dockerfile: dockerfiles/Dockerfile.centos
build: .
volumes:
- .:/octopass
command: make rpm
deb:
dockerfile: dockerfiles/Dockerfile.ubuntu
build: .
volumes:
- .:/octopass
command: make deb
ãŸããäœææžã¿ããã±ãŒãžãGithub Rereasesã«ã¢ããããŒãããã®ã¯ããªãã¿ ghr ã䜿ãã PackageCloud ãžã®ã¢ããããŒã㯠github.com/mlafeldt/pkgcloud ã䜿çšããŸããã ããããããšã§ãåãã£ã¹ããªãã¥ãŒã·ã§ã³ããã±ãŒãžã®äœæå ¬éã make dist ãšããã³ãã³ãã ãã§å®çµããŠããŸããŸãã
Integration Test
ãŠããããã¹ãããæžããŠãªãã£ãã®ã§ãããäœã£ãããã±ãŒãžãã€ã³ã¹ããŒã«ããŠè©Šããã Segmentaion fault ãšãåºããããŠçµ±åãã¹ããåºæ¥ãŠãªãã£ãããšã«æ°ã¥ãBashã§æžããŸããã
function test_octopass_passwd() {
actual="$(/usr/bin/octopass passwd linyows)"
expected="linyows:x:74049:2000:managed by octopass:/home/linyows:/bin/bash"
if [ "x$actual" == "x$expected" ]; then
pass "${FUNCNAME[0]}"
else
fail "${FUNCNAME[0]}" "$expected" "$actual"
fi
}
function run_test() {
self=$(cd $(dirname $0) && pwd)/$(basename $0)
tests="$(grep "^function test_" $self | sed -E "s/function (.*)\(\) \{/\1/g")"
for t in $(echo $tests); do
$t
done
}
run_test
exit $ALL_PASSED
ä»åã¯çµ±åãã¹ãã®æ€èšŒé ç®ãå°ãªããããã£ãšbashã§æžããŠããŸããŸããããCriterion ã§åºæ¥ããããããŸããã
Conclusion
Cã®ãããã¯ããäœãéã«ãã£ãããšããŸãšãããšä»¥äžã§ãã
- ã¹ã¿ã€ã«ãã©ãŒããã > Clang Format
- Unit Test > Criterion
- è²ã èªåå > Makefile
- ããã±ãŒãžäœæ > Dokcer Compose ãš ghr
- Integration Test > bashã§æžãã..
ããããæœè±¡åãããšãCã¹ã¿ãŒã¿ãŒã¿ãããªãã®ãåºæ¥ããªãšæãã€ã€ã Criterion ã®ãããªäŸ¿å©ãªããŒã«äœ¿ãã ãã§ãCã®éçºèŠæã ãªãŒãšããæèãå€ãã£ãŠã éåååãã§æ¥œãããªããã®ã ãªãšããã®ãæ¹ããŠæããŸããã
Cã¯å匷å§ããã°ãããªã®ã§ãã¡ã¢ãªã®æ°æã¡ãçè§£ã§ããããã«ãã£ãŠãããïŒ
ããŸã
ã¡ãªã¿ã«ãOctopass v0.3ã§ã¯å ±æãŠãŒã¶æ©èœã远å ããŠããŸãã æå®ãããŠãŒã¶ãããŒã ã§å ±æãèªèšŒããããšãã§ãããšãããã®ã§ãã ãŠãŒã¹ã±ãŒã¹ãããŠã¯ãã¢ããªãªã©ã®å®è¡ãŸãã¯deployã®ããã®ãŠãŒã¶ãå ±æããã®ãæ³å®ããŠããŸãã
Octopass ã¯ãã£ãã·ã¥ããããšã§ãé«éããšGithubãšããSPOFãé¿ããŠããŸããããµãŒãã®å°æ°ãå€§èŠæš¡ã«ãªããšã ã©ãããŠãGithubã®API Rate limitãè¶ ãAPIã®æåã«proxyãèšçœ®ããŠãªã¯ãšã¹ãåæ°ãæžãããšããæœçãå¿ èŠã«ãªã£ãŠããŸãã ä»åŸã¯ããã®ãã£ãã·ã¥ãOctopass ã¯ã©ã¹ã¿éã§å ±æããããšã§Github APIã®proxyãäžèŠã«ããããšèããŠããŸãã å®éã«ãã£ãã·ã¥ãå ±æããã®ã¯ãEtcd ã Consul Key/Value Data ãšãã䜿ãæãã«ãªãã€ã¡ãŒãžã§ãã