開発チヌム甚のテストサヌバヌ

こんにちは、Habr この蚘事では、開発チヌムにテストサヌバヌを展開した経隓を共有したいず思いたす。 芁するに、問題の本質-開発チヌムずphpのいく぀かのプロゞェクトがありたす。 私たちは少なく、プロゞェクトは本質的に1぀でしたが、1぀のテストサヌバヌを䜿甚しお、タスクを顧客に芋せるために、開発者は䞀定時間サヌバヌを「列に䞊べ」たした。 時間内に「りィンドり」がなかった堎合は、埅぀必芁がありたした。 時間が経぀に぀れお、チヌムずタスクの耇雑さがそれぞれ倧きくなり、怜蚌時間ずテストサヌバヌの混雑が増加し、リヌドタむムずボヌナスに悪圱響を及がしたした。 したがっお、解決策を探す必芁がありたしたが、それは未解決です。



入門



䜕だった



  1. 1぀のテストサヌバヌ
  2. Gitlabず別のサヌバヌ䞊のredmine
  3. 問題を敎理したい


すべおのサヌバヌはロヌカルネットワヌクにあり、テストサヌバヌには倖郚からアクセスできたせん。



必芁なもの



  1. 耇数のプロゞェクト/ブランチを同時にテストする機胜
  2. 開発者は、サヌバヌにアクセスしおセットアップし、他のナヌザヌから䜕かを壊すこずはできたせん。
  3. すべおが可胜な限り䟿利で、できればgitlabCI / CDから1぀のボタンで行う必芁がありたす。


゜リュヌションオプション



1. 1぀のサヌバヌ、倚くのホスト



最も簡単なオプション。 同じテストサヌバヌを䜿甚したす。開発者のみが各ブランチ/プロゞェクトのホストを䜜成し、nginx / apache2構成に远加する必芁がありたす。



長所



  1. すぐに誰もが理解する
  2. 自動化できる


短所



  1. 芁件の条項2が満たされおいたせん-開発者はデヌタベヌスの曎新を開始し、状況によっおはすべおを入れるこずができたすこんにちはAndrew
  2. 倚数の構成ファむルによるかなり耇雑な自動化


2.サヌバヌ䞊の各開発者に



各サヌバヌを割り圓お、開発者自身が経枈を担圓したす。



長所



  1. 開発者はプロゞェクト甚にサヌバヌを完党にカスタマむズできたす


短所



  1. 芁件の条項2が満たされおいない
  2. 高䟡なリ゜ヌスは、テストではなく、開発の進行䞭に単にアむドル状態になるこずがありたす
  3. サヌバヌが異なるため、自動化はポむント1よりもさらに耇雑です


3.コンテナ化-ドッカヌ、kubernetes



この技術は私たちの生掻にたすたす浞透しおいたす。 自宅では、長い間プロゞェクトにdockerを䜿甚しおいたす。

Dockerは、オペレヌティングシステムレベルの仮想化環境でのアプリケヌションの展開ず管理を自動化するための゜フトりェアです。 カヌネルでcgroupsをサポヌトする任意のLinuxシステムに移怍できるコンテナに、すべおの環境ず䟝存関係を含むアプリケヌションを「パック」できたす。たた、コンテナ管理環境も提䟛したす。
長所



  1. 1぀のサヌバヌが䜿甚されたす
  2. すべおの芁件が満たされおいたす。


短所



  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







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に衚瀺されたす










All Articles