Jenkins คืออะไร? เซิร์ฟเวอร์ CI อธิบาย

Jenkins นำเสนอวิธีง่ายๆในการตั้งค่าสภาพแวดล้อมการรวมแบบต่อเนื่องหรือการจัดส่งแบบต่อเนื่อง (CI / CD) สำหรับการรวมภาษาและที่เก็บซอร์สโค้ดเกือบทุกชนิดโดยใช้ไปป์ไลน์รวมถึงการพัฒนางานประจำอื่น ๆ โดยอัตโนมัติ แม้ว่า Jenkins จะไม่จำเป็นต้องสร้างสคริปต์สำหรับแต่ละขั้นตอน แต่ก็ให้วิธีที่รวดเร็วและมีประสิทธิภาพมากขึ้นในการรวมสายการสร้างการทดสอบและการปรับใช้ทั้งหมดของคุณมากกว่าที่คุณจะสามารถสร้างเองได้อย่างง่ายดาย

“ อย่าทำลายงานสร้างทุกคืน!” เป็นกฎสำคัญในร้านพัฒนาซอฟต์แวร์ที่โพสต์เวอร์ชันผลิตภัณฑ์ที่สร้างขึ้นใหม่ทุกเช้าสำหรับผู้ทดสอบ ก่อนเจนกินส์นักพัฒนาที่ดีที่สุดสามารถทำได้เพื่อหลีกเลี่ยงการทำลายงานสร้างในเวลากลางคืนคือการสร้างและทดสอบอย่างรอบคอบและประสบความสำเร็จบนเครื่องท้องถิ่นก่อนที่จะยอมรับรหัส แต่นั่นหมายถึงการทดสอบการเปลี่ยนแปลงของคน ๆ หนึ่งโดยแยกจากกันโดยที่ทุกคนไม่ได้ทำทุกวัน ไม่มีการรับประกันอย่างชัดเจนว่างานสร้างในยามค่ำคืนจะรอดพ้นจากการกระทำ

Jenkins - เดิมคือ Hudson - เป็นการตอบสนองโดยตรงต่อข้อ จำกัด นี้

ฮัดสันและเจนกินส์

ในปี 2004 Kohsuke Kawaguchi เป็นผู้พัฒนา Java ที่ Sun Kawaguchi เริ่มเบื่อที่จะทำลายงานสร้างในงานพัฒนาของเขาและต้องการหาทางรู้ก่อนที่จะส่งรหัสไปยังพื้นที่เก็บข้อมูลว่าโค้ดนั้นจะใช้งานได้หรือไม่ ดังนั้น Kawaguchi จึงสร้างเซิร์ฟเวอร์อัตโนมัติในและสำหรับ Java เพื่อให้เป็นไปได้ที่เรียกว่า Hudson ฮัดสันกลายเป็นที่นิยมใน Sun และกระจายไปยัง บริษัท อื่น ๆ ในฐานะโอเพ่นซอร์ส

ก้าวไปข้างหน้าอย่างรวดเร็วถึงปี 2011 และข้อพิพาทระหว่าง Oracle (ซึ่งได้รับ Sun) และชุมชนโอเพ่นซอร์สอิสระของฮัดสันทำให้เกิดการแยกทางกับการเปลี่ยนชื่อเจนกินส์ ในปี 2014 Kawaguchi กลายเป็น CTO ของ CloudBees ซึ่งนำเสนอผลิตภัณฑ์จัดส่งแบบต่อเนื่องของ Jenkins

ส้อมทั้งสองยังคงมีอยู่แม้ว่าเจนกินส์จะกระตือรือร้นกว่ามาก วันนี้โครงการ Jenkins ยังคงดำเนินอยู่ เว็บไซต์ Hudson ปิดตัวลงเมื่อวันที่ 31 มกราคม 2020

ในเดือนมีนาคม 2019 Linux Foundation พร้อมด้วย CloudBees, Google และ บริษัท อื่น ๆ อีกหลายแห่งได้เปิดตัวซอฟต์แวร์โอเพ่นซอร์สใหม่ที่เรียกว่า Continuous Delivery Foundation (CDF) ผู้ร่วมให้ข้อมูลของ Jenkins ตัดสินใจว่าโครงการของพวกเขาควรเข้าร่วมมูลนิธิใหม่นี้ Kawaguchi เขียนในช่วงเวลาที่ไม่มีอะไรสำคัญที่จะเปลี่ยนแปลงสำหรับผู้ใช้

ในเดือนมกราคมปี 2020 Kawaguchi ประกาศว่าเขากำลังจะย้ายไปที่ Launchable สตาร์ทอัพใหม่ เขายังบอกด้วยว่าเขาจะก้าวกลับจากเจนกินส์อย่างเป็นทางการแม้ว่าจะอยู่ในคณะกรรมการกำกับดูแลด้านเทคนิคของมูลนิธิการจัดส่งแบบต่อเนื่องและเปลี่ยนบทบาทของเขาที่ CloudBees เป็นที่ปรึกษา

วิดีโอที่เกี่ยวข้อง: วิธีส่งโค้ดให้เร็วขึ้นด้วย CI / CD

ระบบอัตโนมัติของ Jenkins

ปัจจุบัน Jenkins เป็นเซิร์ฟเวอร์อัตโนมัติแบบโอเพนซอร์สชั้นนำที่มีปลั๊กอิน 1,600 ตัวเพื่อรองรับการทำงานอัตโนมัติในการพัฒนาทุกประเภท ปัญหาเดิมที่ Kawaguchi พยายามแก้ไขการผสานรวมอย่างต่อเนื่องและการส่งมอบโค้ด Java อย่างต่อเนื่อง (เช่นการสร้างโปรเจ็กต์การรันการทดสอบการวิเคราะห์โค้ดแบบคงที่และการปรับใช้) เป็นเพียงหนึ่งในหลาย ๆ กระบวนการที่เจนกินส์ใช้โดยอัตโนมัติ ปลั๊กอิน 1,600 เหล่านี้ครอบคลุม 5 ด้าน ได้แก่ แพลตฟอร์ม UI การดูแลระบบการจัดการซอร์สโค้ดและที่บ่อยที่สุดคือการจัดการบิลด์

Jenkins ทำงานอย่างไร

Jenkins ถูกแจกจ่ายเป็นไฟล์เก็บถาวรของ WAR และเป็นแพ็คเกจตัวติดตั้งสำหรับระบบปฏิบัติการหลักเป็นแพ็คเกจ Homebrew เป็นอิมเมจ Docker และเป็นซอร์สโค้ด ซอร์สโค้ดส่วนใหญ่เป็น Java โดยมีไฟล์ Groovy, Ruby และ Antlr เพียงไม่กี่ไฟล์

คุณสามารถรัน Jenkins WAR แบบสแตนด์อโลนหรือเป็น servlet ในแอ็พพลิเคชันเซิร์ฟเวอร์ Java เช่น Tomcat ไม่ว่าในกรณีใดจะสร้างอินเทอร์เฟซผู้ใช้บนเว็บและยอมรับการเรียกไปยัง REST API

เมื่อคุณเรียกใช้ Jenkins เป็นครั้งแรกระบบจะสร้างผู้ดูแลระบบโดยใช้รหัสผ่านแบบสุ่มแบบยาวซึ่งคุณสามารถวางลงในหน้าเว็บเริ่มต้นเพื่อปลดล็อกการติดตั้ง

ปลั๊กอิน Jenkins

เมื่อติดตั้งแล้ว Jenkins อนุญาตให้คุณยอมรับรายการปลั๊กอินเริ่มต้นหรือเลือกปลั๊กอินของคุณเอง

เมื่อคุณเลือกชุดปลั๊กอินเริ่มต้นของคุณแล้วให้คลิกปุ่มติดตั้งจากนั้นเจนกินส์จะเพิ่มเข้าไป

หน้าจอหลักของ Jenkins จะแสดงคิวการสร้างปัจจุบันและสถานะผู้ดำเนินการและมีลิงก์สำหรับสร้างรายการใหม่ (งาน) จัดการผู้ใช้ดูประวัติการสร้างจัดการเจนกินส์ดูมุมมองที่กำหนดเองของคุณและจัดการข้อมูลประจำตัวของคุณ

รายการใหม่ของ Jenkins สามารถเป็นงานใดก็ได้จากหกประเภทพร้อมโฟลเดอร์สำหรับจัดระเบียบรายการ

มี 18 สิ่งที่คุณสามารถทำได้จากหน้า Manage Jenkins รวมถึงตัวเลือกในการเปิดอินเทอร์เฟซบรรทัดคำสั่ง อย่างไรก็ตามในตอนนี้เราควรดูไปป์ไลน์ซึ่งเป็นเวิร์กโฟลว์ขั้นสูงที่กำหนดโดยสคริปต์

ท่อ Jenkins

เมื่อคุณกำหนดค่า Jenkins ได้แล้วก็ถึงเวลาสร้างโครงการที่ Jenkins สามารถสร้างให้คุณได้ ในขณะที่คุณสามารถใช้เว็บ UI เพื่อสร้างสคริปต์การปฏิบัติที่ดีที่สุดในปัจจุบันคือการสร้างสคริปต์ท่อชื่อ Jenkinsfile ,และตรวจสอบลงพื้นที่เก็บข้อมูลของคุณ ภาพหน้าจอด้านล่างแสดงเว็บฟอร์มการกำหนดค่าสำหรับไปป์ไลน์หลายสาขา

อย่างที่คุณเห็นแหล่งที่มาของสาขาสำหรับไปป์ไลน์ประเภทนี้ในการติดตั้ง Jenkins พื้นฐานของฉันอาจเป็นที่เก็บ Git หรือ Subversion รวมถึง GitHub หากคุณต้องการพื้นที่เก็บข้อมูลประเภทอื่นหรือบริการพื้นที่เก็บข้อมูลออนไลน์ที่แตกต่างกันคุณต้องเพิ่มปลั๊กอินที่เหมาะสมและรีบูต Jenkins ฉันลองแล้ว แต่ไม่สามารถนึกถึงระบบการจัดการซอร์สโค้ด (SCM) ที่ยังไม่มีปลั๊กอิน Jenkins อยู่ในรายการ

ไปป์ไลน์ของ Jenkins สามารถประกาศหรือเขียนสคริปต์ได้ เปิดเผยท่อง่ายของทั้งสองใช้ไวยากรณ์และ Groovy ที่เข้ากันได้ถ้าคุณต้องการคุณสามารถเริ่มต้นไฟล์ที่มี#!groovyการชี้ให้แก้ไขรหัสของคุณในทิศทางที่เหมาะสม ไปป์ไลน์ที่เปิดเผยเริ่มต้นด้วยpipelineบล็อกกำหนดagentและกำหนดstagesซึ่งรวมถึงปฏิบัติการได้stepsดังตัวอย่างสามขั้นตอนด้านล่าง

ไปป์ไลน์ {

    ตัวแทนใด ๆ

    ขั้นตอน {

        เวที ('สร้าง') {

            ขั้นตอน {

                ก้อง 'ตึก .. '

            }

        }

        เวที ('ทดสอบ') {

            ขั้นตอน {

                สะท้อน 'การทดสอบ .. '

            }

        }

        เวที ('ทำให้ใช้งานได้') {

            ขั้นตอน {

                ก้อง 'กำลังทำให้ใช้งานได้ ... '

            }

        }

    }

}

pipelineเป็นบล็อกด้านนอกที่บังคับเพื่อเรียกใช้ปลั๊กอินไปป์ไลน์ของเจนกินส์ agentกำหนดตำแหน่งที่คุณต้องการเรียกใช้ไปป์ไลน์ anyบอกว่าให้ใช้ตัวแทนที่มีอยู่เพื่อรันไปป์ไลน์หรือสเตจ ตัวแทนที่เฉพาะเจาะจงมากขึ้นอาจประกาศคอนเทนเนอร์ที่จะใช้ตัวอย่างเช่น:

ตัวแทน {

    นักเทียบท่า {

        ภาพ 'maven: 3-alpine'

        ป้ายกำกับ "ป้ายกำกับที่กำหนดเอง"

        args '-v / tmp: / tmp'

    }

}

stagesมีลำดับของคำสั่งขั้นตอนอย่างน้อยหนึ่งรายการ ในตัวอย่างข้างต้นสามขั้นตอนคือสร้างทดสอบและปรับใช้

stepsทำงานจริง ในตัวอย่างด้านบนขั้นตอนเพียงแค่พิมพ์ข้อความ ขั้นตอนการสร้างที่มีประโยชน์มากขึ้นอาจมีลักษณะดังต่อไปนี้:

ไปป์ไลน์ {

    ตัวแทนใด ๆ

    ขั้นตอน {

        เวที ('สร้าง') {

            ขั้นตอน {

                ช 'ทำ'

                archiveArtifacts สิ่งประดิษฐ์: '** / target / *. jar', ลายนิ้วมือ: จริง

            }

        }

    }

}

ที่นี่เรากำลังเรียกใช้makeจากเชลล์จากนั้นเก็บไฟล์ JAR ที่สร้างขึ้นไปยังที่เก็บถาวรของ Jenkins

postการกระทำส่วนกำหนดที่จะทำงานในตอนท้ายของระยะท่อหรือเวที คุณสามารถใช้จำนวนของการโพสต์บล็อกสภาพภายในโพสต์ส่วน: always, changed, failure, success, และunstableaborted

ตัวอย่างเช่น Jenkinsfile ด้านล่างจะเรียกใช้ JUnit หลังขั้นตอนการทดสอบเสมอ แต่จะส่งอีเมลเมื่อไปป์ไลน์ล้มเหลวเท่านั้น

ไปป์ไลน์ {

    ตัวแทนใด ๆ

    ขั้นตอน {

        เวที ('ทดสอบ') {

            ขั้นตอน {

                sh 'ตรวจสอบ'

            }

        }

    }

    post {

        เสมอ {

            จูนิท '** / target / *. xml'

        }

        ความล้มเหลว {

            ส่งอีเมลไปที่: [email protected] เรื่อง: 'The Pipeline failed :('

        }

    }

}

ไปป์ไลน์ที่เปิดเผยสามารถแสดงสิ่งที่คุณต้องการส่วนใหญ่ในการกำหนดไปป์ไลน์และเรียนรู้ได้ง่ายกว่าไวยากรณ์ไปป์ไลน์แบบสคริปต์ซึ่งเป็น DSL แบบ Groovy ไปป์ไลน์ที่มีสคริปต์เป็นสภาพแวดล้อมการเขียนโปรแกรมเต็มรูปแบบ

สำหรับการเปรียบเทียบ Jenkinsfiles สองรายการต่อไปนี้เทียบเท่ากันอย่างสมบูรณ์

ไปป์ไลน์ประกาศ

ไปป์ไลน์ {

    ตัวแทน {docker 'node: 6.3'}

    ขั้นตอน {

        เวที ('build') {

            ขั้นตอน {

                sh 'npm - รุ่น'

            }

        }

    }

ไปป์ไลน์ที่เขียนสคริปต์

โหนด ('นักเทียบท่า') {

    scm เช็คเอาต์

    เวที ('สร้าง') {

        docker.image ('node: 6.3'). inside {

            sh 'npm - รุ่น'

        }

    }

}

Blue Ocean, Jenkins GUI

หากคุณต้องการ UI ของ Jenkins ล่าสุดและยิ่งใหญ่ที่สุดคุณสามารถใช้ปลั๊กอิน Blue Ocean ซึ่งให้ประสบการณ์การใช้งานแบบกราฟิกแก่ผู้ใช้ คุณสามารถเพิ่มปลั๊กอิน Blue Ocean ในการติดตั้ง Jenkins ที่คุณมีอยู่หรือเรียกใช้คอนเทนเนอร์ Jenkins / Blue Ocean Docker เมื่อติดตั้ง Blue Ocean แล้วเมนูหลักของ Jenkins จะมีไอคอนพิเศษ:

คุณสามารถเปิด Blue Ocean ได้โดยตรงหากต้องการ ในโฟลเดอร์ / blue บนเซิร์ฟเวอร์ Jenkins การสร้างไปป์ไลน์ใน Blue Ocean เป็นภาพกราฟิกมากกว่า Jenkins ธรรมดาเล็กน้อย:

Jenkins Docker

ดังที่ได้กล่าวไปก่อนหน้านี้ Jenkins ยังแจกจ่ายเป็นภาพ Docker ไม่มีขั้นตอนเพิ่มเติมในกระบวนการ: เมื่อคุณเลือกประเภท SCM แล้วคุณจะต้องระบุ URL และข้อมูลรับรองจากนั้นสร้างไปป์ไลน์จากที่เก็บเดียวหรือสแกนที่เก็บทั้งหมดในองค์กร ทุกสาขาที่มี Jenkinsfile จะได้ไปป์ไลน์

ที่นี่ฉันกำลังเรียกใช้อิมเมจ Blue Ocean Docker ซึ่งมาพร้อมกับปลั๊กอินบริการ Git อีกสองสามตัวที่ติดตั้งมากกว่ารายการเริ่มต้นของผู้ให้บริการ SCM:

เมื่อคุณใช้งานไปป์ไลน์แล้วปลั๊กอิน Blue Ocean จะแสดงสถานะดังที่แสดงด้านบน คุณสามารถซูมเข้าในแต่ละท่อเพื่อดูขั้นตอนและขั้นตอนต่างๆ:

คุณยังสามารถขยายสาขา (ด้านบน) และกิจกรรม (ด้านล่าง):  

-

ทำไมต้องใช้ Jenkins?

ปลั๊กอิน Jenkins Pipeline ที่เราใช้รองรับกรณีการใช้งานแบบบูรณาการอย่างต่อเนื่อง / การจัดส่งแบบต่อเนื่อง (CICD) ซึ่งน่าจะเป็นการใช้งานทั่วไปสำหรับ Jenkins มีข้อควรพิจารณาพิเศษสำหรับกรณีการใช้งานอื่น ๆ

โปรเจ็กต์ Java เป็น raison d'êtreดั้งเดิมสำหรับ Jenkins เราได้เห็นแล้วว่าเจนกินส์สนับสนุนการสร้างร่วมกับ Maven มันยังทำงานร่วมกับ Ant, Gradle, JUnit, Nexus และ Artifactory

Android ใช้งาน Java ชนิดหนึ่ง แต่แนะนำปัญหาเกี่ยวกับวิธีทดสอบบนอุปกรณ์ Android ประเภทต่างๆ ปลั๊กอินโปรแกรมจำลอง Android ช่วยให้คุณสร้างและทดสอบบนอุปกรณ์จำลองได้มากเท่าที่คุณต้องการกำหนด ปลั๊กอิน Google Play Publisher ช่วยให้คุณสามารถส่งบิวด์ไปยังช่องอัลฟาใน Google Play เพื่อเผยแพร่หรือทดสอบเพิ่มเติมบนอุปกรณ์จริง

ฉันได้แสดงตัวอย่างที่เราระบุคอนเทนเนอร์ Docker เป็นตัวแทนสำหรับไปป์ไลน์และตำแหน่งที่เรารัน Jenkins และ Blue Ocean ในคอนเทนเนอร์ Docker คอนเทนเนอร์ Docker มีประโยชน์มากในสภาพแวดล้อมของ Jenkins ในการปรับปรุงความเร็วความสามารถในการปรับขนาดและความสม่ำเสมอ

มีสองกรณีการใช้งานหลักสำหรับ Jenkins และ GitHub หนึ่งคือการรวมบิวด์ซึ่งสามารถรวมเซอร์วิสฮุคเพื่อเรียกเจนกินส์ทุกครั้งที่คอมมิตไปยังที่เก็บ GitHub ของคุณ ประการที่สองคือการใช้การตรวจสอบสิทธิ์ GitHub เพื่อควบคุมการเข้าถึง Jenkins ผ่าน OAuth

Jenkins รองรับภาษาอื่น ๆ อีกมากมายนอกเหนือจาก Java สำหรับ C / C ++ มีปลั๊กอินสำหรับดักจับข้อผิดพลาดและคำเตือนจากคอนโซลสร้างบิลด์สคริปต์ด้วย CMake รันการทดสอบหน่วยและทำการวิเคราะห์โค้ดแบบคงที่ Jenkins มีการผสานรวมกับเครื่องมือ PHP จำนวนมาก

แม้ว่าคุณจะไม่จำเป็นต้องสร้างโค้ด Python (ยกเว้นกรณีที่คุณใช้ Cython หรือสร้างวงล้อ Python สำหรับการติดตั้ง) Jenkins ได้รวมเข้ากับเครื่องมือทดสอบและรายงาน Python เช่น Nose2 และ Pytest และคุณภาพของโค้ดก็มีประโยชน์ เครื่องมือเช่น Pylint ในทำนองเดียวกัน Jenkins ทำงานร่วมกับเครื่องมือ Ruby เช่น Rake, Cucumber, Brakeman และ CI :: Reporter

Jenkins สำหรับ CI / CD

โดยรวมแล้ว Jenkins เสนอวิธีง่ายๆในการตั้งค่าสภาพแวดล้อม CI / CD สำหรับการรวมกันของภาษาและที่เก็บซอร์สโค้ดโดยใช้ pipelines รวมถึงการพัฒนางานประจำอื่น ๆ โดยอัตโนมัติ แม้ว่าเจนกินส์จะไม่จำเป็นต้องสร้างสคริปต์สำหรับแต่ละขั้นตอน แต่ก็ให้วิธีที่รวดเร็วและมีประสิทธิภาพมากขึ้นในการรวมสายการสร้างการทดสอบและการปรับใช้ทั้งหมดของคุณมากกว่าที่คุณจะสามารถสร้างด้วยตัวเองได้อย่างง่ายดาย