
æ¬æ¥ãMakefileã䜿çšããŠPythonãããžã§ã¯ãçšã«ãã°ããã¢ã»ã³ãã«ããç°¡åã«ãããã°ã§ããDockerã€ã¡ãŒãžã®ãã«ããèªååãããIBMDevOpsãšã³ãžãã¢ã«ããèšäºã®ç¿»èš³ãå ±æããŸãããã®ãããžã§ã¯ãã¯ãDockerã§ã®ãããã°ã容æã«ããã ãã§ãªãããããžã§ã¯ãã³ãŒãã®å質ã管çããŸãããã€ãã®ããã«ã詳现ã¯ã«ããã®äžã«ãããŸãã
ããŒã¿ãµã€ãšã³ã¹ãŸãã¯AIã䜿çšããŠWebã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ããŠããå Žåã§ãããã¹ãŠã®ãããžã§ã¯ãã¯ãé©åã«èª¿æŽãããCI / CDãéçºäžã«åæã«ãããã°ãããå®çšŒåç°å¢çšã«æé©åãããDockerã€ã¡ãŒãžããŸãã¯å質ä¿èšŒããŒã«ã®æ©æµãåããããšãã§ããŸããCodeClimateãSonarCloudãªã©ã®ã³ãŒããããããã¹ãŠããã®èšäºã§ã«ããŒãããPythonãããžã§ã¯ãã«ã©ã®ããã«è¿œå ããããã瀺ãããŠããŸãã
éçºçšã®ãããã°å¯èœãªã³ã³ãã
ã³ã³ããã®ãããã°ãé£ããå Žåããã€ã¡ãŒãžã®æ§ç¯ã«æéãããããããDockerã å«ã人ãããŸããããã§ã¯ãéçºã«çæ³çãªã€ã¡ãŒãžãæ§ç¯ããããšããå§ããŸããã-æ§ç¯ãéãããããã°ãç°¡åã§ããã€ã¡ãŒãžãç°¡åã«ãããã°ããã«ã¯ããããã°ãå¿ èŠã«ãªãå¯èœæ§ã®ãããã¹ãŠã®ããŒã«ãå«ãããŒã¹ã€ã¡ãŒãžãå¿ èŠã§ãããããã¯ãbashãvimãnetcatãwgetãcatãfindãgrepãªã©ã§ããPython
ã€ã¡ãŒãžïŒ3.8.1-ãã¹ã¿ãŒãã®ã¿ã¹ã¯ã®å®ç§ãªåè£ã®ããã§ããç®±ããåºããŠããã«äœ¿ããå€ãã®ããŒã«ãå«ãŸããŠãããäžè¶³ããŠããããŒã«ãç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸããç»åã¯å€§ããã§ãããããã§ã¯é¢ä¿ãããŸãããéçºã§ã®ã¿äœ¿çšãããŸãããæ°ã¥ããããããŸããããç»åã¯éåžžã«å ·äœçã§ããPythonãšDebianã®ããŒãžã§ã³ãããã¯ããããšã¯æå³çãªãã®ã§ããã€ãŸããäºææ§ã®ãªãå¯èœæ§ã®ããæ°ããããŒãžã§ã³ã®PythonãŸãã¯Debianã«ãã£ãŠåŒãèµ·ããããç Žæã®ãªã¹ã¯ãæå°éã«æããå¿ èŠããããŸããã¢ã³Alpine-ããŒã¹ã®ç»åã¯ã代æ¿ãšããŠå¯èœã§ããããããã¯ããã€ãã®åé¡ãåŒãèµ·ããå¯èœæ§ããããŸãïŒããã¯äœ¿çšããŠããŸãå åŽMUSL libã®ä»£ããã«ã¯glibcãPythonãäŸåããŠãããã¢ã«ãã€ã³ãéžæããå Žåã¯ããã®ããšã«æ³šæããŠãã ãããé床ã«é¢ããŠã¯ããã«ãã¹ããŒãžãã«ãã䜿çšããŠãã§ããã ãå€ãã®ã¬ã€ã€ãŒããã£ãã·ã¥ããŸãããã®ãããgccãªã©ã®äŸåé¢ä¿ãšããŒã«ãããã³ã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªãã¹ãŠã®äŸåé¢ä¿ããrequirements.txtããæ¯åããŒããããããã§ã¯ãããŸãããããã«é«éåããããã«ãåè¿°ã®pythonïŒ3.8.1-busterããã«ã¹ã¿ã ããŒã¹ã€ã¡ãŒãžãäœæãããŸã
runnerããããã®ããŒã«ãããŠã³ããŒãããŠæçµã€ã¡ãŒãžã«ã€ã³ã¹ããŒã«ããããã«å¿
èŠãªæé ããã£ãã·ã¥ã§ããªããããå¿
èŠãªãã®ããã¹ãŠæã£ãŠããŸãããããã話ããããŠãDockerfileãèŠãŠã¿ãŸãããã
# dev.Dockerfile
FROM python:3.8.1-buster AS builder
RUN apt-get update && apt-get install -y --no-install-recommends --yes python3-venv gcc libpython3-dev && \
python3 -m venv /venv && \
/venv/bin/pip install --upgrade pip
FROM builder AS builder-venv
COPY requirements.txt /requirements.txt
RUN /venv/bin/pip install -r /requirements.txt
FROM builder-venv AS tester
COPY . /app
WORKDIR /app
RUN /venv/bin/pytest
FROM martinheinz/python-3.8.1-buster-tools:latest AS runner
COPY --from=tester /venv /venv
COPY --from=tester /app /app
WORKDIR /app
ENTRYPOINT ["/venv/bin/python3", "-m", "blueprint"]
USER 1001
LABEL name={NAME}
LABEL version={VERSION}
äžèšã§ã¯ãæçµçãª
runnerç»åãäœæããåã«ãã³ãŒãã3ã€ã®äžéç»åãééããããšãããããŸãã 1ã€ç®ã¯ãã«ããŒã§ãã gccãPythonä»®æ³ç°å¢ãªã©ãã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«å¿
èŠãªãã¹ãŠã®ã©ã€ãã©ãªãããŠã³ããŒãããŸããã€ã³ã¹ããŒã«åŸãå®éã®ä»®æ³ç°å¢ãäœæãããæ¬¡ã®ç»åã§äœ¿çšãããŸããæ¬¡ã¯builder-vvã§ããããã¯ãäŸåé¢ä¿ã®ãªã¹ãïŒrequirements.txtïŒãã€ã¡ãŒãžã«ã³ããŒããŠãããããããã€ã³ã¹ããŒã«ããŸãããã®äžéã€ã¡ãŒãžã¯ãã£ãã·ã¥ã«å¿
èŠã§ããrequirements.txtã倿Žãããå Žåã«ã®ã¿ã©ã€ãã©ãªãã€ã³ã¹ããŒã«ããŸãããã以å€ã®å Žåã¯ããã£ãã·ã¥ã䜿çšããŸããæçµçãªç»åãäœæããåã«ãã¢ããªã±ãŒã·ã§ã³ããã¹ãããŠã¿ãŸãããã
æçµçãªã€ã¡ãŒãžãäœæããåã«ããŸãã¢ããªã±ãŒã·ã§ã³ã®ãã¹ããå®è¡ããŸãããããœãŒã¹ã³ãŒããã³ããŒããŠããã¹ããå®è¡ããŸãããã¹ãã«åæ Œããããã©ã³ããŒç»åã«ç§»åããŸããããã¯ãéåžžã®Debianã€ã¡ãŒãžã«ã¯ãªãããã€ãã®è¿œå ããŒã«vimãšnetcatãåããã«ã¹ã¿ã ã€ã¡ãŒãžã䜿çšããŸãããã®ç»åã¯ãäžã«ããããã«ãŒãããããªãã¯ãŸããéåžžã«ã·ã³ãã«ãªDockerfileã§èŠãããšãã§ãbase.Dockerfileããããã£ãŠããã®æçµã€ã¡ãŒãžã§è¡ãããšïŒæåã«ããã¹ã¿ãŒã€ã¡ãŒãžããã€ã³ã¹ããŒã«ãããã¹ãŠã®äŸåé¢ä¿ãä¿åãããŠããä»®æ³ç°å¢ãã³ããŒããŸãããæ¬¡ã«ãã¹ãããã¢ããªã±ãŒã·ã§ã³ãã³ããŒããŸãããã¹ãŠã®ãœãŒã¹ãã€ã¡ãŒãžã«å«ãŸããŠããã®ã§ãã¢ããªã±ãŒã·ã§ã³ãé 眮ãããŠãããã£ã¬ã¯ããªã«ç§»åããENTRYPOINTãã€ã³ã¹ããŒã«ããŠãã€ã¡ãŒãžã®èµ·åæã«ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããããã«ããŸããã»ãã¥ãªãã£äžã®çç±ãããUSERã¯1001ã«èšå®ãããŠããŸãããã¹ããã©ã¯ãã£ã¹ã§ã¯ãã³ã³ãããrootãšããŠå®è¡ããªãããšããå§ãããŸããæåŸã®2è¡ã¯ãç»åã©ãã«ãèšå®ããŸãããããã¯ãã¿ãŒã²ãããä»ããŠæ§ç¯ãããšãã«çœ®ãæããã
makeãŸããããã«ã€ããŠã¯ãå°ãåŸã§èª¬æããŸãã
å®çšŒåç°å¢åãã«æé©åãããã³ã³ãã
ãããã¯ã·ã§ã³ã°ã¬ãŒãã®å€èгã«é¢ããŠã¯ãå°ãããå®å šã§ãé«éã§ããããšã確èªããå¿ èŠããããŸãããã®æå³ã§ã®ç§ã®å人çãªãæ°ã«å ¥ãã¯ãDistrolessãããžã§ã¯ãã®Pythonã€ã¡ãŒãžã§ãããããããDistrolessããšã¯äœã§ããïŒãã®ããã«èšããŸããããçæ³çãªäžçã§ã¯ã誰ããFROMã¹ã¯ã©ãããããŒã¹ãšããŠäœ¿çšããŠç¬èªã®ç»åïŒã€ãŸãã空ã®ç»åïŒãäœæããŸãããããããã€ããªãªã©ãéçã«ãªã³ã¯ããå¿ èŠããããããã»ãšãã©ã®äººãæãã§ããããšã§ã¯ãããŸãããããã§Distrolessãç»å ŽããŸããããã¯èª°ã«ãšã£ãŠãFROMã¹ã¯ã©ããã§ãããããŠä»ãç§ã¯æ¬åœã«ãDistrolessããäœã§ããããããªãã«è©±ããŸããããã¯Googleã«ãã£ãŠäœæãããã»ããã§ãã¢ããªã±ãŒã·ã§ã³ã«å¿ èŠãªçµ¶å¯Ÿæå°å€ãå«ãç»åãããã¯ãã€ã¡ãŒãžãèšããŸããŠã»ãã¥ãªãã£ã¹ãã£ããŒïŒCVEãªã©ïŒã®ä¿¡å·ãã€ãºãçæããã©ãããŒãããã±ãŒãžãããŒãžã£ãŒããŸãã¯ãã®ä»ã®ããŒã«ããªãããšãæå³ããã³ã³ãã©ã€ã¢ã³ã¹ã®ç¢ºç«ãå°é£ã«ããŸããäœãæ±ã£ãŠããããããã£ãã®ã§ãæ¬çªã®DockerfileãèŠãŠã¿ãŸããããå®éãã³ãŒããããŸã倿Žããå¿ èŠã¯ãªãã2è¡ã ã倿Žããå¿ èŠããããŸãã
# prod.Dockerfile
# 1. Line - Change builder image
FROM debian:buster-slim AS builder
# ...
# 17. Line - Switch to Distroless image
FROM gcr.io/distroless/python3-debian10 AS runner
# ... Rest of the Dockefile
倿Žããå¿ èŠãããã®ã¯ãã¢ããªããã«ãããŠå®è¡ããããã®ããŒã¹ã€ã¡ãŒãžã ãã§ããããããããã®éãã¯ããªã倧ããã§ããéçºã€ã¡ãŒãžã®ééã¯1.03 GBã§ãããã¯ããã103 MBã§ãããããã¯ã倧ããªéãã§ãããããŠãç§ã¯ãã§ã«ããªãã®èšãããšãèãããšãã§ããŸãïŒãã¢ã«ããã¯ããã«è»œãããããšãã§ããŸãïŒã ..ãã¯ããããã§ããããµã€ãºã¯ããã»ã©éèŠã§ã¯ãããŸãããããŒã/ã¢ã³ããŒãæã«ç»åã®ãµã€ãºã«æ°ä»ãã ãã§ãããã»ã©é »ç¹ã«ã¯çºçããŸãããç»åãæ©èœããå Žåããµã€ãºã¯é¢ä¿ãããŸãããã©ã®ãããªå€§ãããããéèŠãªã®ã¯ã»ãã¥ãªãã£ã§ããããã®ç¹ã§Distrolessã¯ééããªãã¢ã«ãã€ã³ã«åªããŠããïŒã¢ã«ãã€ã³ã¯æ»æé¢ãé«ããããã«å€ãã®è¿œå ã®ããã±ãŒãžãæã£ãŠããŸããDistrolessã«ã€ããŠè©±ããšãã«èšåãã䟡å€ã®ããæåŸã®ããšã¯ãç»åã®ãããã°ã§ãããããèæ ®ããŠDistrolessã«ã¯ã·ã§ã«ãå«ãŸããŠãããïŒãshããå«ãŸããŠããŸããïŒããããã°ãšèª¿æ»ã¯éåžžã«å°é£ã«ãªããŸãããã®ããã«ããã¹ãŠã®Distrolessã€ã¡ãŒãžã®ããããã°ãããŒãžã§ã³ããããŸããããããã°ãåé¡ãçºçãããšãã«ãã¿ã°
debugã䜿çšããŠäœæ¥ã€ã¡ãŒãžãäœæããéåžžã®ã€ã¡ãŒãžãšäžç·ã«ãããã€ãããããã°ã€ã¡ãŒãžã§å¿
èŠãªåŠçãå®è¡ããŠãããšãã°ã¹ããªãŒã ãã³ããå®è¡ã§ããŸããæ¬¡ã®ããã«ãpython3ã€ã¡ãŒãžã®ãããã°ããŒãžã§ã³ã䜿çšããããšãã§ããŸãã
docker run --entrypoint=sh -ti gcr.io/distroless/python3-debian10:debug
ãã¹ãŠã®ããã®1ã€ã®ããŒã
ãã¹ãŠã®Dockerfileã®æºåãã§ããããMakefileã䜿çšããŠãã®æªå€¢å šäœãèªååã§ããŸããæåã«å®è¡ãããã®ã¯ãDockerã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ããã«ãããããšã§ãããããã£ãŠãéçºã€ã¡ãŒãžãæ§ç¯ããããã«ã
make build-dev次ã®ã³ãŒããå®è¡ãããã®ãèšè¿°ããŸãã
# The binary to build (just the basename).
MODULE := blueprint
# Where to push the docker image.
REGISTRY ?= docker.pkg.github.com/martinheinz/python-project-blueprint
IMAGE := $(REGISTRY)/$(MODULE)
# This version-strategy uses git tags to set the version string
TAG := $(shell git describe --tags --always --dirty)
build-dev:
@echo "\n${BLUE}Building Development image with labels:\n"
@echo "name: $(MODULE)"
@echo "version: $(TAG)${NC}\n"
@sed \
-e 's|{NAME}|$(MODULE)|g' \
-e 's|{VERSION}|$(TAG)|g' \
dev.Dockerfile | docker build -t $(IMAGE):$(TAG) -f- .
ãã®ã¿ãŒã²ããã¯ãæåã«äžéšã®ã©ãã«ã
dev.Dockerfileç»åã®ååãšèµ·åã«ãã£ãŠäœæãããã¿ã°ã«çœ®ãæããããšã«ãã£ãŠç»åãäœæãgit describeãæ¬¡ã«èµ·åãdocker buildãŸããæ¬¡ã«ã以äžã䜿çšããŠå®çšŒåç°å¢çšã«ãã«ãããŸãmake build-prod VERSION=1.0.0ã
build-prod:
@echo "\n${BLUE}Building Production image with labels:\n"
@echo "name: $(MODULE)"
@echo "version: $(VERSION)${NC}\n"
@sed \
-e 's|{NAME}|$(MODULE)|g' \
-e 's|{VERSION}|$(VERSION)|g' \
prod.Dockerfile | docker build -t $(IMAGE):$(VERSION) -f- .
ãã®ã¿ãŒã²ããã¯åã®ã¿ãŒã²ãããšéåžžã«äŒŒãŠããŸãããããŒãžã§ã³ãšããŠgitã¿ã°ã䜿çšãã代ããã«ãåŒæ°ãšããŠæž¡ãããããŒãžã§ã³ã䜿çšãããŸããäžèšã®äŸã§ã¯ã1.0.0ã§ãããã¹ãŠãã§å®è¡ãããŠããå Žåããã«ãŒãããã€ãã®æç¹ã§ãããªãã¯ãŸãããããã°ãã¹ãŠã«å¿ èŠããã«ãŒãããã«ã¯ç®æšããããŸãã
# Example: make shell CMD="-c 'date > datefile'"
shell: build-dev
@echo "\n${BLUE}Launching a shell in the containerized build environment...${NC}\n"
@docker run \
-ti \
--rm \
--entrypoint /bin/bash \
-u $$(id -u):$$(id -g) \
$(IMAGE):$(TAG) \
$(CMD)
äžèšã®ã³ãŒãã§ã¯ããšã³ããªãã€ã³ããbashã«ãã£ãŠãªãŒããŒã©ã€ããããcontainerã³ãã³ããCMDã®åŒæ°ã«ãã£ãŠãªãŒããŒã©ã€ããããŠããããšãããããŸãããããã£ãŠãã³ã³ããã«ç§»åããŠç§»åããããäžèšã®äŸã®ããã«äœããã®ã³ãã³ããå®è¡ããããšãã§ããŸããããã°ã©ãã³ã°ãšDockerã¬ãžã¹ããªãžã®ã€ã¡ãŒãžã®ããã·ã¥ãå®äºããããã䜿çšã§ããŸã
make push VERSION=0.0.2ããã®ç®æšãäœããããèŠãŠã¿ãŸãããïŒ
REGISTRY ?= docker.pkg.github.com/martinheinz/python-project-blueprint
push: build-prod
@echo "\n${BLUE}Pushing image to GitHub Docker Registry...${NC}\n"
@docker push $(IMAGE):$(VERSION)
æåã«åè¿°ã®ã¿ãŒã²ãããèµ·åãã
build-prod次ã«åçŽã«èµ·åãdocker pushãŸããããã¯ãDockerã¬ãžã¹ããªã«ãã°ã€ã³ããŠããããšãåæãšããŠããããããå®è¡ããåã«ãã®ã¿ãŒã²ãããå®è¡ããå¿
èŠããããŸãdocker loginãæçµçãªç®æšã¯ãDockerã¢ãŒãã£ãã¡ã¯ããã¯ãªãŒã³ã¢ããããããšã§ããããã¯ãDockerã€ã¡ãŒãžãã«ããã¡ã€ã«å
ã§çœ®ãæããããnameã¿ã°ã䜿çšããŠãåé€ããå¿
èŠã®ããã¢ãŒãã£ãã¡ã¯ãããã£ã«ã¿ãªã³ã°ããã³æ€çŽ¢ããŸãã
docker-clean:
@docker system prune -f --filter "label=name=$(MODULE)"
ãã¹ãŠã®Makefileã³ãŒãã¯ãªããžããªã«ãããŸãã
GitHubã¢ã¯ã·ã§ã³ãå«ãCI / CD
ãã®ãããžã§ã¯ãã§ã¯ãmakeãGithub Actionsãããã³Githubããã±ãŒãžã¬ãžã¹ããªã䜿çšããŠãã€ãã©ã€ã³ïŒã¿ã¹ã¯ïŒãæ§ç¯ããã€ã¡ãŒãžãä¿åããŠCI / CDãæ§æããŸããããããããã¯äœã§ããïŒ
- GitHubã¢ã¯ã·ã§ã³ã¯ãéçºã¯ãŒã¯ãããŒã®èªååã«åœ¹ç«ã€ã¿ã¹ã¯/ãã€ãã©ã€ã³ã§ãããããã䜿çšããŠåå¥ã®ã¿ã¹ã¯ãäœæããããããçµã¿åãããŠã«ã¹ã¿ã ã¯ãŒã¯ãããŒã«ããããšãã§ããŸããã«ã¹ã¿ã ã¯ãŒã¯ãããŒã¯ãããšãã°ããªããžããªã«ããŒã¿ãéä¿¡ãããã³ã«ããŸãã¯ãªãªãŒã¹ãäœæãããšãã«å®è¡ãããŸãã
- Github Package Registryã¯ã GitHubãšå®å šã«çµ±åãããããã±ãŒãžãã¹ãã£ã³ã°ãµãŒãã¹ã§ããRuby gemãnpmããã±ãŒãžãªã©ãããŸããŸãªã¿ã€ãã®ããã±ãŒãžãä¿åã§ããŸãããããžã§ã¯ãã¯ããã䜿çšããŠDockerã€ã¡ãŒãžãä¿åããŸããGithubããã±ãŒãžã¬ãžã¹ããªã®è©³çްã«ã€ããŠã¯ããã¡ããã芧ãã ããã
GitHubã¢ã¯ã·ã§ã³ ã䜿çšããã«ã¯ãéžæããããªã¬ãŒã«åºã¥ããŠãããžã§ã¯ãã«ã¯ãŒã¯ãããŒãäœæããŸãïŒããªã¬ãŒã®äŸã¯ãªããžããªãžã®éä¿¡ã§ãïŒããããã®ã¯ãŒã¯ãããŒã¯ããã£ã¬ã¯ããªå ã®YAMLãã¡ã€ã«ã§ã
.github/workflowsã
.github
âââ workflows
âââ build-test.yml
âââ push.yml
build-test.ymlãã¡ã€ã«ã«ã¯ãã³ãŒãããªããžããªã«éä¿¡ããããã³ã«å®è¡ããã2ã€ã®ãžã§ããå«ãŸããŠããŸãããããã®ãžã§ãã以äžã«ç€ºããŸãã
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Run Makefile build for Development
run: make build-dev
ãã«ããšåŒã°ããæåã®ã¿ã¹ã¯ã¯ãã¿ãŒã²ãããå®è¡ããŠã¢ããªã±ãŒã·ã§ã³ããã«ãã§ããããšã確èªããŸã
make build-devããã ããéå§ããåã«ãcheckoutGitHubã«å
¬éããããªããžããªãå®è¡ããŠãªããžããªããã§ãã¯ããŸãã
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: actions/setup-python@v1
with:
python-version: '3.8'
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run Makefile test
run: make test
- name: Install Linters
run: |
pip install pylint
pip install flake8
pip install bandit
- name: Run Linters
run: make lint
2çªç®ã®ã¿ã¹ã¯ã¯ããå°ãé£ããã§ããã¢ããªã±ãŒã·ã§ã³ã®é£ã§ãã¹ããå®è¡ãã3ã€ã®ã³ãŒãå質管çãªã³ã¿ãŒïŒã³ãŒãå質ã³ã³ãããŒã©ãŒïŒãå®è¡ããŸããåã®ã¿ã¹ã¯ãšåæ§ã«ãã¢ã¯ã·ã§ã³ã䜿çšããŠãœãŒã¹ã³ãŒããååŸããŸã
checkout@v1ããã®åŸsetup-python@v1ãpythonç°å¢ãã»ããã¢ããããããšåŒã°ããå¥ã®å
¬éãããã¢ã¯ã·ã§ã³ãèµ·åãããŸãïŒè©³çްã¯ãã¡ãïŒã Pythonç°å¢ãã§ããã®ã§ãrequirements.txtpipã䜿çšããŠã€ã³ã¹ããŒã«ããã¢ããªã±ãŒã·ã§ã³ã®äŸåé¢ä¿ãå¿
èŠã§ãããã®æç¹make testã§ãã¿ãŒã²ããã®å®è¡ãéå§ããŸããããã¿ãŒã²ããã¯Pytestãã¹ãã¹ã€ãŒããå®è¡ããŸãããããã®ãã¹ãã«åæ Œããå Žåã¯ãåè¿°ã®ãªã³ã¿ãŒïŒpylintãflake8ãbanditïŒã®ã€ã³ã¹ããŒã«ã«é²ã¿ãŸããæåŸã«ãã¿ãŒã²ãããèµ·åããŸãmake lint次ã«ããããã®åãªã³ã¿ãŒãèµ·åããŸãããã«ã/ãã¹ããžã§ãããã¹ãŠã§ãããã³ãŒããéä¿¡ããã®ã¯ã©ãã§ããïŒåœŒå¥³ã«ã€ããŠè©±ããŸãããïŒ
on:
push:
tags:
- '*'
jobs:
push:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Set env
run: echo ::set-env name=RELEASE_VERSION::$(echo ${GITHUB_REF:10})
- name: Log into Registry
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login docker.pkg.github.com -u ${{ github.actor }} --password-stdin
- name: Push to GitHub Package Registry
run: make push VERSION=${{ env.RELEASE_VERSION }}
æåã®4è¡ã¯ããžã§ãã®éå§æéãå®çŸ©ããŸãããã®ã¿ã¹ã¯ã¯ãã¿ã°ããªããžããªã«ç§»åããããšãã«ã®ã¿ããªã¬ãŒãããå¿ èŠãããããšã瀺ããŸãïŒ*ã¯ååã®ãã¿ãŒã³ã瀺ããããã§ã¯ãã¹ãŠã¿ã°ã§ãïŒãããã¯ãããŒã¿ããªããžããªã«ããã·ã¥ãããã³ã«Dockerã€ã¡ãŒãžãGitHubããã±ãŒãžã¬ãžã¹ããªã«ããã·ã¥ããªãããã«ããããã§ãããã¢ããªã±ãŒã·ã§ã³ã®æ°ããããŒãžã§ã³ã瀺ãã¿ã°ãã¢ããããŒããããå Žåã«ã®ã¿è¡ãããŸããããã§ããã®ã¿ã¹ã¯ã®æ¬äœã«ã€ããŠèª¬æããŸãããŸãããœãŒã¹ã³ãŒãã確èªããRELEASE_VERSIONç°å¢å€æ°ã®å€ãgitã¢ããããŒãã¿ã°ãšåãã«èšå®ããŸããããã¯ãçµã¿èŸŒã¿ã®GitHubã¢ã¯ã·ã§ã³é¢æ°:: setenvã䜿çšããŠå®è¡ãããŸãïŒè©³çްã¯ãã¡ãïŒã次ã«ãã¿ã¹ã¯ã¯ããªããžããªã«æ ŒçŽãããŠããã·ãŒã¯ã¬ããREGISTRY_TOKENãšãã¯ãŒã¯ãããŒãéå§ãããŠãŒã¶ãŒïŒgithub.actorïŒã®ãã°ã€ã³ã䜿çšããŠDockerã¬ãžã¹ããªã«å ¥ããŸããæåŸã«ãæåŸã®è¡ã§ããã·ã¥ã¿ãŒã²ãããå®è¡ãããŸããããã·ã¥ã¿ãŒã²ããã¯ãæ¬çªã€ã¡ãŒãžããã«ããã以åã«æçš¿ãããgitã¿ã°ãã€ã¡ãŒãžã¿ã°ãšããŠã¬ãžã¹ããªã«ããã·ã¥ããŸãããªããžããªãã¡ã€ã«å ã®ãã¹ãŠã®ã³ãŒãã確èªããŠãã ããã
CodeClimateã«ããã³ãŒãå質ãã§ãã¯
æåŸã«ãªããŸããããCodeClimateãšSonarCloudã䜿çšããŠã³ãŒãå質ãã§ãã¯ã远å ããŸãããããããã¯ãäžèšã®ãã¹ãã¿ã¹ã¯ãšé£æºããŠæ©èœããŸããã³ãŒããæ°è¡è¿œå ããŸãã
# test, lint...
- name: Send report to CodeClimate
run: |
export GIT_BRANCH="${GITHUB_REF/refs\/heads\//}"
curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter
chmod +x ./cc-test-reporter
./cc-test-reporter format-coverage -t coverage.py coverage.xml
./cc-test-reporter upload-coverage -r "${{ secrets.CC_TEST_REPORTER_ID }}"
- name: SonarCloud scanner
uses: sonarsource/sonarcloud-github-action@master
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
å§ãŸãCodeClimateïŒå€æ°ã®ãšã¯ã¹ããŒã
GIT_BRANCHç°å¢å€æ°ã䜿çšããŠååŸããŸãGITHUB_REFãæ¬¡ã«ãCodeClimateãã¹ãã¬ããŒãããŒã«ãããŠã³ããŒãããŠå®è¡å¯èœã«ããŸããæ¬¡ã«ãããã䜿çšããŠãã¹ãã¹ã€ãŒãã«ãã¬ããžã¬ããŒãããã©ãŒãããããŸããæåŸã®è¡ã§ã¯ããªããžããªã®ã·ãŒã¯ã¬ããã«ä¿åãããŠãããã¹ãã¬ããŒãçšã®ããŒã«ã®IDã䜿çšããŠCodeClimateã«éä¿¡ããŸããSonarCloudãããªããäœæããå¿
èŠããããŸãsonar-project.propertiesããã®ãã¡ã€ã«ã®å€ã¯ãå³äžé
ã®SonarCloudããã·ã¥ããŒãã«ããããã®ãã¡ã€ã«ã¯æ¬¡ã®ããã«ãªããŸãã
sonar.organization=martinheinz-github
sonar.projectKey=MartinHeinz_python-project-blueprint
sonar.sources=blueprint
ãŸããç§ãã¡ã®ããã«ä»äºãããŠãããã®ãç°¡åã«äœ¿çšããããšãå¯èœ
sonarcloud-github-actionã§ããGitHubã®ãããã©ã«ãã®ãªããžããªå
ã®1ã€ã®ããã«ããšã®ããã«ïŒç§ãã¡ã¯ããªããã°ãªããªããã¹ãŠã¯ã2ã€ã®ããŒã¯ã³ãæäŸSonarCloudãæã
ã¯ããåŸã1 SonarCloudã®ãŠã§ããµã€ãããæ³šïŒèšåãããŠãããã¹ãŠã®ããŒã¯ã³ãšã·ãŒã¯ã¬ãããååŸããŠã€ã³ã¹ããŒã«ããæé ã¯ããªããžããªã®READMEã«èšèŒãããŠããŸãã
çµè«
ããã§å šéšã§ãïŒããŒã«ãæ§æãããã³ã³ãŒãã䜿çšããŠã次ã®Pythonãããžã§ã¯ãã®ããããåŽé¢ãã«ã¹ã¿ãã€ãºããã³èªååããæºåãæŽããŸããããã®èšäºã«ç€ºãããŠããããŸãã¯èª¬æãããŠãããããã¯ã«é¢ãã詳现æ å ±ãå¿ èŠãªå Žåã¯ããªããžããªå ã®ããã¥ã¡ã³ããšã³ãŒãã確èªããŠãã ãããææ¡ãåé¡ãããå Žåã¯ããªããžããªã«ãªã¯ãšã¹ããéä¿¡ãããããã®å°ããªãããžã§ã¯ãã«ã¹ã¿ãŒãä»ããŠãã ããããæ°ã«å ¥ãã

ãŸããHABRããã¢ãŒã·ã§ã³ã³ãŒãã䜿çšãããšããããŒã«ç€ºãããŠããå²åŒã«ããã«10ïŒ ã远å ã§ããŸãã
- ããŒã¿ãµã€ãšã³ã¹ã®å°éå®¶ããŒãããæãã
- ããŒã¿ãµã€ãšã³ã¹ã®ãªã³ã©ã€ã³ããŒããã£ã³ã
- ããŒã¿ã¢ããªã¹ãã®è·æ¥ããŒããããã¬ãŒãã³ã°ãã
- ããŒã¿åæãªã³ã©ã€ã³ããŒããã£ã³ã
- Python forWebéçºã³ãŒã¹
ãã®ä»ã®ã³ãŒã¹