á€áá±á¬ááºážáá«ážááẠá ááºážáááºáá°áá»á¬ážááŸáá·áº developer ááŸá áºáŠážá áá¯á¶ážá¡ááœáẠá áááºáááºá á¬ážááœááºááŒá áºáá±á¬áºáááºáž á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶á¡áááºážá¡ááŒá áºááá¯á¶áá±á¬ááºááŸá¯ááŸáá·áº/ááá¯á·ááá¯áẠááœááºááááºáá¬áá®ážááŸá¯ááºááŸá¯áááŸááá«á áá±á«ááºážá ááºá á áºáá±ážááŸá¯á¡ááœáẠGitLab CI/CD ááá¯ááá·áºááœááºážáááºááŸááºááŒááºážááŒá¿áá¬ááŸáá·áºáááºááá¯ááºáá±ááá±á¬ á¡ááá¯á¡áá»á±á¬ááºá áá áºáá»áœááºážáá»ááºáá°áá»á¬ážá¡ááœáẠá¡ááááááºááœááºáá«áááºá ááááºáá±á¬ááºážá GitLab shell runner áá áºáá¯áááºážááœáẠdocker compose ááá¯á¡áá¯á¶ážááŒá¯á test environment áá»á¬áž ááŒáá·áºáá»ááºááŒááºážá¡á¬áž áááºááá¯á·áááºááŸááºááááºááᯠáá»áœááºá¯ááºááŒá±á¬ááŒáááºááŒá áºááŒá®ážá ááá¯á·ááŸáᬠáááºáááºážáá»ááºáá»á¬ážá áœá¬ááᯠááŒáá·áºáá»ááºáá±á¬á¡áá«á á áááºááá¯ááºáá±á¬áááºáá±á¬ááºááŸá¯áá»á¬ážááẠáá áºáá¯ááŸáá·áºáá áºáᯠá¡ááŸá±á¬áá·áºá¡ááŸááºáááŒá áºá á±áááºá
á¡ááŒá±á¬ááºážá¡áá¬
ááá¯á¡ááºáá»áẠGitLab Shell Runner docker-compose.yml ááᯠááŒááºáááºáá±áááºá Makefile ááá¯ááŒááºáááºááŒááºážá .gitlab-ci.yml ááŒááºáááºáá±áááºá ááááº
ááá¯á¡ááºáá»ááº
-
áá»áœááºá¯ááºááááºááœá±á·ááœááºá áá±á«ááºážá ááºážááŒááºážá ááºážáááºááŒááºážááᯠááá±á¬áá»ááºáá»á¬ážááœáẠ"áááºáá¶" ááŒá±á¬ááºáž áááŒá¬áá ááŒá áºáá»ááºáá²á·áááºá áááŒá¬ááááá¯áááᯠááááá¯á¶ážááŸáá·áº á¡áááºááŸá¬ážáá¯á¶ážááŒá¿áá¬ááŸá¬ áá±á«ááºážá ááºá ááºážáááºááŒááºážááŒá áºááá·áº CI ááá¯ááºááá¯ááºážááŒá áºáááºá ááœá¶á·ááŒáá¯ážááá¯ážáááºáá»ááºááŸááááºá áááºáá±á¬ááºááŸá¯(áá»á¬áž)ááᯠdev/stage áááºáááºážáá»ááºááœáẠáá¯ááºáá±á¬ááºáááºá áááºážááẠááŒá¿áá¬á¡áááºážáááºááᯠááŒá áºá á±áááº-
- áá±á«ááºážá ááºá ááºážáááºáá±á ááºá¡ááœááºáž áááºáá±á¬ááºááŸá¯áá áºáá¯á áá»áá¯á·ááœááºážáá»ááºáá»á¬ážááŒá±á¬áá·áºá á ááºážáááºáááºáááºážááẠáá»ááºá á®ážáá±áá±á¬áá±áá¬ááŒá±á¬áá·áº áá»ááºá á®ážááœá¬ážááá¯ááºáááºá áá»áá¯ážáá²á·áá±áá±á¬ JSON áá±á¬áºáááºááŒáá·áº áá±á¬ááºážááá¯ááŸá¯áá áºáᯠáá±ážááá¯á·áá±á¬á¡áá«ááœáẠáááºáá±á¬ááºááŸá¯ááᯠáá»ááºááŒááºááœá¬ážáá²á·ááŒá®áž áááºáááºáá»ááºááᯠáá¯á¶ážááá¯ááºáá±á¬ááºááááá«á
- á ááºážáááºááŸá¯áá±áᬠááá¯ážáá¬áááºááŸáá·áºá¡áá»áŸ á ááºážáááºáááºáááºáž ááŸá±ážááœá±ážááœá¬ážáááºá áá±áá¬áá±á·á áºááᯠááá·áºááŸááºážáá±áž/ááŒááºááŸáá·áºááŒááºážáá²á· á¥ááá¬áá áºáá¯ááᯠáá±á¬áºááŒáá¬áᬠá¡áááá¹áá¬ááºáááŸááá°ážááá¯á·áááºáá«áááºá áá»áœááºá¯ááºááááºááœá±á·ááœááºá á€áá¯ááºáá¯á¶ážáá¯ááºáááºážááᯠáá»á±á¬ááœá±á·á áœá¬áá±á¬ááºááœááºááá·áº ááá±á¬áá»ááºááᯠáá»áœááºá¯ááºáááŒá¯á¶ááœá±á·áá²á·áá«á
- áá±áá°áá»á áá áºáááºáááºáá»á¬ážááᯠá ááºážáááºááá·áºá¡áá« á ááºážáááºáááºáááºážá áá¯ááºáá±á¬ááºááá¯ááºá áœááºážááᯠá¡ááŸá±á¬áá·áºá¡ááŸááºááŒá áºááá¯ááºááŒá±á á¥ááá¬á á¡áá¯á¶ážááŒá¯áá°/á¡á¯ááºá á¯/á áá¬ážááŸááº/á¡ááá®áá±ážááŸááºáž áá°áá«áá
- á¡ááá¯á¡áá»á±á¬ááºá ááºážáááºááŸá¯áá»á¬ážá០á ááºážáááºááŸá¯áá±áá¬ááẠáááºá áœá²á ááºážáááºáá°áá»á¬ážá¡ááœáẠááá¡áááºá¡áá²ááŒá áºá á±áááºá
áá±á¬ááºážáá±á¬ autotests áá»á¬ážááẠáááºážááá¯á·ááŒá®ážáá±á¬áẠáá±áá¬áá»á¬ážááᯠááŸááºážáááºážááá·áºáááºáᯠá¡áá»áá¯á·á ááá¯ááŒáááºá áá»áœááºá¯ááºááœáẠááŒááºážáá¯á¶ááŸá¯áá»á¬ážááŸááááº-
- Dynamic Stands áá»á¬ážááẠá¡áá¯á¶ážááŒá¯ááẠá¡ááœááºá¡áááºááŒá±áááºá
- API ááŸáá áºááá·áº á¡áá¬ááá¹áá¯ááá¯ááºážááᯠá áá áºá០áááºááŸá¬ážááááá«á á¥ááá¬á¡á¬ážááŒáá·áºá á¡áá¬ááá¹áá¯áá áºáá¯ááᯠáá»ááºááẠáá±á«áºááá¯ááŸá¯áá áºáá¯ááẠáá¯ááºáááºážááá¯ááºáᬠáá¯áá¹áááá±áááŸáá·áº ááá·áºáá»ááºáááºááŒá áºáá±á¬ááŒá±á¬áá·áº á¡áá±á¬ááºá¡áááºááá±á¬áºááá¯ááºáá²á·áá«á
- API ááŸáá áºááá·áº á¡áá¬ááá¹áá¯áá áºáá¯ááᯠáááºáá®ážááá·áºá¡áá«á áá»ááºáááºá¡áááºá¡áá²ááŒá áºááá·áº áááºáá¬áá±áᬠá¡áá»á¬ážá¡ááŒá¬ážááᯠáááºáá®ážááá¯ááºáááºá
- á ááºážáááºááŸá¯áá»á¬ážááœáẠáááºážááá¯á·á¡áá»ááºážáá»ááºáž ááŸá®ááá¯áá±ááá«áá á ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºááŒá®ážáá±á¬áẠáá±áá¬ááŸááºážáááºážááŒááºážáá¯ááºáááºážá ááºááẠáá±á«ááºážááá¯ááºááŒááºážááá¯á· ááŒá±á¬ááºážáá²ááœá¬ážáá«áááºá
- API ááá¯á· á¡ááá¯áááºáá±á¬ááºáž (áá»áœááºá¯ááºáá¡ááŒááºá¡áá ááá¬ážáá»áŸáááŒááºážáááŸááá«) áá±á«áºááá¯ááŸá¯áá»á¬ážá
- ááŸáá·áºá¡áááá¡ááŒááºážá¡áá¯á¶- á ááºážáááºáá±áá¬ááá¯áá±áá¬áá±á·á áºááŸááá¯ááºááá¯ááºááŸááºážáááºážáááºá áááºáá±á¬á¡áá«á áááºážááẠáááá·áº PK/FK áááºáááºááœá²á¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²ááœá¬ážáá«áááºá áá±á¬á·ááºáá²áá±ážáá¬ážáá°áá»á¬ážáá¶á០áá»áœááºá¯ááºááá¯á·ááŒá¬ážááááº- "áá»áœááºáá±á¬áºá ááá¯ááºážáá¯ááºáá áºáá¯ááᯠáá±á«ááºážááá·áº/áááºááŸá¬áž/á¡áááºááŒá±á¬ááºážááá¯ááºá áá±á«ááºážá ááºážááŸá¯á ááºážáááºááŸá¯ 100500 ááᯠáá¬ááŒá±á¬áá·áºáááºážáááá¬áá²á"
áá»áœááºáá±á¬á·áºá¡ááŒááºá¡áá á¡áá±á¬ááºážáá¯á¶ážááŒá±ááŸááºážáá»ááºááŸá¬ áááºááŒáœáá±á¬áááºáááºážáá»ááºáá áºáá¯ááŒá áºáááºá
- áá°áá»á¬ážá áœá¬ááẠá ááºážáááºááŸá¯áááºáááºážáá»ááºááá¯áááºáááºááẠdocker-compose ááá¯á¡áá¯á¶ážááŒá¯áá±á¬áºáááºáž CI/CD ááœáẠáá±á«ááºážá ááºá á áºáá±ážááŸá¯ááŒá¯áá¯ááºáá±á¬á¡áá«ááœáẠdocker-compose ááᯠáá°á¡áááºážáááºá á¡áá¯á¶ážááŒá¯ááŒáááºá á€áá±áá¬ááœáẠáá»áœááºá¯ááºááẠkubernetesá swarm ááŸáá·áº á¡ááŒá¬ážáá±á¬ container orchestration platform áá»á¬ážááᯠááá·áºááœááºážá ááºážá á¬ážáááºááá¯ááºáá«á áá¯áá¹ááá®ááá¯ááºážááœáẠáááºážááá¯á·áááŸááá±á docker-compose.yml ááẠuniversal ááŒá áºáá«á áá±á¬ááºážáá«áááºá
- áá»áœááºá¯ááºááá¯á·ááœáẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯áẠQA á¡ááŒá±ážááá¬ážááŸááá»áŸááºáááºá docker-compose ááŸáá áºááá·áº á áááºááá·áºáááºáá±á¬ááºááŸá¯áá»á¬ážááẠáá áºáá¯ááŸáá·áºáá áºáᯠá¡ááŸá±á¬áá·áºá¡ááŸááºáááŒá áºá¡á±á¬áẠáááºááá¯á·ááŒá¯áá¯ááºááá¯ááºáááºáááºážá
- á ááºážáááºáá¬ážáá±á¬ áááºáá±á¬ááºááŸá¯ááŸááºáááºážáá»á¬ážááᯠáááºááá¯á·á á¯áá±á¬ááºážááááºáááºážá
- á¡ááŒá±ážááá¬ážááᯠáááºááá¯ááá·áºááŸááºážáá±ážáá¯ááºááá²á
áá»áœááºá¯ááºáááá±á¬áá»ááºáá»á¬ážá¡ááœáẠáá»áœááºá¯ááºáááá¯ááºááá¯áẠGitLab á¡ááŒá±ážááá¬ážááŸáááŒá®áž ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá¬áá¡ááœááºáž á€áá±ážááœááºážáá»á¬ážááᯠáá»áœááºá¯ááºááŒá¯á¶ááœá±á·áá²á·ááááºá
GitLab Shell Runner
á¡ááŒá±ážááá¬ážá¡ááœáẠ4 vCPUá 4 GB RAMá 50 GB HDD áá«ááá·áº Linux virtual machine ááᯠá¡ááŒá¶ááŒá¯áá«áááºá
á¡ááºáá¬áááºáá±á«áºááœáẠgitlab-runner ááá¯á
ááœáá·áºáááºááŸááºááŒááºážááá¯ááºáᬠá¡áá»ááºá¡áááºáá»á¬ážá
áœá¬ááŸááááºá ááá¯á·ááŒá±á¬áá·áº á¡ááá¯áá»á¯á¶ážááŒá±á¬ááááº-
- SSH ááŸáá áºááá·áº á ááºááá¯á· áááºáá±á¬ááºáá«á
-
ááá·áºááœáẠ8 GB RAM áááºáááºážáá«á áá»áœááºá¯ááºá¡ááŒá¶ááŒá¯ááá¯áá«áááºá
10 GB áá²ááŸááºáá«á ááá¯á·ááŒá±á¬áá·áº OOM áá°áááºááá¬ážááẠRAM áááŸááá±á¬ááŒá±á¬áá·áºáá»áœááºá¯ááºááá¯á·ááá¬áááºáá»á¬ážááá¯ááááºááá¯ááºáá«á á¡áá¯áẠ5 áá¯áááºááá¯ááŒá®áž áááŒáá¯ááºáááºáááºáž áá¯ááºáá±á¬ááºááá·áºá¡áá« áááºážááẠááŒá áºáá±á«áºáá¬ááá¯ááºáááºá áá¯ááºáááºážáá¬áááºáá»á¬ážááẠááŸá±ážááœá±ážáá±á¬áºáááºáž ááŸááºááŸááºááá¯ážáááºáááºáOOM áá°áááºááá¬ážááŸáá·áº á¥ááá¬
Task logs ááŸá¬ááœá±á·áááº
bash: line 82: 26474 Killed
ááŒá®ážááẠá¡ááŒá±ážááá¬ážááᯠáááºááá¯ááºáá¯á¶áá«áá²ásudo dmesg | grep 26474
[26474] 1002 26474 1061935 123806 339 0 0 java Out of memory: Kill process 26474 (java) score 127 or sacrifice child Killed process 26474 (java) total-vm:4247740kB, anon-rss:495224kB, file-rss:0kB, shmem-rss:0kB
áá¯á¶á áá®ááá¯áá»áá¯ážááŒá áºáá±ááẠswap ááá·áºááŒá®áž RAM ááá·áºáá±ážááá¯ááºáá«á
- ááá·áºááœááºážáá«
gitlab-á¡ááŒá±ážááá¬áž ,áááºá¹ááá¬áá« ,docker-compose áá¯ááºáá« - á¡áá¯á¶ážááŒá¯áá°áá
áºáŠážááᯠááá·áºááœááºážááŒááºážá
gitlab-runner
á¡ááœá²á·ááá¯á·docker
sudo groupadd docker sudo usermod -aG docker gitlab-runner
ááŸááºáá¯á¶áááºáá«á gitlab-á¡ááŒá±ážááá¬ážá-
áááºážááŒááºááẠááœáá·áºáá«á
/etc/gitlab-runner/config.toml
ááŸáá·áºááá·áºáá«áconcurrent=20 [[runners]] request_concurrency = 10
áááºážááẠá¡ááŒá±ážááá¬ážáá áºáŠážááœáẠá¡ááŒáá¯ááºáá¯ááºáá±á¬ááºá áá¬áá»á¬ážááᯠáá¯ááºáá±á¬ááºááá¯ááºáááºááŒá áºáááºá ááá¯ááŒá®ážáááºáá«
áá®ááŸá¬ .
á¡áááºá ááá·áºááœáẠááá¯ááá¯á¡á¬ážáá±á¬ááºážáá±á¬á ááºáá áºáá¯á á¥ááᬠ8 vCPUá 16 GB RAM ááŸááá«áá á€áá¶áá«ááºáá»á¬ážááᯠá¡áááºážáá¯á¶áž á á ááá¯ááŒá®ážá¡á±á¬ááºáá¯ááºááá¯ááºáááºá áá«áá±ááá·áº áá®á¡ááŒá±ážááá¬ážááᯠáááºá¡áá±á¡ááœááºáá²á· áááºá¡áá±á¡ááœááºáá²á· á¡ááá¡áá»ááœááºáááºááá¯áá¬áá±á«áºááŸá¬ áá°áááºáá«áááºá
áá¯á¶áá±á¬ááºáá«ááŒá®á
docker-compose.yml ááᯠááŒááºáááºáá±áááºá
á¡ááááá¬áááºááŸá¬ developer/testers áá»á¬ážááẠá ááºááœááºážááŸáá·áº CI ááá¯ááºááá¯ááºážááœáẠááŸá áºáá»áá¯ážáá¯á¶ážá¡áá¯á¶ážááŒá¯ááá¯ááºááá·áº universal docker-compose.yml ááŒá áºáááºá
ááááŠážá
áœá¬á áá»áœááºá¯ááºááá¯á·ááẠCI á¡ááœáẠáá°ážááŒá¬ážáá±á¬áááºáá±á¬ááºááŸá¯á¡áááºáá»á¬ážááᯠááŒá¯áá¯ááºáá«áááºá GitLab CI ááœááºáá°ážááŒá¬ážáá±á¬ááááºážááŸááºáá»á¬ážáá²ááŸáá
áºáá¯ááŸá¬ variable ááŒá
áºáááºá CI_JOB_ID
. áááºááŸááºáááºááá¯ááẠcontainer_name
á¡áááá¹áá«ááºáá²á· "service-${CI_JOB_ID:-local}"
ááá¯á·áá±á¬áẠááá
á¹á
áááºááœááºá
- áá»áŸááº
CI_JOB_ID
Environment variable áá»á¬ážááœáẠááááºááŸááºáá¬ážá
ááá¯á·áá±á¬áẠáááºáá±á¬ááºááŸá¯á¡ááẠááŒá áºáááá·áºáááºáservice-local
- áá»áŸááº
CI_JOB_ID
áááºáááºážáá»ááºááœáẠáááºááŸááºáá¬ážáá±á¬ ááááºážááŸááºáá»á¬áž (á¥ááᬠ123)á
ááá¯á·áá±á¬áẠáááºáá±á¬ááºááŸá¯á¡ááẠááŒá áºáááá·áºáááºáservice-123
áá¯áááá¡áá±ááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠá áááºáá±á¬ááºááœááºáá±á¬ áááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠáá¯á¶ááœááºáááºáá áºáá¯ááᯠáááºáá®ážáá«áááºá áááºážááẠá ááºážáááºááŸá¯áááºáááºážáá»ááºáá»á¬ážá áœá¬ááᯠáá¯ááºáá±á¬ááºááá·áºá¡áá« ááœááºáááºá¡ááá·áº áá®ážááŒá¬ážááœá²áá¯ááºááŒááºážááᯠáá±ážáááºá
networks:
default:
external:
name: service-network-${CI_JOB_ID:-local}
ááááºáá±á¬á· áá«á á¡á±á¬ááºááŒááºááŸá¯áá²á· áááááŒá±ááŸááºáž =)
ááŸááºáá»ááºáá»á¬ážááŸáá·áºá¡áá° áá»áœááºá¯ááºá docker-compose.yml ááá°áá¬
version: "3"
# ÐÐ»Ñ ÐºÐŸÑÑекÑМПй ÑабПÑÑ web (php) О fmt ÐœÑжМП,
# ÑÑÐŸÐ±Ñ ÐºÐŸÐœÑейМеÑÑ ÐžÐŒÐµÐ»Ðž ПбÑОй ОÑпПлМÑеЌÑй кПМÑеМÑ.
# РМаÑеЌ ÑлÑÑае, ÑÑП ЎОÑекÑПÑÐžÑ /var/www/testrail
volumes:
static-content:
# ÐзПлОÑÑеЌ ПкÑÑжеМОе Ма ÑеÑевПЌ ÑÑПвМе
networks:
default:
external:
name: testrail-network-${CI_JOB_ID:-local}
services:
db:
image: mysql:5.7.22
# ÐажЎÑй container_name ÑПЎеÑÐ¶ÐžÑ ${CI_JOB_ID:-local}
container_name: "testrail-mysql-${CI_JOB_ID:-local}"
environment:
MYSQL_HOST: db
MYSQL_DATABASE: mydb
MYSQL_ROOT_PASSWORD: 1234
SKIP_GRANT_TABLES: 1
SKIP_NETWORKING: 1
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- default
migration:
image: registry.gitlab.com/touchbit/image/testrail/migration:latest
container_name: "testrail-migration-${CI_JOB_ID:-local}"
links:
- db
depends_on:
- db
networks:
- default
fpm:
image: registry.gitlab.com/touchbit/image/testrail/fpm:latest
container_name: "testrail-fpm-${CI_JOB_ID:-local}"
volumes:
- static-content:/var/www/testrail
links:
- db
networks:
- default
web:
image: registry.gitlab.com/touchbit/image/testrail/web:latest
container_name: "testrail-web-${CI_JOB_ID:-local}"
# ÐÑлО пеÑеЌеММÑе TR_HTTP_PORT ОлО TR_HTTPS_PORTS Ме ПпÑеЎелеМÑ,
# ÑП ÑеÑÐ²ÐžÑ Ð¿ÐŸÐŽÐœÐžÐŒÐ°ÐµÑÑÑ ÐœÐ° 80 О 443 пПÑÑÑ ÑППÑвеÑÑÑвеММП.
ports:
- ${TR_HTTP_PORT:-80}:80
- ${TR_HTTPS_PORT:-443}:443
volumes:
- static-content:/var/www/testrail
links:
- db
- fpm
networks:
- default
Local run á¥ááá¬
docker-compose -f docker-compose.yml up -d
Starting testrail-mysql-local ... done
Starting testrail-migration-local ... done
Starting testrail-fpm-local ... done
Recreating testrail-web-local ... done
ááá¯á·áá±á¬áº CI ááœááºááœáá·áºááá¯ááºááŒááºážááŒáá·áº á¡áá¬á¡á¬ážáá¯á¶ážááẠááá¯ážááŸááºážáááºááá¯ááºáá«á
Makefile ááá¯ááŒááºáááºááŒááºážá
áá±ááá¶áááºáááºážáá»ááºá á®áá¶ááá·áºááœá²ááŸá¯ááŸáá·áº CI á¡ááœáẠá¡ááœááºá¡áááºááŒá±áá±á¬ááŒá±á¬áá·áº Makefile ááá¯á¡áá¯á¶ážááŒá¯áá«áááºá á¡áœááºááá¯ááºážááŸááºáá»ááºáá»á¬áž
# У ÐŒÐµÐœÑ Ð² пÑПекÑаÑ
вÑе вÑпПЌПгаÑелÑÐœÑе веÑО Ð»ÐµÐ¶Ð°Ñ Ð² ЎОÑекÑПÑОО `.indirect`,
# в ÑПЌ ÑОÑле О `docker-compose.yml`
# ÐÑпПлÑзПваÑÑ bash Ñ ÐŸÐ¿ÑОей pipefail
# pipefail - ÑÐµÐ¹Ð»ÐžÑ Ð²ÑпПлМеМОе пайпа, еÑлО кПЌаМЎа вÑпПлМОлаÑÑ Ñ ÐŸÑОбкПй
SHELL=/bin/bash -o pipefail
# ÐÑÑаМавлОваеЌ кПМÑейМеÑÑ Ðž ÑЎалÑеЌ ÑеÑÑ
docker-kill:
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm network-$${CI_JOB_ID:-testrail} || true
# ÐÑеЎваÑОÑелÑМП вÑпПлМÑеЌ docker-kill
docker-up: docker-kill
# СПзЎаеЌ ÑеÑÑ ÐŽÐ»Ñ ÐŸÐºÑÑжеМОÑ
docker network create network-$${CI_JOB_ID:-testrail}
# ÐабОÑаеЌ пПÑлеЎМОе ПбÑÐ°Ð·Ñ ÐžÐ· docker-registry
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml pull
# ÐапÑÑкаеЌ ПкÑÑжеМОе
# force-recreate - пÑОМÑЎОÑелÑМПе пеÑеÑПзЎаМОе кПМÑейМеÑПв
# renew-anon-volumes - Ме ОÑпПлÑзПваÑÑ volumes пÑеЎÑÐŽÑÑОÑ
кПМÑейМеÑПв
docker-compose -f $${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
# ÐÑ Ðž, Ма вÑÑкОй ÑлÑÑай, вÑвеÑÑО ÑÑП ÑаЌ Ñ ÐœÐ°Ñ Ð² пÑОМÑОпе запÑÑеМП Ма ЌаÑОМке
docker ps
# ÐПллекÑОЌ лПгО ÑеÑвОÑПв
docker-logs:
mkdir ./logs || true
docker logs testrail-web-$${CI_JOB_ID:-local} >& logs/testrail-web.log
docker logs testrail-fpm-$${CI_JOB_ID:-local} >& logs/testrail-fpm.log
docker logs testrail-migration-$${CI_JOB_ID:-local} >& logs/testrail-migration.log
docker logs testrail-mysql-$${CI_JOB_ID:-local} >& logs/testrail-mysql.log
# ÐÑОÑÑка ÑаММеÑа
docker-clean:
@echo ÐÑÑаМавлОваеЌ вÑе testrail-кПМÑейМеÑÑ
docker kill $$(docker ps --filter=name=testrail -q) || true
@echo ÐÑОÑÑка ÐŽÐŸÐºÐµÑ ÐºÐŸÐœÑейМеÑПв
docker rm -f $$(docker ps -a -f --filter=name=testrail status=exited -q) || true
@echo ÐÑОÑÑка dangling ПбÑазПв
docker rmi -f $$(docker images -f "dangling=true" -q) || true
@echo ÐÑОÑÑка testrail ПбÑазПв
docker rmi -f $$(docker images --filter=reference='registry.gitlab.com/touchbit/image/testrail/*' -q) || true
@echo ÐÑОÑÑка вÑеÑ
МеОÑпПлÑзÑеЌÑÑ
volume
docker volume rm -f $$(docker volume ls -q) || true
@echo ÐÑОÑÑка вÑеÑ
testrail ÑеÑей
docker network rm $(docker network ls --filter=name=testrail -q) || true
docker ps
áááºážá á áºáá±áž
docker-up ááŒá¯áá¯ááºáá«á
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
Killing testrail-web-local ... done
Killing testrail-fpm-local ... done
Killing testrail-mysql-local ... done
docker network rm network-${CI_JOB_ID:-testrail} || true
network-testrail
docker network create network-${CI_JOB_ID:-testrail}
d2ec063324081c8bbc1b08fd92242c2ea59d70cf4025fab8efcbc5c6360f083f
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Pulling db ... done
Pulling migration ... done
Pulling fpm ... done
Pulling web ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Recreating testrail-mysql-local ... done
Recreating testrail-fpm-local ... done
Recreating testrail-migration-local ... done
Recreating testrail-web-local ... done
docker ps
CONTAINER ID PORTS NAMES
a845d3cb0e5a 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp testrail-web-local
19d8ef001398 9000/tcp testrail-fpm-local
e28840a2369c 3306/tcp, 33060/tcp testrail-migration-local
0e7900c23f37 3306/tcp testrail-mysql-local
docker-logs ááŒá¯áá¯ááºáá«á
$ make docker-logs
mkdir ./logs || true
mkdir: cannot create directory â./logsâ: File exists
docker logs testrail-web-${CI_JOB_ID:-local} >& logs/testrail-web.log
docker logs testrail-fpm-${CI_JOB_ID:-local} >& logs/testrail-fpm.log
docker logs testrail-migration-${CI_JOB_ID:-local} >& logs/testrail-migration.log
docker logs testrail-mysql-${CI_JOB_ID:-local} >& logs/testrail-mysql.log
.gitlab-ci.yml ááŒááºáááºáá±áááºá
áá±á«ááºážá ááºá á áºáá±ážááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºáá±áááºá
Integration:
stage: test
tags:
- my-shell-runner
before_script:
# ÐÑÑеМÑОÑОÑОÑÑеЌÑÑ Ð² registry
- docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
# ÐеМеÑОÑÑеЌ пÑевЎПÑМОкалÑÐœÑе TR_HTTP_PORT О TR_HTTPS_PORT
- export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
- export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
# ÑПзЎаеЌ ЎОÑекÑПÑÐžÑ Ñ ÐžÐŽÐµÐœÑОÑОкаÑПÑПЌ заЎаÑО
- mkdir ${CI_JOB_ID}
# кПпОÑÑеЌ в ÑПзЎаММÑÑ ÐŽÐžÑекÑПÑÐžÑ ÐœÐ°Ñ docker-compose.yml
# ÑÑÐŸÐ±Ñ ÐºÐŸÐœÑекÑÑ Ð±Ñл ÑазМÑй ÐŽÐ»Ñ ÐºÐ°Ð¶ÐŽÐŸÐ¹ заЎаÑО
- cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
script:
# пПЎМОЌаеЌ МаÑе ПкÑÑжеМОе
- make docker-up
# запÑÑкаеЌ ÑеÑÑÑ ÐžÑпПлМÑеЌÑÐŒ jar (Ñ ÐŒÐµÐœÑ Ñак)
- java -jar itest.jar --http-port ${TR_HTTP_PORT} --https-port ${TR_HTTPS_PORT}
# ОлО в кПМÑейМеÑе
- docker run --network=testrail-network-${CI_JOB_ID:-local} --rm itest
after_script:
# ÑПбОÑаеЌ лПгО
- make docker-logs
# ПÑÑаМавлОваеЌ ПкÑÑжеМОе
- make docker-kill
artifacts:
# ÑПÑ
ÑаМÑеЌ лПгО
when: always
paths:
- logs
expire_in: 30 days
ááá¯ááá¯á·áá¯ááºáá±á¬ááºááŒááºážáááááºá¡áá±ááŒáá·áºá artifacts ááŸá ááŸááºáááºážáá»á¬ážáááºážááœáŸááºááœáẠáááºáá±á¬ááºááŸá¯ááŸáá·áº á ááºážáááºááŸá¯ááŸááºáááºážáá»á¬ážáá«ááŸááááºá error áá»á¬ážááẠá¡áááºážá¡áááºááŒá±áá«áááºá á¡ááŒáá¯ááºá ááºážáááºááŸá¯áá áºáá¯á á®áááºáááºážáááá¯ááºááá¯ááºááŸááºáááºážááá¯áá±ážáááºá ááá¯á·áá±á¬áºá€á¡ááŒá±á¬ááºážááá¯áá®ážááŒá¬ážá á®ááŒá±á¬ááŒáá«áááºá
á¡ááŒá±ážááá¬ážááᯠááá·áºááŸááºážáá±ážáá¯ááºáá«á
á¡áá¯ááºá¡á¬áž á¡áá»áááºááá¬ážá¡ááá¯ááºážáᬠáá¯ááºáá±á¬ááºáá«áááºá
stages:
- clean
- build
- test
Clean runner:
stage: clean
only:
- schedules
tags:
- my-shell-runner
script:
- make docker-clean
ááá¯á·áá±á¬áẠáá»áœááºá¯ááºááá¯á·á GitLab ááá±á¬áá»áẠ-> CI/CD -> á¡áá»áááºááá¬ážáá»á¬áž -> á¡áá»áááºááá¬ážá¡áá áºááá¯á· ááœá¬ážáᬠá¡áá»áááºááá¬ážá¡áá áºáá áºáá¯ááᯠááá·áºáá«á
ááááº
GitLab CI ááœáẠáá¯ááºáá±á¬ááºá
áᬠá áá¯ááᯠá
áááºááŒááºážá
áá±á«ááºážá ááºá ááºážáááºááŸá¯áá»á¬ážááŸáá·áºá¡áá° áá±á¬ááºáá¯á¶ážáá¯ááºáá±á¬ááºáá²á·ááá·áº ááŸááºáááºážáá»á¬ážááœáẠááá°áá®áá±á¬áá¯ááºáá±á¬ááºá áá¬áá»á¬ážá០ááœááºááááºáá¬áá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·ááœá±á·ááŒááºááááºá
CONTAINER ID NAMES
c6b76f9135ed testrail-web-204645172
01d303262d8e testrail-fpm-204645172
2cdab1edbf6a testrail-migration-204645172
826aaf7c0a29 testrail-mysql-204645172
6dbb3fae0322 testrail-web-204645084
3540f8d448ce testrail-fpm-204645084
70fea72aa10d testrail-mysql-204645084
d8aa24b2892d testrail-web-204644881
6d4ccd910fad testrail-fpm-204644881
685d8023a3ec testrail-mysql-204644881
1cdfc692003a testrail-web-204644793
6f26dfb2683e testrail-fpm-204644793
029e16b26201 testrail-mysql-204644793
c10443222ac6 testrail-web-204567103
04339229397e testrail-fpm-204567103
6ae0accab28d testrail-mysql-204567103
b66b60d79e43 testrail-web-204553690
033b1f46afa9 testrail-fpm-204553690
a8879c5ef941 testrail-mysql-204553690
069954ba6010 testrail-web-204553539
ed6b17d911a5 testrail-fpm-204553539
1a1eed057ea0 testrail-mysql-204553539
á¡áá±ážá áááºááŸááºáááºáž
$ docker login -u gitlab-ci-token -p ${CI_JOB_TOKEN} ${CI_REGISTRY}
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/gitlab-runner/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
$ export TR_HTTP_PORT=$(shuf -i10000-60000 -n1)
$ export TR_HTTPS_PORT=$(shuf -i10000-60000 -n1)
$ mkdir ${CI_JOB_ID}
$ cp .indirect/docker-compose.yml ${CI_JOB_ID}/docker-compose.yml
$ make docker-up
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml kill
docker network rm testrail-network-${CI_JOB_ID:-local} || true
Error: No such network: testrail-network-204645172
docker network create testrail-network-${CI_JOB_ID:-local}
0a59552b4464b8ab484de6ae5054f3d5752902910bacb0a7b5eca698766d0331
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml pull
Pulling web ... done
Pulling fpm ... done
Pulling migration ... done
Pulling db ... done
docker-compose -f ${CI_JOB_ID:-.indirect}/docker-compose.yml up --force-recreate --renew-anon-volumes -d
Creating volume "204645172_static-content" with default driver
Creating testrail-mysql-204645172 ...
Creating testrail-mysql-204645172 ... done
Creating testrail-migration-204645172 ... done
Creating testrail-fpm-204645172 ... done
Creating testrail-web-204645172 ... done
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c6b76f9135ed registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofâŠ" 13 seconds ago Up 1 second 0.0.0.0:51148->80/tcp, 0.0.0.0:25426->443/tcp testrail-web-204645172
01d303262d8e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiâŠ" 16 seconds ago Up 13 seconds 9000/tcp testrail-fpm-204645172
2cdab1edbf6a registry.gitlab.com/touchbit/image/testrail/migration:latest "docker-entrypoint.sâŠ" 16 seconds ago Up 13 seconds 3306/tcp, 33060/tcp testrail-migration-204645172
826aaf7c0a29 mysql:5.7.22 "docker-entrypoint.sâŠ" 18 seconds ago Up 16 seconds 3306/tcp testrail-mysql-204645172
6dbb3fae0322 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofâŠ" 36 seconds ago Up 22 seconds 0.0.0.0:44202->80/tcp, 0.0.0.0:20151->443/tcp testrail-web-204645084
3540f8d448ce registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiâŠ" 38 seconds ago Up 35 seconds 9000/tcp testrail-fpm-204645084
70fea72aa10d mysql:5.7.22 "docker-entrypoint.sâŠ" 40 seconds ago Up 37 seconds 3306/tcp testrail-mysql-204645084
d8aa24b2892d registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofâŠ" About a minute ago Up 53 seconds 0.0.0.0:31103->80/tcp, 0.0.0.0:43872->443/tcp testrail-web-204644881
6d4ccd910fad registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiâŠ" About a minute ago Up About a minute 9000/tcp testrail-fpm-204644881
685d8023a3ec mysql:5.7.22 "docker-entrypoint.sâŠ" About a minute ago Up About a minute 3306/tcp testrail-mysql-204644881
1cdfc692003a registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofâŠ" About a minute ago Up About a minute 0.0.0.0:44752->80/tcp, 0.0.0.0:23540->443/tcp testrail-web-204644793
6f26dfb2683e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiâŠ" About a minute ago Up About a minute 9000/tcp testrail-fpm-204644793
029e16b26201 mysql:5.7.22 "docker-entrypoint.sâŠ" About a minute ago Up About a minute 3306/tcp testrail-mysql-204644793
c10443222ac6 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofâŠ" 5 hours ago Up 5 hours 0.0.0.0:57123->80/tcp, 0.0.0.0:31657->443/tcp testrail-web-204567103
04339229397e registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiâŠ" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204567103
6ae0accab28d mysql:5.7.22 "docker-entrypoint.sâŠ" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204567103
b66b60d79e43 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofâŠ" 5 hours ago Up 5 hours 0.0.0.0:56321->80/tcp, 0.0.0.0:58749->443/tcp testrail-web-204553690
033b1f46afa9 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiâŠ" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204553690
a8879c5ef941 mysql:5.7.22 "docker-entrypoint.sâŠ" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204553690
069954ba6010 registry.gitlab.com/touchbit/image/testrail/web:latest "nginx -g 'daemon ofâŠ" 5 hours ago Up 5 hours 0.0.0.0:32869->80/tcp, 0.0.0.0:16066->443/tcp testrail-web-204553539
ed6b17d911a5 registry.gitlab.com/touchbit/image/testrail/fpm:latest "docker-php-entrypoiâŠ" 5 hours ago Up 5 hours 9000/tcp testrail-fpm-204553539
1a1eed057ea0 mysql:5.7.22 "docker-entrypoint.sâŠ" 5 hours ago Up 5 hours 3306/tcp testrail-mysql-204553539
á¡áá¯ááºáá»á¬ážá¡á¬ážáá¯á¶áž á¡á±á¬ááºááŒááºá áœá¬ááŒá®ážááŒá±á¬ááºáá²á·áá«áááºá
Task artifact áá»á¬ážááœáẠáááºáá±á¬ááºááŸá¯ááŸáá·áº á
ááºážáááºááŸá¯ááŸááºáááºážáá»á¬áž áá«áááºáá«áááºá
á¡áá¬áá¬ááá¯ááºážáᬠááŸááá±áá¯á¶ááá±ááá·áº áá°ážááŒá¬ážáá»ááºáá±á¬á·ááŸááá«áááºá áá±á«ááºážá
ááºážááŒááºážá
ááºážáááºááŸá¯áá»á¬áž áá¯ááºáá±á¬ááºáá±áá»áááºááœáẠááá¯ááºááá¯ááºážááẠá¡ááŒááºááá¯ááºááŒááºážá¡á¬áž áááºáá»ááºááá¯ááºáááºá áááºážá¡ááŒá±á¡áá±ááœáẠááœááºááááºáá¬áá»á¬áž áááºáááºáá±ááŒááºážááᯠáááºááá·áºáááºááá¯ááºáá«á ááá«ááá± á¡ááŒá±ážááá¬ážááᯠááá·áºááŸááºážáá±ážáá¯ááºááááºá áá¶ááá±á¬ááºážá
áœá¬áá²á GitLab CE ááœáẠááá¯ážáááºááŸá¯á¡ááœáẠáá¯ááºáá±á¬ááºá
áá¬ááŸá¬ á¡ááŒá±á¡áá±ááœáẠááŸááá±áá²ááŒá
áºáááºá
ááá¯á·áá±á¬áº áá»áœááºá¯ááºááá¯á·ááẠá¡áá»áááºááá¬ážá¡á áá¯ááºáá±á¬ááºá
áá¬áá
áºáá¯ááᯠá
áááºáá¯ááºáá±á¬ááºááẠáááºáá±á¬ááºážááá·áºááœááºážáá¬ážááŒá®ážá áááºážááᯠááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááẠáá»áœááºá¯ááºááá¯á·á¡á¬áž áááºáá°áá»áŸ áá¬ážááŒá
áºáá¬ážáááºá
áá»áœááºá¯ááºááá¯á·áááá±á¬áá»áẠ-> CI/CD -> á¡áá»áááºááá¬ážáá»á¬ážááᯠááœá¬ážááŒá®áž áá¯ááºáá±á¬ááºá
áá¬ááᯠáá¯ááºáá±á¬ááºáá«á Clean runner
á á¯á á¯áá±á«ááºáž:
- áá«ááá¯á·ááŸá¬ á¡ááŒá±ážááá¬ážáá áºáá±á¬ááºááŸááááºá
- á¡áá¯ááºáá»á¬ážááŸáá·áº áááºáááºážáá»ááºááŒá¬ážááœáẠáááááá¹ááá»á¬áž áááŸááá«á
- áá»áœááºá¯ááºááá¯á·ááẠáá¯ááºáááºážáá±á¬ááºáá¬áá»á¬ážááᯠáá±á«ááºážá ááºá á áºáá±ážááŸá¯áá»á¬ážááŒáá·áº á¡ááŒáá¯ááºáá¯ááºáá±á¬ááºáá«áááºá
- á ááºááœááºáž ááá¯á·ááá¯áẠááœááºááááºáá¬ááœáẠáá±á«ááºážá ááºá á áºáá±ážááŸá¯áá»á¬ážááᯠáááºáá¯ááºáá±á¬ááºááá¯ááºáááºá
- áááºáá±á¬ááºááŸá¯ááŸáá·áº á ááºážáááºááŸá¯ááŸááºáááºážáá»á¬ážááᯠá á¯áá±á¬ááºážááŒá®áž ááá¯ááºááá¯ááºážáá¯ááºáááºážáá¬áááºááŸáá·áº áá°ážááœá²áá±á¬ááºááœááºáá«áááºá
- Docker áá¯á¶áá±á¬ááºážáá»á¬ážá០á¡ááŒá±ážááá¬ážááᯠááá·áºááŸááºážáá±ážáá¯ááºááá¯ááºáááºá
áááºááŸááºáá»áááºááẠ~ 2 áá¬áá®ááŒá
áºáááºá
áá«áá«áá²á ááááºáá±á¬á·á áá¯á¶á·ááŒááºáá»ááºáááá¯á· áááºážáá¬áá«áááºá
source: www.habr.com