บูรณาการอย่างต่อเนื่องกับ Jenkins

เมื่อมองย้อนกลับไปว่าซอฟต์แวร์ถูกสร้างและใช้งานได้อย่างไรเมื่อ 15 ปีก่อนดูเหมือนว่าน่าแปลกใจที่แอปพลิเคชันของเราใช้งานได้จริง ในสมัยนั้นวงจรการพัฒนาซอฟต์แวร์ประกอบด้วยการรันบิลด์บนเครื่องโลคัลคัดลอกอาร์ติแฟกต์ไปยังเซิร์ฟเวอร์จัดเตรียมด้วยตนเองและทดสอบแต่ละแอปพลิเคชันด้วยตนเองผ่านการทำซ้ำหลายครั้ง เมื่อทีม dev พอใจกับบิลด์เราจะปรับใช้แอปพลิเคชันในการผลิตด้วยตนเอง สิ่งที่สอดคล้องกันมากที่สุดเกี่ยวกับรูปแบบการพัฒนานี้คือความไม่สอดคล้องกัน - ในกระบวนการและผลลัพธ์

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

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

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

รู้เบื้องต้นเกี่ยวกับ CI / CD

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

ใช้แอปพลิเคชัน Java ที่สร้างโดยใช้ Maven เป็นตัวอย่าง ในการตรวจจับการเปลี่ยนแปลงรหัสเซิร์ฟเวอร์ CI ของคุณสามารถตอบสนองโดยการเรียกใช้mvn clean installไฟล์. ในการกำหนดค่า Maven build ทั่วไปจะดำเนินการทดสอบหน่วยใหม่โดยเป็นส่วนหนึ่งของคำสั่ง build ในขณะที่สร้างซอร์สโค้ดเซิร์ฟเวอร์สามารถดำเนินการเพิ่มเติมได้หลายอย่าง:

  • รวมสาขาคุณลักษณะของคุณกลับเข้าไปในสาขาหลักหรือสาขาหลักของคุณเมื่อรหัสที่ผูกมัดผ่านการทดสอบหน่วย
  • ดำเนินการวิเคราะห์โค้ดแบบคงที่เช่นการครอบคลุมของโค้ดความซับซ้อนของโค้ดการตรวจสอบข้อบกพร่องทั่วไปเป็นต้น
  • เผยแพร่สิ่งประดิษฐ์บิวด์ของคุณไปยังที่เก็บเช่น Artifactory หรือ Sonatype Nexus
  • ปรับใช้แอปพลิเคชันของคุณกับสภาพแวดล้อมการทดสอบการรวม
  • ดำเนินการทดสอบการรวม
  • ปรับใช้แอปพลิเคชันของคุณกับสภาพแวดล้อมการทดสอบประสิทธิภาพ
  • ดำเนินการทดสอบการโหลดกับแอปพลิเคชันของคุณ
  • ปรับใช้แอปพลิเคชันของคุณกับสภาพแวดล้อมการทดสอบการยอมรับของผู้ใช้ (UAT)
  • ทำให้แอปพลิเคชันของคุณใช้งานได้จริง

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

โดยทั่วไปการผสานรวมอย่างต่อเนื่องจะทำได้โดยใช้เครื่องมือเช่น Jenkins, Bamboo หรือ TeamCity ซึ่งจัดระเบียบขั้นตอนการสร้างของคุณให้เป็นไปป์ไลน์การรวม Jenkins น่าจะเป็นผลิตภัณฑ์ CI / CD ที่ได้รับความนิยมมากที่สุดและเข้ากันได้ดีกับ Docker

ดาวน์โหลดและติดตั้ง Jenkins

Jenkins เป็นเซิร์ฟเวอร์รวมที่ต่อเนื่องและอื่น ๆ ประกอบด้วยกลไกอัตโนมัติและระบบนิเวศปลั๊กอินที่สนับสนุนการผสานรวมอย่างต่อเนื่องการทดสอบอัตโนมัติและการจัดส่งแบบต่อเนื่อง คุณปรับแต่งไปป์ไลน์การจัดส่งตามความต้องการของคุณ

มีหลายวิธีในการเรียกใช้ Jenkins:

  1. ดาวน์โหลดไฟล์ WAR และติดตั้งบนคอนเทนเนอร์ servlet บนคอมพิวเตอร์ของคุณ
  2. ตั้งค่าเครื่องเสมือนในคลาวด์สาธารณะเช่น AWS และโฮสต์ Jenkins ที่นั่น
  3. ใช้ประโยชน์จากผู้ให้บริการระบบคลาวด์ Jenkins เช่น CloudBees
  4. ตั้งค่า Jenkins ในการติดตั้งทดสอบโดยใช้ Docker

ฉันจะแสดงวิธีการตั้งค่าทั้งการติดตั้งในเครื่องและการติดตั้งทดสอบ Docker

ดาวน์โหลดและติดตั้ง Jenkins ในเครื่อง

เริ่มต้นด้วยการดาวน์โหลด Jenkins และเลือกรุ่น Long-Term Support (LTS) จากหน้าแรกของ Jenkins เนื่องจากฉันใช้ Mac การติดตั้งจึงดาวน์โหลดpkgไฟล์โดยอัตโนมัติซึ่งวางไว้jenkins.warในApplication/Jenkinsโฟลเดอร์ของฉัน ไฟล์ WAR สามารถปรับใช้กับคอนเทนเนอร์ servlet ใดก็ได้

คุณจะต้องดาวน์โหลดและติดตั้ง Apache Tomcat จากการเขียนนี้ Tomcat เวอร์ชันล่าสุดคือ 8.5.4 แต่คุณควรจะสามารถเรียกใช้เวอร์ชันล่าสุดได้ ดาวน์โหลดzipหรือtar.gzไฟล์และขยายขนาดลงในฮาร์ดไดรฟ์ของคุณ คัดลอกไฟล์ jenkins.war ไปยังwebappsโฟลเดอร์ของ Tomcat จากนั้นเรียกใช้ไฟล์bin/startup.shหรือ คุณสามารถทดสอบว่ามันทำงานโดยการเปิดเบราว์เซอร์ของคุณเพื่อ:bin/startup.bat//localhost:8080

ในการเริ่ม Jenkins ให้เปิดเบราว์เซอร์ไปที่ URL: // localhost: 8080 / jenkins

คุณควรจะได้หน้าจอที่เหมือนรูปที่ 1

สตีเวนไฮน์ส

ถัดไปเจนกินส์สร้างรหัสผ่านการบริหารงานและเขียนว่าทั้งสองของ Tomcat ล็อกไฟล์และไดเรกทอรีบ้านต่อไปนี้:logs/catalina.out .jenkins/secrets/initialAdminPasswordเรียกรหัสผ่านให้ใส่ไว้ในการบริหารองค์ประกอบแบบฟอร์มรหัสผ่าน (แสดงในรูปที่ 1) และกดดำเนินการต่อ คุณจะได้รับแจ้งให้ติดตั้งปลั๊กอินที่แนะนำหรือเลือกปลั๊กอินที่จะติดตั้ง ตอนนี้ขอแนะนำให้ติดตั้งปลั๊กอินที่แนะนำ

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

สตีเวนไฮน์ส

กำหนดค่าแอปตัวอย่างด้วย Maven

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

จากแผงควบคุมเจนกิ้นส์คลิกจัดการเจนกินส์และเลือกConfiguration Tool ทั่วโลก สิ่งแรกที่เราจะทำคือกำหนดค่า JDK ในส่วน JDK ให้คลิกเพิ่ม JDKตั้งชื่อ (ของฉันคือ "JDK8") และปล่อยให้การติดตั้งเริ่มต้นจาก java.sun.comเลือกไว้ ยอมรับข้อตกลงใบอนุญาต Oracle จากนั้นคลิกลิงก์ "โปรดป้อนชื่อผู้ใช้ / รหัสผ่านของคุณ" ป้อนชื่อผู้ใช้ของ Oracle และรหัสผ่านและกดปิด คุณจะเห็นหน้าจอคล้ายกับรูปที่ 3

สตีเวนไฮน์ส

คลิกApplyบันทึกงานของคุณแล้วเลื่อนลงไปที่ส่วน Maven และคลิกเพิ่ม Maven ป้อนชื่อของ Maven (ของฉันคือ "Maven 3.3.9") ปล่อยให้ "ติดตั้งอัตโนมัติ" และ "ติดตั้งจาก Apache" คลิกบันทึกเมื่อคุณพร้อม คุณควรจะเห็นหน้าจอคล้ายกับรูปที่ 4

สตีเวนไฮน์ส

Git มาพร้อมกับ Jenkins ที่กำหนดค่าไว้ล่วงหน้าดังนั้นตอนนี้คุณควรมีเครื่องมือทั้งหมดที่ติดตั้งไว้เพื่อชำระเงินและสร้างโครงการ Java จาก Git ด้วย Maven

ติดตั้ง Jenkins ใน Docker container

If you don't want to install Jenkins on your local machine, you have the option of running it in a Docker container. The official Jenkins Docker image lets you run and test an installation of Jenkins without actually configuring it on a local machine.

Installing Docker

See my introduction to Docker for a beginner's guide to Docker, including installation and setup instructions.

Assuming you already have Docker setup in your development environment, you can launch Jenkins from the Docker the command line:

 docker run -p 8080:8080 -p 50000:50000 -v /your/home/jenkins:/var/jenkins_home -d jenkins 

This command tells Docker to run the latest release of jenkins with the following options:

  • -p 8080:8080: Maps port 8080 on the Docker container to port 8080 on the Docker host, so that you can connect to the Jenkins web app on port 8080.
  • -p 50000:50000: Maps port 50000 on the Docker container to port 50000 on the Docker host. Jenkins uses this port internally to allow build slave executors to connect to the master Jenkins server.
  • -v /your/home/jenkins:/var/jenkins_home: Maps Jenkins data storage to your local directory, so that you can restart your Docker container without losing your data.
  • -d: Lets you run the Docker container in a detached mode, or as a daemon process.

The following shows the output for running these commands:

 $ docker run -p 8000:8080 -v /Users/shaines/jenkins/:/var/jenkins_home -d jenkins cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53 

Because we're running our Docker container in detached mode, we need to follow the logs that are output by Jenkins. You can do so with the docker logs -f command. Just pass in the first few hexadecimal numbers of the container ID, in this case cc16573ce71ae424d4122e9e4afd3a294fda6606e0333838fe332fc4e11d0d53:

 $ docker logs -f cc1 Running from: /usr/share/jenkins/jenkins.war webroot: EnvVars.masterEnvVars.get("JENKINS_HOME") ... ************************************************************* ************************************************************* ************************************************************* Jenkins initial setup is required. An admin user has been created and a password generated. Please use the following password to proceed to installation: 205be6fe69c447dd933a3c9ce7420496 This may also be found at: /var/jenkins_home/secrets/initialAdminPassword ************************************************************* ************************************************************* ************************************************************* 

Setup Jenkins CI for a Java web app

ต่อไปเราจะตั้งค่างานเว็บแอปพลิเคชัน Java อย่างง่ายใน Jenkins เนื่องจากแอปพลิเคชันไม่สำคัญสำหรับบทช่วยสอนนี้เราจะใช้แอปตัวอย่าง Hello, World Servlet แบบธรรมดาของฉันซึ่งฉันโฮสต์บน GitHub

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

สตีเวนไฮน์ส

เราจะเลือกประเภทโครงการ Freestyle สำหรับโครงการนี้ แต่คุณควรตระหนักถึงตัวเลือกของคุณ:

  • โปรเจ็กต์ฟรีสไตล์: โปรเจ็กต์ที่พบบ่อยที่สุดนี้ช่วยให้คุณสามารถมอนิเตอร์ที่เก็บซอร์สโค้ดและใช้ระบบบิลด์ใด ๆ เช่น Maven และ Ant
  • Pipeline: Choose this project type for complicated projects with moving parts that you need to coordinate across multiple build slaves.
  • External job: Use this to configure an automated external job that you want to track in Jenkins as part of your build.
  • Multi-configuration project: This is the job type for projects that require different configurations for different environments, such as production, staging, and test.
  • Folder: When you have a complicated build then you might want to organize things into folders, each with their own distinct namespace.
  • Multi-branch pipeline: automatically create a set of pipeline projects, based on the code branches that are defined in your source code repository

Enter a project name, in this case "hello-world-servlet", and choose "OK". Next, choose GitHub project, then enter the GitHub URL of your project: //github.com/ligado/hello-world-servlet.

Under Source Code Management, choose Git and enter the same project URL.

In the Build Triggers section, choose Build when a change is pushed to GitHub so that Jenkins will build your code anytime you push a change to GitHub.

ในส่วนการสร้างเพิ่มขั้นตอนการสร้างใหม่เลือกเรียกใช้เป้าหมาย Maven ระดับบนสุดเลือกอินสแตนซ์ Maven ที่คุณกำหนดค่าไว้ก่อนหน้านี้ (เช่น "Maven 3.3.9") และป้อนการติดตั้งใหม่ทั้งหมดในฟิลด์เป้าหมาย ปล่อยให้การดำเนินการหลังสร้างว่างไว้ในตอนนี้ เมื่อเสร็จแล้วให้กดบันทึก

เมื่อคุณกลับไปที่แดชบอร์ดคุณจะเห็นหน้าจอที่คล้ายกับรูปที่ 6

สตีเวนไฮน์ส

ในการทดสอบการกำหนดค่าของคุณให้กดปุ่มสร้างเดี๋ยวนี้ถัดจากโครงการ hello-world-servlet คุณควรเห็นบิลด์ที่ดำเนินการสำเร็จแล้วในประวัติการสร้างทางด้านซ้ายมือของหน้าโปรเจ็กต์ดังรูปที่ 7

สตีเวนไฮน์ส

หากต้องการดูว่าเกิดอะไรขึ้นให้คลิกที่บิลด์แล้วคลิกเอาต์พุตคอนโซลซึ่งจะแสดงขั้นตอนทั้งหมดที่เจนกินส์ทำและผลลัพธ์ เอาต์พุตคอนโซลอยู่ด้านล่าง