å ¥é
äœã ã£ãïŒ
- 1ã€ã®ãã¹ããµãŒããŒ
- Gitlabãšå¥ã®ãµãŒããŒäžã®redmine
- åé¡ãæŽçããã
ãã¹ãŠã®ãµãŒããŒã¯ããŒã«ã«ãããã¯ãŒã¯ã«ããããã¹ããµãŒããŒã«ã¯å€éšããã¢ã¯ã»ã¹ã§ããŸããã
å¿ èŠãªãã®ïŒ
- è€æ°ã®ãããžã§ã¯ã/ãã©ã³ããåæã«ãã¹ãããæ©èœ
- éçºè ã¯ããµãŒããŒã«ã¢ã¯ã»ã¹ããŠã»ããã¢ããããä»ã®ãŠãŒã¶ãŒããäœããå£ãããšã¯ã§ããŸããã
- ãã¹ãŠãå¯èœãªéã䟿å©ã§ãã§ããã°gitlabïŒCI / CDïŒãã1ã€ã®ãã¿ã³ã§è¡ãå¿ èŠããããŸãã
ãœãªã¥ãŒã·ã§ã³ãªãã·ã§ã³
1. 1ã€ã®ãµãŒããŒãå€ãã®ãã¹ã
æãç°¡åãªãªãã·ã§ã³ã åããã¹ããµãŒããŒã䜿çšããŸããéçºè ã®ã¿ãåãã©ã³ã/ãããžã§ã¯ãã®ãã¹ããäœæããnginx / apache2æ§æã«è¿œå ããå¿ èŠããããŸãã
é·æïŒ
- ããã«èª°ããç解ãã
- èªååã§ãã
çæïŒ
- èŠä»¶ã®æ¡é 2ãæºããããŠããŸãã-éçºè ã¯ããŒã¿ããŒã¹ã®æŽæ°ãéå§ããç¶æ³ã«ãã£ãŠã¯ãã¹ãŠãå ¥ããããšãã§ããŸãïŒããã«ã¡ã¯AndrewïŒïŒ
- å€æ°ã®æ§æãã¡ã€ã«ã«ããããªãè€éãªèªåå
2.ãµãŒããŒäžã®åéçºè ã«ïŒ
åãµãŒããŒãå²ãåœãŠãéçºè èªèº«ãçµæžãæ åœããŸãã
é·æïŒ
- éçºè ã¯ãããžã§ã¯ãçšã«ãµãŒããŒãå®å šã«ã«ã¹ã¿ãã€ãºã§ããŸã
çæïŒ
- èŠä»¶ã®æ¡é 2ãæºããããŠããªã
- é«äŸ¡ãªãªãœãŒã¹ã¯ããã¹ãã§ã¯ãªããéçºã®é²è¡äžã«åã«ã¢ã€ãã«ç¶æ ã«ãªãããšããããŸã
- ãµãŒããŒãç°ãªããããèªååã¯ãã€ã³ã1ãããããã«è€éã§ã
3.ã³ã³ããå-ããã«ãŒãkubernetes
ãã®æè¡ã¯ç§ãã¡ã®ç掻ã«ãŸããŸã浞éããŠããŸãã èªå® ã§ã¯ãé·ãéãããžã§ã¯ãã«dockerã䜿çšããŠããŸãã
Dockerã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¬ãã«ã®ä»®æ³åç°å¢ã§ã®ã¢ããªã±ãŒã·ã§ã³ã®å±éãšç®¡çãèªååããããã®ãœãããŠã§ã¢ã§ãã ã«ãŒãã«ã§cgroupsããµããŒãããä»»æã®Linuxã·ã¹ãã ã«ç§»æ€ã§ããã³ã³ããã«ããã¹ãŠã®ç°å¢ãšäŸåé¢ä¿ãå«ãã¢ããªã±ãŒã·ã§ã³ããããã¯ãã§ããŸãããŸããã³ã³ãã管çç°å¢ãæäŸããŸããé·æïŒ
- 1ã€ã®ãµãŒããŒã䜿çšãããŸã
- ãã¹ãŠã®èŠä»¶ãæºããããŠããŸãã
çæïŒ
- ç»åãã³ã³ããã¯ãå€ãã®ã¹ããŒã¹ãå æããå ŽåããããŸããã¹ããŒã¹ã解æŸããã«ã¯ããã§ã«å€ããªã£ãŠããã¯ã©ãŠã³ããããã«ããå¿ èŠããããŸãã
Dockerã®å®è£
gitlabãAutoDevOpsã䜿çšããŠããå Žåãkubernetesã®èšå®ãéåžžã«é »ç¹ã«ç®ã«çãŸããŸããã ããã«ãããŸããŸãªããŒãã¢ããã®ã²ããçãããç·ãã¡ã¯ãkubernetesã§ã®äœæ¥ãããã«ã¯ãŒã«ããèªã£ãŠããŸãã ãã®ãããã¯ã©ã¹ã¿ãŒãæœèšã«å±éããããšã決å®ãããµãŒããŒãèŠæ±ããïŒãããŠããã¹ãçšã®ãµãŒããŒã«è§Šããããšã¯ã§ããŸãããããã§ãã¹ããããŠããŸãïŒããµãŒããŒãèµ·åããŸããïŒ
ç§ã¯kubernetes 0ã®çµéšããããããããããã¹ãŠã®ã¯ã©ã¹ã¿ãŒãã©ã®ããã«æ©èœããããç解ããããšããŠãããã¥ã¢ã«ã«åŸã£ãŠãã¹ãŠãè¡ãããŸããã ãã°ããããŠãç§ã¯ãªããšãã¯ã©ã¹ã¿ãŒãäžããããšãã§ããŸãããããã®åŸã蚌ææžãããŒããããŠå®éã«ãããã€ã®é£ããã«åé¡ããããŸããã ååã«äœæ¥æ¹æ³ãæããããã«ãããã·ã³ãã«ãªãœãªã¥ãŒã·ã§ã³ãå¿ èŠã§ããïŒããšãã°ãåãäŒæãSkypeã«åº§ã£ãŠã»ããã¢ããã®æäŒããããããªãïŒã ãããã£ãŠãkubernetesã¯æŸçœ®ãããŸããã Dockerèªäœã¯æ®ããã³ã³ããã«ãŒãã£ã³ã°ã®ãœãªã¥ãŒã·ã§ã³ãèŠã€ããå¿ èŠããããŸããã ãããã¯ç°ãªãããŒãã§ååŸã§ãããããåãnginxãå éšãªãã€ã¬ã¯ãã«äœ¿çšã§ããŸãã ããã¯ããªããŒã¹ãããã·ãµãŒããŒãšåŒã°ããŸãã
ãªããŒã¹ãããã·ãµãŒããŒã¯ãå€éšãããã¯ãŒã¯ããå éšãããã¯ãŒã¯ã«è«ççã«é 眮ããã1ã€ä»¥äžã®ãµãŒããŒã«ã¯ã©ã€ã¢ã³ãèŠæ±ãäžç¶ãããããã·ãµãŒããŒã®äžçš®ã§ãã åæã«ãèŠæ±ããããªãœãŒã¹ããããã·ãµãŒããŒã«çŽæ¥é 眮ãããŠãããã®ããã«ã¯ã©ã€ã¢ã³ãã«èŠããŸãã
ãªããŒã¹ãããã·
è»èŒªãåçºæããªãããã«ãç§ã¯æ¢æã®ãœãªã¥ãŒã·ã§ã³ãæ¢ãå§ããŸããã ãããŠãããçºèŠãããŸãã-ããã¯traefikã§ãã
TrÊfikã¯ããã€ã¯ããµãŒãã¹ã®å±éãç°¡çŽ åããææ°ã®HTTPãªããŒã¹ãããã·ããã³ããŒããã©ã³ãµãŒã§ãã TrÊfikã¯ãæ¢åã®ã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã³ããŒãã³ãïŒDockerãSwarmã¢ãŒããKubernetesãMarathonãConsulãEtcdãRancherãAmazon ECSãªã©ïŒãšçµ±åãããèªåçãã€åçã«æ§æãããŸãã Dockerã䜿çšããã«ã¯ããœã±ãããæå®ããã ãã§ååã§ããTrÊfikèªäœããã¹ãŠã®ã³ã³ãããšããããžã®ã«ãŒãã£ã³ã°ãæ€çŽ¢ããŸãïŒè©³çŽ°ã«ã€ããŠã¯ããDockerã§ã®ã¢ããªã±ãŒã·ã§ã³ã®ãããã³ã°ããåç §ïŒã
TrÊfikã³ã³ããã®æ§æ
docker-compose.ymlããèµ·åããŸã
version: '3' services: traefik: image: traefik:latest # The official Traefik docker image command: --api --docker # Enables the web UI and tells TrÊfik to listen to docker ports: - 443:443 - 80:80 # The HTTP port - 8080:8080 # The Web UI (enabled by --api) volumes: - /var/run/docker.sock:/var/run/docker.sock # So that Traefik can listen to the Docker events - /opt/traefik/traefik.toml:/traefik.toml - /opt/traefik/certs/:/certs/ networks: - proxy container_name: traefik restart: always networks: proxy: external: true
ããã§ãããŒã80ã443ã8080ïŒãããã·ã®Webãã§ã€ã¹ïŒããªãã¹ã³ããããã«ãŒãœã±ãããæ§æãã¡ã€ã«ãããã³èšŒææžãã©ã«ããŒãããŠã³ãããå¿ èŠãããããšããããã·ã«éç¥ããŸãã ãã¹ããµã€ãã®åœåã®äŸ¿å®äžãããŒã«ã«ãã¡ã€ã³ãŸãŒã³* .testãäœæããããšã«ããŸããã ãã®ãµã€ãã«ã¢ã¯ã»ã¹ãããšããŠãŒã¶ãŒã¯ãã¹ããµãŒããŒã«ã¢ã¯ã»ã¹ããŸãã ãããã£ãŠãtraefikãã©ã«ããŒå ã®èšŒææžã¯èªå·±çœ²åãããŠããŸãããLet's EncryptããµããŒãããŠããŸãã
蚌ææžã®çæ
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout domain.key -out domain.crt
éå§ããåã«ãDockerã§ãããã·ãããã¯ãŒã¯ãäœæããå¿ èŠããããŸãïŒç¬èªã®ååãä»ããããšãã§ããŸãïŒã
docker network create proxy
ããã¯ãtraefikãphpãµã€ãã®ã³ã³ããã«æ¥ç¶ããããã®ãããã¯ãŒã¯ã«ãªããŸãã ãããã£ãŠããã©ã¡ãŒã¿externalïŒtrueã§æå®ããããšã«ããããµãŒãã¹ã®ãããã¯ãŒã¯ãã©ã¡ãŒã¿ãšãã¡ã€ã«å šäœã®ãããã¯ãŒã¯ã§æå®ããŸãã
Traefik.tomlãã¡ã€ã«
debug = false logLevel = "DEBUG" defaultEntryPoints = ["https","http"] # insecureSkipVerify = true # [entryPoints] [entryPoints.http] address = ":80" [entryPoints.https] address = ":443" [entryPoints.https.tls] [docker] endpoint = "unix:///var/run/docker.sock" domain = "docker.localhost" watch = true exposedbydefault = false
ããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ããhttpããã³httpsãã©ãã£ãã¯ã®ãšã³ããªãã€ã³ããæå®ããŸãã蚌ææžãããŒã«ã«ã®å Žåã¯ãinsecureSkipVerify = trueãèšå®ããããšãå¿ããªãã§ãã ããã entryPoints.https.tlsã»ã¯ã·ã§ã³ã§ã¯ã蚌ææžãæå®ããããšã¯ã§ããŸãããtraefikã¯èšŒææžã眮ãæããŸãã
ãµãŒãã¹ãéå§ã§ããŸã
docker-compose up -d
site.testã¢ãã¬ã¹ã«ã¢ã¯ã»ã¹ãããšããã®ãã¡ã€ã³ã¯ã©ã®ã³ã³ããã«ãé¢é£ä»ããããŠããªãããã404ãšã©ãŒãçºçããŸãã
ããã«ãŒã«ã¢ããªã±ãŒã·ã§ã³ãããã¯ããŸã
次ã«ãã¢ããªã±ãŒã·ã§ã³ã§ã³ã³ãããæ§æããå¿ èŠããããŸãã
1.ãããã¯ãŒã¯ã§ãããã·ãããã¯ãŒã¯ãæå®ãã
2. traefikèšå®ã§ã©ãã«ãè¿œå ããŸã
以äžã¯ãããããã®ã¢ããªã±ãŒã·ã§ã³ã®æ§æã§ã
docker-compose.ymlã¢ããªã±ãŒã·ã§ã³
version: '3' services: app: build: data/docker/php # restart: always working_dir: /var/www/html/public volumes: - ./:/var/www/html # - /home/develop/site-files/f:/var/www/html/public/f # links: - mailcatcher - memcached - mysql labels: - traefik.enabled=true - traefik.frontend.rule=Host:TEST_DOMAIN,crm.TEST_DOMAIN,bonus.TEST_DOMAIN - traefik.docker.network=proxy - traefik.port=443 - traefik.protocol=https networks: - proxy - default mailcatcher: image: schickling/mailcatcher:latest restart: always memcached: image: memcached restart: always mysql: image: mysql:5.7 restart: always command: --max_allowed_packet=902505856 --sql-mode="" environment: MYSQL_ROOT_PASSWORD: 12345 MYSQL_DATABASE: site volumes: - ./data/cache/mysql-db:/var/lib/mysql # phpmyadmin: image: phpmyadmin/phpmyadmin restart: always links: - mysql environment: MYSQL_USERNAME: root MYSQL_ROOT_PASSWORD: 12345 PMA_ARBITRARY: 1 PMA_HOST: mysql_1 labels: - traefik.enabled=true - traefik.frontend.rule=Host:pma.TEST_DOMAIN - traefik.docker.network=proxy - traefik.port=80 - traefik.default.protocol=http networks: - proxy - default networks: proxy: external: true
ã¢ããªãµãŒãã¹ã®ãããã¯ãŒã¯ã»ã¯ã·ã§ã³ã§ããããã·ãšããã©ã«ããæå®ããå¿ èŠããããŸããããã¯ãæ§æãããããããã«ã2ã€ã®ãããã¯ãŒã¯ã§äœ¿çšã§ããããšãæå³ããŸããããŒããå€éšã«è»¢éããããã¹ãŠãããã¯ãŒã¯å ã«ç§»åããŸãã
次ã«ãã©ãã«ãæ§æããŸã
- traefik.enabled=true # traefik - traefik.frontend.rule=Host:TEST_DOMAIN,crm.TEST_DOMAIN,bonus.TEST_DOMAIN # traefik - traefik.docker.network=proxy # - traefik.port=443 #, ssl 80 http - traefik.protocol=https # # phpmyadmin http
äžè¬çãªãããã¯ãŒã¯ã»ã¯ã·ã§ã³ã§ãexternalïŒtrueãæå®ããŸã
TEST_DOMAINå®æ°ã¯ãsite.testãªã©ã®ãã¡ã€ã³ã«çœ®ãæããå¿ èŠããããŸã
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãã
docker-compose up -d
ããã§ãsite.testãcrm.site.testãbonus.site.testã®ãã¡ã€ã³ã«ç§»åãããšãäœæ¥ãµã€ãã衚瀺ãããŸãã ãŸãããã¡ã€ã³pma.site.testã«ã¯ãããŒã¿ããŒã¹ãæäœããããã®phpmyadminããããŸãã
GitLabãæ§æãã
ã¿ã¹ã¯ãã³ãã©ãŒãäœæãããã®ããã«å®è¡ããŸã
gitlab-runner register
gitlabã®URLãããŒã¯ã³ãããã³ã¿ã¹ã¯ã®å®è¡ã«äœ¿çšããããŒã¯ã³ïŒãšã°ãŒãã¥ãŒã¿ãŒïŒãæå®ããŸãã ãã¹ããšgitlabã¯ç°ãªããµãŒããŒäžã«ãããããssh executorãéžæããŸãã sshãä»ããŠæ¥ç¶ããã«ã¯ããµãŒããŒã¢ãã¬ã¹ãšãŠãŒã¶ãŒå/ãã¹ã¯ãŒããæå®ããå¿ èŠããããŸãã
ã©ã³ããŒã¯ã1ã€ä»¥äžã®ãããžã§ã¯ãã«æ·»ä»ã§ããŸãã ç§ã®äœæ¥ããžãã¯ã¯ã©ãã§ãåããªã®ã§ãå ±æã©ã³ããŒãäœæãããŸããïŒãã¹ãŠã®ãããžã§ã¯ãã«å ±éïŒã
æåŸã«ãCIæ§æãã¡ã€ã«ãäœæããŸã
.gitlab-ci.yml
stages: - build - clear # develop build_develop: stage: build # build tags: # - ssh-develop environment: # , - name: review/$CI_BUILD_REF_NAME # url: https://site$CI_PIPELINE_ID.test #url on_stop: clear when: manual script: - cd ../ && cp -r $CI_PROJECT_NAME $CI_PIPELINE_ID && cd $CI_PIPELINE_ID # - cp -r /home/develop/site-files/.ssh data/docker/php/.ssh # ssh - sed -i -e "s/TEST_DOMAIN/site$CI_PIPELINE_ID.test/g" docker-compose.yml # - docker-compose down # - docker-compose up -d --build # - script -q -c "docker exec -it ${CI_PIPELINE_ID}_app_1 bash -c \"cd ../ && php composer.phar install --prefer-dist \"" # - script -q -c "docker exec -it ${CI_PIPELINE_ID}_app_1 bash -c \"cd ../ && php composer.phar first-install $CI_PIPELINE_ID\"" # # production build_prod: stage: build tags: - ssh-develop environment: name: review/$CI_BUILD_REF_NAME url: https://site$CI_PIPELINE_ID.test on_stop: clear when: manual script: - cd ../ && cp -r $CI_PROJECT_NAME $CI_PIPELINE_ID && cd $CI_PIPELINE_ID - cp -r /home/develop/site-files/.ssh data/docker/php/.ssh # ssh - docker-compose down - docker-compose up -d --build - script -q -c "docker exec -it ${CI_PIPELINE_ID}_app_1 bash -c \"cd ../ && php composer.phar install --prefer-dist --no-dev\"" - script -q -c "docker exec -it ${CI_PIPELINE_ID}_app_1 bash -c \"cd ../ && php composer.phar first-install $CI_PIPELINE_ID\"" clear: stage: clear tags: - ssh-develop environment: name: review/$CI_BUILD_REF_NAME action: stop script: - cd ../ && cd $CI_PIPELINE_ID && docker-compose down && cd ../ && echo password | sudo -S rm -rf $CI_PIPELINE_ID # when: manual
ãã®æ§æã§ã¯ããã«ããšã¯ãªã¢ã®2ã€ã®æ®µéã«ã€ããŠèª¬æããŸãã ãã«ããã§ãŒãºã«ã¯2ã€ã®ãªãã·ã§ã³ããããŸã-build_developãšbuild_prod
![](https://habrastorage.org/webt/yz/ut/dy/yzutdyyknwjgwbcg4-kj2ssv-f8.png)
Gitlabã¯ãç解å¯èœãªããã»ã¹ãããŒå³ãäœæããŸãã ç§ã®äŸã§ã¯ããã¹ãŠã®ããã»ã¹ãæåã§éå§ãããŸãïŒæåãã©ã¡ãŒã¿ãŒã®å ŽåïŒã ããã¯ããã¹ããµã€ããå±éããåŸãéçºè ãã³ã³ããå šäœãåæ§ç¯ããã«ç·šéå 容ãã³ã³ããã«ãã«ã§ããããã«ããããã§ãã å¥ã®çç±ã¯ããã¡ã€ã³å-ãµã€ã$ CI_PIPELINE_ID.testã§ããCI_PIPELINE_IDã¯ãã¢ã»ã³ããªãéå§ããããã»ã¹ã®çªå·ã§ãã ã€ãŸããæ€èšŒã®ããã«ãã¡ã€ã³site123.testã䜿çšããŠãµã€ããéä¿¡ããŸãããããããšãã£ãããè¡ãããã«ãéçºè ã¯ããã«å€æŽãã³ã³ããã«æµã蟌ã¿ãŸãã
sshãšã°ãŒãã¥ãŒã¿ãŒã®å°ããªæ©èœã ãµãŒããŒã«æ¥ç¶ãããšããã©ãŒã ã®ãã©ã«ããŒãäœæãããŸãã
/home//builds/_runner/0/_/_
ãããã£ãŠãè¡ãè¿œå ãããŸãã
cd ../ && cp -r $CI_PROJECT_NAME $CI_PIPELINE_ID && cd $CI_PIPELINE_ID
ãã®äžã§ãäžã®ãã©ã«ããŒã«ç§»åãããããžã§ã¯ããããã»ã¹çªå·ã®ãããã©ã«ããŒã«ã³ããŒããŸãã ãããã£ãŠã1ã€ã®ãããžã§ã¯ãã®è€æ°ã®ãã©ã³ããå±éã§ããŸãã ãã ãããã³ãã©ãŒã®èšå®ã§ã¯ã[çŸåšã®ãããžã§ã¯ãã«ããã¯]ããªã³ã«ããå¿ èŠããããŸãããã®ããããã³ãã©ãŒã¯åæã«è€æ°ã®ãã©ã³ããå±éããããšããŸããã
ã¯ãªã¢ã¹ããŒãžã¯ã³ã³ãããåæ¢ãããã©ã«ããåé€ããŸããã«ãŒãæš©éãå¿ èŠãªå Žåãããããããšã³ãŒãã¹ã¯ãŒãã䜿çšããŸãã sudo -S rmãããã§passwordã¯ãã¹ã¯ãŒãã§ãã
ã¬ããŒãžã³ã¬ã¯ã·ã§ã³
æã ãã¹ããŒã¹ãå æããªãããã«æªäœ¿çšã®ã³ã³ãããåé€ããå¿ èŠããããŸããããã¯ããã®ãããªã³ã³ãã³ããå«ãã¹ã¯ãªãããã¯ã©ãŠã³ã«ãã³ã°ã¢ããããããã§ãã
#!/bin/bash # : docker ps --filter status=dead --filter status=exited -aq | xargs -r docker rm -v # : yes | docker container prune # : yes | docker image prune # : yes | docker volume prune
1æ¥ã«1åå®è¡ããŸãã
ãããã«
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ããã¹ããšæ°æ©èœã®ãªãªãŒã¹ãå€§å¹ ã«æé©åããã®ã«åœ¹ç«ã¡ãŸããã 質åã«çããæºåãã§ããŠã建èšçãªæ¹å€ã¯åãå ¥ããããŸãã
ããŒãã¹
æ¯åDockerfileããç»åãåéããªãããã«ãããŒã«ã«ã®dockerã¬ãžã¹ããªã«ä¿åã§ããŸãã
ãã¡ã€ã«docker-compose.yml
registry: restart: always image: registry:2 ports: - 5000:5000 volumes: - /opt/docker-registry/data:/var/lib/registry #
ãã®ãªãã·ã§ã³ã¯èªèšŒã䜿çšããŸãããããã¯å®å šãªæ¹æ³ã§ã¯ãããŸããïŒ!!!ïŒããéèŠã§ã¯ãªãã€ã¡ãŒãžã®ä¿åã«ã¯é©ããŠããŸãã
衚瀺ããããã«gitlabãæ§æã§ããŸã
gitlab_rails['registry_enabled'] = true gitlab_rails['registry_host'] = "registry.test" gitlab_rails['registry_port'] = "5000"
ãã®åŸãç»åã®ãªã¹ããgitlabã«è¡šç€ºãããŸã
![](https://habrastorage.org/webt/lu/hn/8i/luhn8ilow44doqm5btrtafgv-hq.png)