ãšã³ãžãã¢ãæè¡æå¥œå®¶ã®çãããããã«ã¡ã¯! ç§ã¯ãææ°ã®ãœãããŠã§ã¢é ä¿¡ã®ããã®ç§ã®ãæ°ã«å ¥ãã®æŠç¥ã®1ã€ã§ãããDockerãšJenkinsãçµã¿åãããŠCI/CDãã€ãã©ã€ã³ã匷åããããšãå ±æã§ããããšãå¬ããæããŸããÂ
ã·ã㢠DevOps ãšã³ãžãã¢ããã³ Docker ãã£ããã³ãšããŠã®ãã£ãªã¢ãéããŠããã® 2 ã€ã®ããŒã«ããªãªãŒã¹ãå€§å¹ ã«å¹çåããç°å¢é¢é£ã®é çã®çš®ãæžãããããŒã ãããè¿ éã«ãªãªãŒã¹ããããã«å¿ èŠãªèªä¿¡ãäžããããšãã§ããããšãããããŸããã
ãã®æçš¿ã§ã¯ãDockerãšJenkinsãšã¯äœãããªãããããå®ç§ã«çµã¿åããããã®ãããããŠå¹ççãªãã€ãã©ã€ã³ãæ§ç¯ããã³ä¿å®ããæ¹æ³ã«ã€ããŠèª¬æããŸãã ç§ã®ç®æšã¯ãã¯ãŒã¯ãããŒãèªååãããšãã«ãããªãããã€ãããããã«ããããšã§ãã ãã£ããèŠãŠãããŸãããã

ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ãšç¶ç¶çããªããªãŒã®æŠèŠ
ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ (CI) ãšç¶ç¶çããªããªãŒ (CD) ã¯ãçŸä»£ã®éçºã®éèŠãªæ±ã§ãã ãããã®æŠå¿µã«æ £ããŠããªãå Žåã¯ãç°¡åã«èª¬æããŸãã
- ç¶ç¶çã€ã³ãã°ã¬ãŒã·ã§ã³ (CI): éçºè ã¯é »ç¹ã«ã³ãŒããå ±æãªããžããªã«ã³ãããããèªååããããã«ããšãã¹ããããªã¬ãŒããŸãã ãã®æ¹æ³ã«ãããç«¶åãé²ããæ¬ é¥ãæ©æã«çºèŠããããšãã§ããŸãã
- ç¶ç¶çããªããªãŒ (CD): CIãå°å ¥ããããšã§ãçµç¹ã¯èªä¿¡ãæã£ãŠãªãªãŒã¹ãèªååã§ããŸãã ã€ãŸãããªãªãŒã¹ãµã€ã¯ã«ãççž®ãããäºæãã¬äºæ ãå°ãªããªããå¿ èŠã«å¿ããŠå€æŽãè¿ éã«ããŒã«ããã¯ã§ããããã«ãªã£ãã®ã§ãã
CI/CD ãæŽ»çšããããšã§ãããŒã ã®ããã·ãã£ãšå質ãåçã«åäžãããããšãã§ããŸãã ä¿¡é Œæ§ãé«ããåçåããããã€ãã©ã€ã³ã®ã¡ãªãããäžåºŠäœéšããã°ãåŸæ»ãããããšã¯ã§ããŸããã
ãªãCI/CDã«DockerãšJenkinsãçµã¿åãããã®ã§ãã?
Docker ã䜿çšãããšãã¢ããªã±ãŒã·ã§ã³ãã³ã³ããåããŠãéçºããã¹ããéçšå šäœã§äžè²«ããç°å¢ãäœæã§ããŸãã äžæ¹ãJenkins ã¯ãã³ãŒãã®ãã«ãããã¹ãããããã€ãªã©ã®ã¿ã¹ã¯ãèªååããã®ã«åœ¹ç«ã¡ãŸãã ç§ã¯ãJenkinsãç²ããç¥ããªããçµç«ã©ã€ã³ã®åŽåè ããšèããã®ã奜ãã§ãããDockerã¯ãããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«å šäœã§äžè²«æ§ã確ä¿ããããã®åäžã®ãã³ã³ããããæäŸããŸãã
ãããã®ããŒã«ã®ãã¬ã³ããéåžžã«åŒ·åã§ããçç±ã¯æ¬¡ã®ãšããã§ãã
- äžè²«æ§ã®ããç°å¢: Docker ã³ã³ããã¯ãéçºè ã®ã©ãããããããæ¬çªç°å¢ãŸã§ã®åäžæ§ãä¿èšŒããŸãã ãã®äžè²«æ§ã«ããããšã©ãŒãæžãããç§ã®ãã·ã³ã§åäœããããšããæãããèšãèš³ããªããªããŸãã
- è¿ éãªãããã€ãšããŒã«ããã¯: Docker ã€ã¡ãŒãžã¯è»œéã§ãã 倿Žã®çºéãå·®ãæ»ãã¯äžç¬ã§è¡ãããšãã§ããããŠã³ã¿ã€ã ãæå°éã«æããããšãéèŠãªççŽæã®ããã»ã¹ãµã€ã¯ã«ã«æé©ã§ãã
- ã¹ã±ãŒã©ããªãã£: 1ãã¹ãã000ãã¹ãã䞊è¡ããŠå®è¡ãããããã€ã¯ããµãŒãã¹ã«åãçµãè€æ°ã®ããŒã ããµããŒããããããå¿ èŠããããŸãã?倧äžå€«ã ããå€ãã®ãã«ããšãŒãžã§ã³ããå¿ èŠãªãšãã«ã¯ãã€ã§ãè€æ°ã®Dockerã³ã³ãããã¹ãã³ã¢ããããJenkinsãã€ãã©ã€ã³ã§ãã¹ãŠãJenkinsã«ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãããŸãã
ç§ã®ãã㪠DevOps ãžã£ã³ããŒã«ãšã£ãŠãJenkinsãšDockerã®ãã®çžä¹å¹æã¯å€¢ã®å®çŸã§ãã
Docker ãš Jenkins ã䜿çšãã CI/CD ãã€ãã©ã€ã³ã®èšå®
è¢ããŸããäžããåã«ãå¿ èŠãªå¿ éåã«ã€ããŠèª¬æããŸãããã
- Docker Desktop (ãŸã㯠Docker ãµãŒããŒç°å¢) ãã€ã³ã¹ããŒã«ãããå®è¡ãããŠããã Dockerã¯ãããŸããŸãªãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§å ¥æã§ããŸã ã
- Jenkins 㯠Docker Hub ããããŠã³ããŒãããããããã·ã³ã«ã€ã³ã¹ããŒã«ãããŸããæè¿ã§ã¯ãéæšå¥šã®
library/jenkinsã€ã¡ãŒãžã§ã¯ãªããjenkins/jenkins:lts(é·æãµããŒãã€ã¡ãŒãž)ãå¿ èŠã«ãªããŸãã - Docker ã³ãã³ãã®é©åãªæš©éãšãã·ã¹ãã äžã® Docker ã€ã¡ãŒãžã管çããæ©èœã
- Jenkins ãã€ãã©ã€ã³èšå®ãä¿åã§ãã GitHub ãŸãã¯åæ§ã®ã³ãŒã ãªããžã㪠(çç¥å¯èœã§ãããæšå¥š)ã
ããã®ãã³ã: æ¬çªç°å¢ã®ã»ããã¢ãããèšç»ããŠããå Žåã¯ã Kubernetes ã®ãããªã³ã³ãã ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ ãã©ãããã©ãŒã ãæ€èšããŠãã ããã ãã®ã¢ãããŒãã«ãããJenkins ã®ã¹ã±ãŒãªã³ã°ãJenkins ã®æŽæ°ãããã³ããéãã¯ãŒã¯ããŒãã«å¯Ÿãã远å ã® Docker ãµãŒããŒã®ç®¡çãç°¡çŽ åãããŸãã
Docker ãš Jenkins ã䜿çšããå ç¢ãª CI/CD ãã€ãã©ã€ã³ã®æ§ç¯
ç°å¢ãæºåããããæåã® Jenkins-Docker ãã€ãã©ã€ã³ãäœæããŸãã 以äžã§ã¯ãäžè¬çãªãã€ãã©ã€ã³ã®äžè¬çãªæé ã説æããŸã â ã¹ã¿ãã¯ã«åãããŠèªç±ã«å€æŽããŠãã ããã
1ã å¿ èŠãªJenkinsãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ãã
Jenkinsã¯ç¡æ°ã®ãã©ã°ã€ã³ãæäŸããŠãããããDockerã§Jenkinsãç°¡åã«æ§æã§ããããã«ããããã€ãã®ãã©ã°ã€ã³ããå§ããŸãããã
- Docker ãã€ãã©ã€ã³ãã©ã°ã€ã³
- Docker
- CloudBees Docker ã®ãã«ããšå ¬é
ãã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«æ¹æ³:
- ãManage Jenkinsã>ãManage PluginsããéããŸãã
- [ å©çšå¯èœ ]ã¿ããã¯ãªãã¯ããŠãäžèšã®ãã©ã°ã€ã³ãæ€çŽ¢ããŸãã
- ããããã€ã³ã¹ããŒã«ããŸã(å¿ èŠã«å¿ããŠJenkinsãåèµ·åããŸã)ã
ã³ãŒãäŸ(CLIã«ãããã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«):
# Install plugins using Jenkins CLI
java -jar jenkins-cli.jar -s http://<jenkins-server>:8080/ install-plugin docker-pipeline
java -jar jenkins-cli.jar -s http://<jenkins-server>:8080/ install-plugin docker
java -jar jenkins-cli.jar -s http://<jenkins-server>:8080/ install-plugin docker-build-publish
ããã®ãã³ã(é«åºŠãªã¢ãããŒã): å®å šãª Infrastructure-as-Code ã»ããã¢ãããç®æããŠããå Žåã¯ã Jenkins Configuration as Code (JCasC) ã®äœ¿çšãæ€èšããŠãã ããã JCasC ã§ã¯ããã©ã°ã€ã³ãèªèšŒæ å ±ããã€ãã©ã€ã³å®çŸ©ãªã©ããã¹ãŠã® Jenkins èšå®ã YAML ãã¡ã€ã«ã§å®£èšã§ããŸãã ã€ãŸããJenkins ã®èšå®å šäœãããŒãžã§ã³ç®¡çãããåçŸå¯èœã§ãããããæ°ãã Jenkins ã€ã³ã¹ã¿ã³ã¹ãç°¡åã«ã¹ãã³ã¢ããããããè€æ°ã®ç°å¢ã«äžè²«ããèšå®ãé©çšãããã§ããŸãã ããã¯ãJenkins ãå€§èŠæš¡ã«ç®¡çããããšããŠããå€§èŠæš¡ãªããŒã ã«ãšã£ãŠç¹ã«äŸ¿å©ã§ãã
åèïŒ
- Jenkinsãã©ã°ã€ã³ã€ã³ã¹ããŒã«ã¬ã€ãã
- Jenkins Configuration as Code Plugin(ã³ãŒããã©ã°ã€ã³ãšããŠã®Jenkinsèšå®)ã
2ã Jenkins ãã€ãã©ã€ã³ãèšå®ãã
ãã®æé ã§ã¯ããã€ãã©ã€ã³ãå®çŸ©ããŸãã Jenkins ã® "ãã€ãã©ã€ã³" ãžã§ãã§ã¯ã Jenkinsfile (ã³ãŒã ãªããžããªã«æ ŒçŽãããŠãã) ã䜿çšããŠãã¹ããããã¹ããŒãžãããã³ç°å¢èŠä»¶ãæå®ããŸãã
Jenkinsfileã®äŸ:
pipeline {
agent any
stages {
stage('Checkout') {
steps {
git branch: 'main', url: 'https://github.com/your-org/your-repo.git'
}
}
stage('Build') {
steps {
script {
dockerImage = docker.build("your-org/your-app:${env.BUILD_NUMBER}")
}
}
}
stage('Test') {
steps {
sh 'docker run --rm your-org/your-app:${env.BUILD_NUMBER} ./run-tests.sh'
}
}
stage('Push') {
steps {
script {
docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-credentials') {
dockerImage.push()
}
}
}
}
}
}
ããã§äœãèµ·ãã£ãŠããã®ããèŠãŠã¿ãŸãããã
- ãã§ãã¯ã¢ãŠã: ãªããžããªããã«ããŸãã
- ãã«ã: ãã«ãçªå·ãã¿ã°ãšããŠãã«ãããã Docker ã€ã¡ãŒãž (
your-org/your-app) ãäœæããŸãã - ãã¹ã: æ°ããã³ã³ããå ã§ãã¹ãã¹ã€ãŒããå®è¡ããDocker ã³ã³ããããã¹ãå®è¡ããšã«äžè²«ããç°å¢ãäœæããããã«ããŸãã
- ããã·ã¥: ãã¹ãã«åæ Œããå Žåãã€ã¡ãŒãžã Docker ã¬ãžã¹ã㪠(Docker Hub ãªã©) ã«ããã·ã¥ããŸãã
åèïŒ Jenkins ãã€ãã©ã€ã³ã®ããã¥ã¡ã³ãã
3ã Jenkins ãèªåãã«ãçšã«æ§æãã
ãã€ãã©ã€ã³ãèšå®ãããã®ã§ãJenkins ã§ãã€ãã©ã€ã³ãèªåçã«å®è¡ããå¿ èŠããããŸãã
- Webhook ããªã¬ãŒ: ãœãŒã¹ç®¡ç (GitHub ãªã©) ãæ§æããŠãã³ãŒããããã·ã¥ããããã³ã« Webhook ãéä¿¡ããããã«ããŸãã Jenkins ã¯ããã«ãã«ããéå§ããŸãã
- SCM ã®ããŒãªã³ã°: Jenkins ã¯ããªããžããªã§æ°ããã³ãããã宿çã«ãã§ãã¯ãã倿Žãæ€åºãããå Žåã¯ãã«ããéå§ããŸãã
ã©ã®ããªã¬ãŒæ¹æ³ãéžã¶ã¹ãã§ãã?
- Webhook ããªã¬ãŒ ã¯ãã»ãŒãªã¢ã«ã¿ã€ã ã®ãã«ããå¿ èŠãªå Žåã«æé©ã§ãã ãªããžããªã«ããã·ã¥ãããšããã«ãJenkins ã«éç¥ãããæ°ãããã«ããã»ãŒå³åº§ã«éå§ãããŸãã ãã®ã¢ãããŒãã¯ãJenkins ããªããžããªã®æŽæ°ãç¶ç¶çã«ãã§ãã¯ããå¿ èŠããªããããéåžžã¯ããå¹ççã§ãã ãã ãããœãŒã¹ç®¡çã·ã¹ãã ãšãããã¯ãŒã¯ç°å¢ã Webhook ããµããŒãããŠããå¿ èŠããããŸãã
- ããŒãªã³ã° SCM ã¯ãç°å¢ãåä¿¡ Webhook ããµããŒãã§ããªãå Žå (ããšãã°ãäŒæ¥ã®ãã¡ã€ã¢ãŠã©ãŒã«ã®å åŽã«ããå Žåãããªããžããªãéä¿¡ããã¯çšã«æ§æãããŠããªãå Žå) ã«åœ¹ç«ã¡ãŸãã ãã®å ŽåãJenkins ã¯å®çŸ©ããã¹ã±ãžã¥ãŒã« (5 åããšãªã©) ã§æ°ããã³ãããã宿çã«ãã§ãã¯ãããããããããªé å»¶ãäœåãªãªãŒããŒããããçºçããå¯èœæ§ããããŸãããããã¯ããŠã³ãããç°å¢ã§ã®ã»ããã¢ãããç°¡çŽ åãããå¯èœæ§ããããŸãã
å人çãªçµéš: Webhook ããªã¬ãŒã¯ããã¹ãŠãå¯èœãªéããªã¢ã«ã¿ã€ã ã«è¿ã¥ãããããç§ã¯ Webhook ããªã¬ãŒã倧奜ãã§ãã Webhook ãäžå¯èœãªå Žåã¯ããŒãªã³ã°ã¯æ£åžžã«æ©èœããŸãããã³ãŒãã®ããã·ã¥ãšãã«ãéå§ã®éã«ããããªé å»¶ãçºçããŸãã ãŸããããŒãªã³ã°ééãé »ç¹ããããšã远å ã®ãããã¯ãŒã¯ãã©ãã£ãã¯ãçºçããå¯èœæ§ããããŸãã
4ã Docker ã³ã³ããã䜿çšãããã«ãããã¹ãããããã€
ãããããé¢çœãéšåã§ã â ãã«ããããããã€ãŸã§ã®ãµã€ã¯ã«å šäœãèªååããããšã§ãã
- Docker ã€ã¡ãŒãžã®ãã«ã: ã³ãŒãããã«ããåŸãJenkins ã¯
docker.buildãåŒã³åºããŠæ°ããã€ã¡ãŒãžãäœæããŸãã - ãã¹ãã®å®è¡: èªåãŸãã¯èªåã®åãå ¥ããã¹ãã¯ããã®ã€ã¡ãŒãžããã¹ãã³ã¢ãããããã³ã³ããå ã§å®è¡ãããäžè²«æ§ã確ä¿ãããŸãã
- ã¬ãžã¹ããªãžã®ããã·ã¥: ãã¹ãã«åæ Œãããšä»®å®ãããšãJenkins ã¯ã¿ã°ä»ããããã€ã¡ãŒãžã Docker ã¬ãžã¹ã㪠(Docker Hub ãŸãã¯ãã©ã€ããŒãã¬ãžã¹ããª) ã«ããã·ã¥ããŸãã
- ãããã€: å¿ èŠã«å¿ããŠãJenkins ã¯ã€ã¡ãŒãžããªã¢ãŒã ãµãŒããŒãŸãã¯ã³ã³ãã㌠ãªãŒã±ã¹ãã¬ãŒã¿ãŒ (Kubernetes ãªã©) ã«ãããã€ã§ããŸãã
ãã®åçåãããã¢ãããŒãã«ããããã«ãããã¹ãããããã€ã®ãã¹ãŠã®ã¹ãããã 1 ã€ã®ãŸãšãŸã£ããã€ãã©ã€ã³ã«åãŸããããã®ã¹ãããã¯ã©ããžè¡ã£ãã®ãããšããè¬ãé²ãããšãã§ããŸãã
5ã ãã€ãã©ã€ã³ã®æé©åãšç¶æ
ãã€ãã©ã€ã³ã皌åãããããã¹ãŠãã¹ã ãŒãºã«å®è¡ãç¶ããããã®ã¡ã³ããã³ã¹ã®ãã³ããšæ©èœåŒ·åãããã€ã玹ä»ããŸãã
- ç»åãã¯ãªãŒã³ã¢ãããã: Docker ã€ã¡ãŒãžã宿çã«ã¯ãªãŒã³ã¢ããããããšã§ãã¹ããŒã¹ãåå©çšããæ··ä¹±ãæžããããšãã§ããŸãã
- ã»ãã¥ãªãã£æŽæ°ããã°ã©ã : DockerãJenkinsãããã³ãã©ã°ã€ã³ã®ã¢ããããŒããåžžã«ææ¡ããŸãã ããããè¿ éã«é©çšããããšã§ãCI/CDç°å¢ãè匱æ§ããä¿è·ããããšãã§ããŸãã
- ãªãœãŒã¹ç£èŠ: Jenkins ããŒãã«ãã«ãã«ååãªã¡ã¢ãªãCPUãããã³ãã£ã¹ã¯é åãããããšã確èªããŸãã ããŒããé ·äœ¿ãããŠãããšããã€ãã©ã€ã³ã®é床ãäœäžããæç¶çãªé害ãçºçããå¯èœæ§ããããŸãã
ããã®ãã³ã: å€§èŠæš¡ãªãããžã§ã¯ãã§ã¯ããã«ããšãŒãžã§ã³ãã Jenkins ã³ã³ãããŒã©ãŒããåé¢ããŠããšãã§ã¡ã©ã« Docker ã³ã³ãã (Jenkins ãšãŒãžã§ã³ããšãåŒã°ããŸã) ã§å®è¡ããããšãæ€èšããŠãã ããã ãšãŒãžã§ã³ããããŠã³ãããå€ããªã£ããããå Žåã¯ãæ°ãããšãŒãžã§ã³ããããã«ã¹ãã³ã¢ããã§ããããããã¹ãŠã®ãã«ãã§ã¯ãªãŒã³ã§äžè²«æ§ã®ããç°å¢ã確ä¿ããã¡ã€ã³ã®JenkinsãµãŒããŒã®è² è·ã軜æžã§ããŸãã
CI/CD ã«å®£èšåãã€ãã©ã€ã³ã䜿çšããçç±
Jenkins ã¯è€æ°ã®ãã€ãã©ã€ã³æ§æããµããŒãããŠããŸããã 宣èšåãã€ãã©ã€ã³ ã¯ããã®æç¢ºããšãªãœãŒã¹ã«åªããèšèšã§éç«ã£ãŠããŸãã ãã®çç±ã¯æ¬¡ã®ãšããã§ãã
- ç°¡ç¥åãããç¬èªã®æ§æ: ãã¹ãŠã 1 ã€ã®
pipeline { ... }ãããã¯ã«ã©ãããããŠããããããã¹ã¯ãªããã®ç¡ç§©åºãªå¢å ããæå°éã«æããããŸãã ããã¯ãGroovyã®è©³çŽ°ã«æ·±ãæãäžããããšãªãããã¹ããã©ã¯ãã£ã¹ãžã®è¿ éãªéãæ±ããããŒã ã«æé©ã§ãã - ãªãœãŒã¹å²ãåœãŠã®å®¹æå: ãã€ãã©ã€ã³ ã¬ãã«ãŸãã¯åã¹ããŒãžå
ã§
agentãæå®ããããšã§ãééã®å€ãã¿ã¹ã¯ (ãã«ãããã¹ã) ãåå¥ã®ã¯ãŒã«ãŒ ããŒããŸã㯠Docker ã³ã³ãããŒã«ãªãããŒãã§ããŸãã ãã®ã¢ãããŒãã¯ãã¡ã€ã³ã® Jenkins ã³ã³ãããŒã©ãŒãéè² è·ã«ãªãã®ãé²ãã®ã«åœ¹ç«ã¡ãŸãã - 䞊ååãšè¡åã®ãã«ã: è€æ°ã®ãã¹ãã¹ã€ãŒããå®è¡ããããããŸããŸãª OS/ãã©ãŠã¶ãŒã®çµã¿åããããµããŒããããããå¿ èŠãããå ŽåãDeclarative Pipelines ã䜿çšãããšã䞊åã¹ããŒãžã®å®çŸ©ããããªãã¯ã¹ãã«ãã®èšå®ãç°¡åã«ãªããŸãã ãã®æŠè¡ã¯ããã€ã¯ããµãŒãã¹ããç°ãªãç°å¢ã䞊è¡ããŠå¿ èŠãšããå€§èŠæš¡ãªãã¹ãã¹ã€ãŒãã«éåžžã«äŸ¿å©ã§ãã
- ãã«ãã€ã³ããšã¹ã±ãŒããããã: Groovyã®é«åºŠãªæ©èœãå¿
èŠã§ãã?
scriptãããã¯ã«ããããããã ãã§ããããã«ãããããããªã±ãŒã¹ã®ã¹ã¯ãªãããã€ãã©ã€ã³æ©èœã«ã¢ã¯ã»ã¹ããªãããã»ãšãã©ã®å ŽåãDeclarativeã®åçåãããæ§é ãæ¥œããããšãã§ããŸãã - ããã¯ãªãŒã³ãªãã©ã¡ãŒã¿å: å®è¡ãããã¹ãã䜿çšããDockerã€ã¡ãŒãžããŠãŒã¶ãŒã«éžæããããã§ãã?
parametersãã£ã¬ã¯ãã£ãã«ããããã€ãã©ã€ã³ã®æè»æ§ãåäžããŸãã1 ã€ã® Jenkinsfile ã§ãåäœãã¹ããšçµ±åãã¹ããªã©ãè€æ°ã®ã·ããªãªãéè€ããããšãªãåŠçã§ããŸãã
宣èšåãã€ãã©ã€ã³ã®äŸ
以äžã¯ã宣èšåæ§æããªãœãŒã¹å²ãåœãŠãç°¡çŽ åããJenkins ã³ã³ãããŒã©ãŒãæ£åžžã«ä¿ã€æ¹æ³ã瀺ããµã³ãã« ãã€ãã©ã€ã³ã§ãã
äŸ 1: åºæ¬çãªå®£èšåãã€ãã©ã€ã³
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
stage('Test') {
steps {
echo 'Testing...'
}
}
}
}
- 䜿çšå¯èœãªä»»æã® Jenkins ãšãŒãžã§ã³ã (ã¯ãŒã«ãŒ) ã§å®è¡ãããŸãã
- åçŽãªé åºã§ 2 ã€ã®ã¹ããŒãžã䜿çšããŸãã
äŸ 2: ãªãœãŒã¹åé¢ã®ããã®ã¹ããŒãžã»ã¬ãã«ã®ãšãŒãžã§ã³ã
pipeline {
agent none // Avoid using a global agent at the pipeline level
stages {
stage('Build') {
agent { docker 'maven:3.9.3-eclipse-temurin-17' }
steps {
sh 'mvn clean package'
}
}
stage('Test') {
agent { docker 'openjdk:17-jdk' }
steps {
sh 'java -jar target/my-app-tests.jar'
}
}
}
}
- åã¹ããŒãžã¯ç¬èªã®ã³ã³ããã§å®è¡ããã1ã€ã®ããŒããå§åãããã®ãé²ããŸãã
agent noneäžéšã§ãã°ããŒãã«ãšãŒãžã§ã³ããäžå¿ èŠã«å²ãåœãŠãããªãããã«ããŸãã
äŸ 3: ãã¹ãã»ã¹ããŒãžã®äžŠåå
pipeline {
agent none
stages {
stage('Test') {
parallel {
stage('Unit Tests') {
agent { label 'linux-node' }
steps {
sh './run-unit-tests.sh'
}
}
stage('Integration Tests') {
agent { label 'linux-node' }
steps {
sh './run-integration-tests.sh'
}
}
}
}
}
}
- ãã¹ãã 2 ã€ã®äžŠåã¹ããŒãžã«åå²ããŸãã
- åã¹ããŒãžã¯ç°ãªãããŒããŸãã¯ã³ã³ããã§å®è¡ã§ããããããã£ãŒãããã¯ã«ãŒããé«éåãããŸãã
äŸ 4: ãã©ã¡ãŒã¿ãŒåããããã€ãã©ã€ã³
pipeline {
agent any
parameters {
choice(name: 'TEST_TYPE', choices: ['unit', 'integration', 'all'], description: 'Which test suite to run?')
}
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
stage('Test') {
when {
expression { return params.TEST_TYPE == 'unit' || params.TEST_TYPE == 'all' }
}
steps {
echo 'Running unit tests...'
}
}
stage('Integration') {
when {
expression { return params.TEST_TYPE == 'integration' || params.TEST_TYPE == 'all' }
}
steps {
echo 'Running integration tests...'
}
}
}
}
- å®è¡ãããã¹ã (åäœãçµ±åããŸãã¯ãã®äž¡æ¹) ãéžæã§ããŸãã
- éžæãããã©ã¡ãŒã¿ãŒã«åºã¥ããŠé¢é£ããã¹ããŒãžã®ã¿ãå®è¡ãããªãœãŒã¹ãç¯çŽããŸãã
äŸ 5: ãããªãã¯ã¹ã®ãã«ã
pipeline {
agent none
stages {
stage('Build and Test Matrix') {
matrix {
agent {
label "${PLATFORM}-docker"
}
axes {
axis {
name 'PLATFORM'
values 'linux', 'windows'
}
axis {
name 'BROWSER'
values 'chrome', 'firefox'
}
}
stages {
stage('Build') {
steps {
echo "Build on ${PLATFORM} with ${BROWSER}"
}
}
stage('Test') {
steps {
echo "Test on ${PLATFORM} with ${BROWSER}"
}
}
}
}
}
}
}
- PLATFORM x BROWSERã®è¡åãå®çŸ©ããåçµã¿åããã䞊è¡ããŠå®è¡ããŸãã
- ãã€ãã©ã€ã³ããžãã¯ãè€è£œããã«è€æ°ã®OS/ãã©ãŠã¶ã®çµã¿åããããã¹ãããã®ã«æé©ã§ãã
ãã®ä»ã®ãªãœãŒã¹:
- Jenkins ãã€ãã©ã€ã³æ§æ: ã»ã¯ã·ã§ã³ããã£ã¬ã¯ãã£ããããã³ãããªãã¯ã¹ã䞊åãäºåŸæ¡ä»¶ãªã©ã®é«åºŠãªæ©èœã®å ¬åŒãªãã¡ã¬ã³ã¹ã
- Jenkins ãã€ãã©ã€ã³ã¹ããããªãã¡ã¬ã³ã¹: Jenkinsfile ã§åŒã³åºãããšãã§ããã¹ãããã®å æ¬çãªãªã¹ãã
- Jenkins Configuration as Code Plugin (JCasC): ãã©ã°ã€ã³ã®ã€ã³ã¹ããŒã«ãèªèšŒæ
å ±ãªã©ãJenkins èšå®ã®ããŒãžã§ã³ç®¡çã«æé©ã§ãã
宣èšåãã€ãã©ã€ã³ã䜿çšãããšãCI/CD ã»ããã¢ããã®ä¿å®ãã¹ã±ãŒã©ããªãã£ãã»ãã¥ãªãã£ã確ä¿ã§ããŸãã DockerããŒã¹ãã©ãã«ããŒã¹ãã«ãããããããšãŒãžã§ã³ããé©åã«æ§æããããšã§ãã¯ãŒã¯ããŒããè€æ°ã®ã¯ãŒã«ãŒããŒãã«åæ£ãããªãœãŒã¹ã®ç«¶åãæå°éã«æããJenkinsã³ã³ãããŒã©ãŒãå¿«é©ã«åäœãããããšãã§ããŸãã
Docker ãš Jenkins ã䜿çšãã CI/CD ã®ãã¹ã ãã©ã¯ãã£ã¹
ã»ããã¢ããã匷åããæºåã¯ã§ããŸããã? ããã§ã¯ãç§ãå¹ã£ãå®èšŒæžã¿ã®ç¿æ £ãããã€ã玹ä»ããŸãã
- Docker ã®ã¬ã€ã€ãŒ ãã£ãã·ã³ã°ã掻çšããŸãã Dockerfile ãæé©åããŠãå®å®ãã (倿Žé »åºŠã®äœã) ã¬ã€ã€ãŒãæ©æã«è¡šç€ºãããããã«ããŸãã ããã«ããããã«ãæéãå€§å¹ ã«ççž®ãããŸãã
- ãã¹ãã䞊è¡ããŠå®è¡ããŸãã Jenkins ã¯ãããŸããŸãªãµãŒãã¹ããã€ã¯ããµãŒãã¹ã«å¯ŸããŠè€æ°ã®ã³ã³ãããå®è¡ã§ããããããããã䞊ã¹ãŠãã¹ãã§ããŸãã 宣èšåãã€ãã©ã€ã³ã䜿çšãããšããããããç¬èªã®ãšãŒãžã§ã³ãã§äžŠåã¹ããŒãžãç°¡åã«å®çŸ©ã§ããŸãã
- ã»ãã¥ãªãã£ã®ã·ããã¬ãã: ãã€ãã©ã€ã³ã®æ©ã段éã§ã»ãã¥ãªã㣠ãã§ãã¯ãçµ±åããŸãã Docker Scoutã®ãããªããŒã«ã§ã¯ãã€ã¡ãŒãžã®è匱æ§ãã¹ãã£ã³ã§ããJenkinsãã©ã°ã€ã³ã§ã¯ã³ã³ãã©ã€ã¢ã³ã¹ããªã·ãŒãé©çšã§ããŸããåé¡ãçºèŠããããã«ãæ¬çªç°å¢ãŸã§åŸ ããªãã§ãã ããã
- ãªãœãŒã¹å²ãåœãŠã®æé©å: Jenkins ã³ã³ãããš Docker ã³ã³ããã® CPU ãšã¡ã¢ãªã®å¶éãé©åã«æ§æããŠããªãœãŒã¹ã®å æãåé¿ããŸãã Jenkins ãã¹ã±ãŒãªã³ã°ããå Žåã¯ãå¹çãæå€§åããããã«ããã«ããè€æ°ã®ã¯ãŒã«ãŒ ããŒããŸãã¯ãšãã§ã¡ã©ã« ãšãŒãžã§ã³ãã«åæ£ããŸãã
- æ§æç®¡ç: Jenkins ãžã§ãããã€ãã©ã€ã³å®çŸ©ãããã³ãã©ã°ã€ã³èšå®ããœãŒã¹ç®¡çã«æ ŒçŽããŸãã Jenkins Configuration as Codeã®ãããªããŒã«ã¯ãããŒãžã§ã³ç®¡çãšè€æ°ã®DockerãµãŒããŒéã§ã®ã»ããã¢ããã®è€è£œãç°¡çŽ åããŸãã
ãããã®æŠç¥ã«å ããŠãååãªéã®å®£èšåãã€ãã©ã€ã³ã䜿çšããã°ãä¿å®ãšé²åã容æãªãç¡é§ã®ãªãé«ãªã¯ã¿ã³äŸ¡ã® CI/CD ãã€ãã©ã€ã³ãåŸãããŸãã
Docker ãš Jenkins ãã€ãã©ã€ã³ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°
æé«ã®ã·ã¹ãã ã§ãããæã æç€ã«ä¹ãäžããŸãã 以äžã¯ãç§ãèŠã(ãããŠå æãã)ããã€ãã®ããŒãã«ã§ãã
- ç°å¢ã®å€åæ§ã®åŠç: Docker ãš Jenkins ã®ããŒãžã§ã³ãç°ãªãããŒãéã§åæããŸãã è€æ°ã® Jenkins ããŒããåäœããŠããå Žåã¯ãDocker ã®ããŒãžã§ã³ãæšæºåããŠãã©ã³ãã ãªãã«ã倱æãåé¿ããŸãã
- ãã«ãã®å€±æã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°:
docker logs -f <container-id>ã䜿çšããŠãã³ã³ããå ã§äœãèµ·ãã£ãããæ£ç¢ºã«ç¢ºèªããŸããå€ãã®å Žåããã°ã«ã¯äŸåé¢ä¿ã®æ¬ èœãç°å¢å€æ°ã®äžé©åãªèšå®ããããŸãã - ãããã¯ãŒãã³ã°ã®èª²é¡: ã³ã³ãããçžäºã«éä¿¡ããå¿ èŠãããå Žåã¯ãç¹ã«è€æ°ã®ãã¹ãéã§ãDockerãããã¯ãŒã¯ãŸãã¯ãªãŒã±ã¹ãã¬ãŒã·ã§ã³ãã©ãããã©ãŒã ãé©åã«æ§æããŠãã ããã 詳现ã«ã€ããŠã¯ãDocker ã®ãããã¯ãŒã¯ã«é¢ããããã¥ã¡ã³ããåç §ãããã©ãã«ã·ã¥ãŒãã£ã³ã°ã®ãã³ãã«ã€ããŠã¯ãJenkins ã®åé¡ã®èšºæã¬ã€ããåç §ããŠãã ããã
çµè«
Docker ãš Jenkins ãçµã¿åããããšãCI/CD ã«å¯Ÿããæ©æã§å ç¢ãªã¢ãããŒããå®çŸããŸãã Docker ã¯äžè²«æ§ã®ããç°å¢ãããã¯ããŠã³ããè¶ é«éã®ããŒã«ã¢ãŠããå®çŸããäžæ¹ã§ãJenkins ã¯ãã«ãããã¹ãã倿Žã®æ¬çªç°å¢ãžã®ããã·ã¥ãªã©ã®äž»èŠãªã¿ã¹ã¯ãèªååããŸãã ãã® 2 ã€ã調åããŠãããšããªãªãŒã¹ ãµã€ã¯ã«ãççž®ãããçµ±åã®é çã®çš®ãæžããåªããæ©èœã®éçºã«éäžããæéãå¢ããããšãæåŸ ã§ããŸãã
ãŸãããã€ãã©ã€ã³ãå¥å šã§ããã°ãããŒã ã¯ãŠãŒã¶ãŒããã®ãã£ãŒãããã¯ã«è¿ éã«å¯Ÿå¿ããèªä¿¡ãæã£ãŠã¢ããããŒããå±éã§ãããšããããœãããŠã§ã¢ãããžã§ã¯ããæåãããããã®éèŠãªèŠçŽ ã§ãã ãŸããã»ãã¥ãªãã£ã«æžå¿µãããå Žåã¯ãã¢ããªã±ãŒã·ã§ã³ãå®å šã«ä¿ã€ããã®ããŒã«ããã¹ããã©ã¯ãã£ã¹ããããããããŸãã
ãã®ã¬ã€ãããããŒã ãæ°ã«å ¥ãé«ãªã¯ã¿ã³äŸ¡ã® CI/CD ãã€ãã©ã€ã³ã®æ§ç¯ (ããã³ä¿å®) ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã 質åãããå ŽåãæäŒã£ãŠãããå¿ èŠãããå Žåã¯ã ã³ãã¥ããã£ãã©ãŒã©ã ã§æ°è»œã«é£çµ¡ãããã Slackã§äŒè©±ã«åå ãããã GitHubã®åé¡ã§ãã±ãããéãããããŠãã ããã DockerãJenkinsã®æå¥œå®¶ã®äžã«ã¯ãåãã§å©ããŠããã仲éãããããããŸãã
èªãã§ãããŠããããšãããããŠå¹žããªå»ºç©!
ããã«è©³ãã
- Docker Newsletter ã賌èªããŠãã ãããÂ
- Docker ã®å ¬åŒ Jenkins çµ±åããã¥ã¡ã³ãã§è©³ãã説æããŸãã
- Docker Business ã§å æ¬ç㪠CI/CD ã»ãã¥ãªãã£ãå€§èŠæš¡ã«å®çŸããŸãã
- Docker ãã¹ã¯ãããã®ææ°ãªãªãŒã¹ãå ¥æããŸãã
- 質åããããŸãã? Docker ã³ãã¥ããã£ããæäŒãããŸãã
- Docker ã¯åããŠã§ãã? ååŸãã stã¢ãŒã.