Kyotoなんか #4の資料です
ແݶʹεέʔϧ͢Δ্ʹ ࣗతͳJenkinsʹݟΔເ ~AWSἫ~KyotoͳΜ͔ #4@moznion
View Slide
@moznionSoftware engineerHatena Intern 2013
Jenkins
Jenkins- CI (Continuous Integration) Platform- Workflow- ศརͳcron
Why Jenkins?
Why Jenkins?- ͱͱ (Ұ෦ࠓ) CircleCIΛ͍ͬͯͨ- Job͕૿͑ΔʹͭΕ٧·Δqueue- ϓϥϯ্͛Δͱߴ͍ΜεΑ……- ͬͱϚονϣͳϚγϯͰϏϧυ͍ͨ͠ͱ͍͏ཉ- ͦΖͦΖͪΌΜͱͨ͠σϓϩΠϑϩʔͱ͔Λ͍͑ͨ-
Why Jenkins?- ͱͱ (Ұ෦ࠓ) CircleCIΛ͍ͬͯͨ- Job͕૿͑ΔʹͭΕ٧·Δqueue- ϓϥϯ্͛Δͱߴ͍ΜεΑ……- ͬͱϚονϣͳϚγϯͰϏϧυ͍ͨ͠ͱ͍͏ཉ- ͦΖͦΖͪΌΜͱͨ͠σϓϩΠϑϩʔͱ͔Λ͍͑ͨ- ͱͱJenkinsΛεέʔϧͤ͞Δํ๏Λ͍ͬͯͨ
Jenkinsӡ༻ʹࡍͯ͠ग़͘Θ͢
Jenkinsӡ༻ʹࡍͯ͠ग़͘Θ͢- ฒྻ࣮ߦJobͷ૿Ճʹ͏ੑೳྼԽ- ߜΔͱbuildͪͷΩϡʔ͕٧·Δ͠……- Slave nodeͷӡ༻େม͗͢Δ- Master InstanceࢮͶͳ͍- ͓ئ͍͠·͢ͷڪා (™ @kyanny)
ฒྻjob্͛ΔͷϚδَʂ
ฒྻjob্͛ΔͷϚδَSlaveΛ͢ͷ؆୯ʂʂʂʂ
ฒྻjob্͛ΔͷϚδَ- slave͢ͷ؆୯ͳΜ͚ͩͲ……- ୯७ʹཧίετ͕૿͑Δͧʂ- ʮ͜ͷslaveͩͱͳ͔ͥςετ͕ίέ·͢ʯ
ฒྻjob্͛ΔͷϚδَ- slave͢ͷ؆୯ͳΜ͚ͩͲ……- ΦʔτεέʔϦϯάΛͪ·ͪ·͍ͬͯ͘ඞཁ͕͋Γ……- ΠϯελϯεΛ༡͓ͤͯ࣌ؒ͘ແ͍- CIΑ΄ͲϓϩδΣΫτཱ͕ͯࠐΜͰͳ͍ݶΓ৸ͯΔ͕࣌ؒࢧత- ׂͱઃఆ͕͍͠ (ίπ͕͍Δ)
͏͏……
զʑ΄ͬͱ͍ͯແݶʹϏϧυ͕εέʔϧ͢ΔJenkins͕΄͍͚ͩ͠ͳΜ͡Ό……
ͦΜͳͷ……͋Δʂʂʂ
AWS CodeBuild
AWS CodeBuild- ୯Ґͷ࣌ؒି͠- ҙͷίϯςφΛ࣮ߦͰ͖Δ- ͦͷίϯςφ্ͰϏϧυΒςετΒ͢Δ- (LambdaΑΓ͕͔͔࣌ؒΔλεΫͷ࣮ߦڥʹ……)
AWS CodeBuild- Jenkins Plugin͕͋Δ (AWSۘ)- https://github.com/awslabs/aws-codebuild-jenkins-plugin- JenkinsͰड͚ͨτϦΨͰCodeBuildΛൃՐͰ͖Δ
https://aws.amazon.com/jp/blogs/devops/simplify-your-jenkins-builds-with-aws-codebuild/
https://aws.amazon.com/jp/blogs/devops/simplify-your-jenkins-builds-with-aws-codebuild/࣮࣭ແݶʂʂʂʂ
ͨΒ͞ΕͨԸܙ- slave nodeͷϝϯςΒͣ- ΨϯΨϯฒྻϏϧυ͢Δͧʂʂʂ - ࣌ؒି͠ (= ͚ͬͨͩ) ͷྉۚઃఆͳͷͰ ࣗͰΦʔτεέʔϧॲཧΛ͠ͳͯ͘Α͍
Master Instance͕ਆ֨Խ͢Δ
Master Instanceਆ֨Խ- Jenkinsͷmaster datamasterϚγϯͷ*ϩʔΧϧετϨʔδ*ʹ อଘ͞ΕΔ- Πϯελϯε͕ࢮΜͩΒऴΘΓ- ͔͠͠ࢮආ͚ΒΕͳ͍- ͔ͩΒόοΫΞοϓΛऔͬͨΓ͢Δ- e.g. https://papix.hatenablog.com/entry/2016/02/09/101918- όοΫΞοϓ͔ΒͷϦετΞ࣮ࡍ໘- ָ͍͠ࣄͰͳ͍……- μϯλΠϜग़Δ͠……
Master Instanceਆ֨Խ- ݁Ռͱͯ͠ຖଉࡂΛفΔʑ……- ӡѱ͘Πϯελϯε͕ࢮΜͩΒσΠϦʔόοΫΞοϓ͔ΒϦετΞ- σΠϦʔόοΫΞοϓͱࢮ͵ؒࡍͱͷࠩʹ͍ͭͯఘΊΔ͔͠ແ͍……
զʑৎͰεέʔϧ͢ΔJenkins͕΄͍͚ͩ͠ͳΜ͡Ό……
Amazon Elastic File System
AWS Elastic File System (EFS)- AmazonͷnfsΈ͍ͨͳͭ- Instanceʹmountͯ͠͏- EBS + nfsతͳ……- ϘϦϡʔϜαΠζ͕ࣗಈͰ֦ுɾॖখ͢Δ- Disk fullΒͣͷੜ׆
AWS Elastic File System (EFS)- $JENKINS_HOMEΛEFSϘϦϡʔϜ্ʹ͢Δ- Πϯελϯε͕ࢮΜͰ৽͍͠Πϯελϯεʹ ͦͷϘϦϡʔϜΛϚϯτ͢Δ- => ΠϯελϯεલੈͷهԱΛҾ͖ܧ͗෮׆ʂʂʂ
mountWorking...
❌mountInstance down...
❌ New instancecoming up...
❌ mountWorks fine!!
AWS Elastic File System (EFS)- EBSͰྑ͍ͷͰʁ- ͍ʂɹEBSͷ΄͏͕͍҆͠ʂʂ- ͨͩEFSϘϦϡʔϜࣗಈ֦ு͕خ͍͠- (͏͔ͬΓdisk fullʹͳΒͳ͍)- ͋ͱEFSͩͱmulti masterΈ͍ͨͳ͜ͱͰ͖Δ (ޙड़)
Jenkins Multi Master- ଟͰ͖Δ (࣌ؒӡ༻ͯ͠ͳ͍)- ͔͠͠CodeBuildͱڞଘ͍ͯ͠ΔڥͰMulti Masterʹ͢Δ ϝϦοτ΄΅ͳ͘ͳ͍Ͱ͔͢ʁ- σϓϩΠ࣌ʹҰॠ2masterΛཱ͓͍ͯͯͯɼݹ͍ํΛ ࡴ͢Έ͍ͨͳμϯλΠϜσϓϩΠ͚ͷ͍ํՄೳ
ͨΒ͞ΕͨԸܙ- ΧδϡΞϧʹΠϯελϯε͕ࢮΜͰ҆৺ʂ- ͱ͍͑όοΫΞοϓऔͬͯΔ- ݁Ռͱͯ͠ΠϯελϯεͷೖΕସָ͕͑ʹͳͬͨ- ετϨʔδࣗಈ֦ு͢ΔͷͰDisk fullΒͣ
ࣾձ: Jenkins͓͡͞ΜͷͳΓखෆ
Jenkinsͷӡ༻Λ୭͔ʹԡ͚͠ΔͷΛΊΔ- ୭Ͱӡ༻Ͱ͖ΔΑ͏ʹ͢Δ- શਓຽJenkins͓͡͞Μ/͓͞ΜԽ- σϓϩΠϝϯςۃྗলྗԽ͢Δ
Jenkinsͷӡ༻Λ୭͔ʹԡ͚͠ΔͷΛΊΔ- Amazon Elastic Beanstalk + Docker- Dockerfile + Dockerrun.aws.jsonʹΑΔߏͷίʔυԽ- .ebextensionsʹΑΔࣗಈԽ- EFS mountͳͲ- https://github.com/moznion/jenkins_eb_efs_codebuild_example
- Elastic Beanstalkͷmanaged updateͰࣗಈతʹύον͕ͨΔ- ͍ͭͰʹΠϯελϯεͷೖΕସ͑ߦΘΕΔ- EFSڥԼͳͷͰΠϯελϯεೖΕସָ͑ʑࣗಈԽ- جຊతʹӡ༻์ஔͯ͠·͢- EFSͷϘϦϡʔϜࣗಈ֦ுͷύϫʔͰ͋ΔͨΒ͞ΕͨԸܙ
·ͱΊ
·ͱΊ- JenkinsͷslaveϊʔυΛAWS CodeBuildʹҕৡ͢Δ͜ͱͰ࣮࣭ແݶʹฒྻϏϧυ͕εέʔϧ͢ΔΑ͏ʹͳΓ·ͨ͠- JenkinsͷετϨʔδΛEFSʹ͢Δ͜ͱͰϚελʔσʔλͷϩόετԽΛߦ͍·ͨ͠- Elastic BeanstalkΛ༻͍ͯJenkinsΛӡ༻͢Δ͜ͱͰӡ༻ͷίετԽΛ͠·ͨ͠- Α͔ͬͨͰ͢Ͷ
Q?
Wait...
͜ͷJenkinsʹ͕͋Δ- EFS͍ʂʂʂʂʂ- Jenkins͕git clone͢ΔͱϚδ͔͔࣌ؒΓ·͢- git cloneΛճආ͢Δํ๏͍·ͷͱ͜Ζແ͍……- shallow cloneΛ༗ޮʹ͏- sparse checkoutΛ༗ޮʹ͏- ͳͲͷ͕ඞཁ- ͦͦCodeBuild͕git clone͢ΔΜͩ͠jenkins͠ͳͯ͘ ྑ͍Μ͚ͩͲ……- ͋Δ͍EBSΛ͏……
ຊʹJenkinsඞཁʁ- ͭ͡AWS CodeBuild࠷ۙΊͬͪΌͰ͖͕Αͯ͘ɼ ୯ମͰे͑Δ- GitHubͷhookड͚ΕΔ͠- Commit statusΛม͑Δػೳ·Ͱ͍͍ͭͯΔ- ϏϧυཤྺҰཡͰ͖Δ͠- CloudWatch LogsʹϏϧυͷϩάग़Δ- JenkinsෆཁͰʁʁʁʁɹ͜ΕͰेͰʁʁʁʁ- ͍
ຊʹJenkinsඞཁʁ- ࣗ༝ͳWebhookΛड͚Δඞཁ͕͋Δͱ͔……- ͋ͱ௨ͱ͔Ͷʂ- ͋Δ͍ͬͱଞʹϏϧυύΠϓϥΠϯΛܨ͛Δඞཁ͕͋Δͱ͔……- ͦ͏͍͏ͱ͖ΜΓͰ͢- (͋ͱ·͋Ұཡੑ͕Α͍) (ॾઆ͋Γ·͢)