สวัสดีทุกคน. เราดำเนินการต่อชุดบทความเกี่ยวกับการเขียนโครงการของคุณ
จัดเรียงกิ่งก้าน
สิ่งสำคัญคือเพื่อไม่ให้หลงทางในกิ่งก้านและลำดับในที่เก็บ ฉันจึงตัดสินใจเปลี่ยนชื่อโดยเพิ่ม คำนำ หน้าSTEP_{number} ตัวอย่างเช่น เรามีสามสาขานอกเหนือจากสาขาหลัก:- เจอาร์ทีบี-0
- เจอาร์ทีบี-2
- เจอาร์ทีบี-3
- STEP_1_JRTB-0 - ขั้นตอนแรก
- STEP_2_JRTB-2 - ขั้นตอนที่สอง
- STEP_3_JRTB-3 - ขั้นตอนที่สาม
เล็กน้อยเกี่ยวกับด็อกเกอร์
นักเทียบท่าคืออะไร? กล่าวโดยสรุป มันเป็นเครื่องมือที่คุณสามารถปรับใช้ (ปรับใช้) แอปพลิเคชันได้อย่างรวดเร็วและปลอดภัย โดยสร้างโครงสร้างพื้นฐานแบบปิดที่จำเป็นสำหรับพวกเขาเท่านั้น มันยังยากอยู่ ฉันเข้าใจ โดยทั่วไปแล้ว Docker ถือเป็นแพลตฟอร์มการพัฒนาที่คุณสามารถทำงานได้อย่างรวดเร็วและมีประสิทธิภาพ Docker สามารถเข้าใจได้ว่าเป็นโปรแกรมที่ทำงานบนเซิร์ฟเวอร์ โปรแกรมนี้มีความสามารถในการจัดเก็บคอนเทนเนอร์พร้อมกับแอพพลิเคชั่น ภาชนะคืออะไร? นี่เป็นโครงสร้างพื้นฐานแยกต่างหากซึ่งคุณสามารถเพิ่มทุกสิ่งที่คุณต้องการได้ ตัวอย่างเช่น สำหรับแอปพลิเคชัน Java เราจำเป็นต้องมี JRE เพื่อรันแอปพลิเคชัน คอนเทนเนอร์จะมีสิ่งนี้ เราจำเป็นต้องมีซอฟต์แวร์อื่น - เราสามารถเพิ่มสิ่งนี้ได้ หรือบางทีเราต้องการ Linux และคอนเทนเนอร์เซิร์ฟเล็ต Tomcat ก็สามารถทำได้เช่นกัน คอนเทนเนอร์ถูกสร้างขึ้นตามรูปภาพ กล่าวคือ นี่คือเทมเพลตเฉพาะที่มีทุกสิ่งที่จำเป็นในการสร้างคอนเทนเนอร์ Docker จะสร้างภาพนี้ได้อย่างไร? ในกรณีของเรา เราจะต้องสร้าง Dockerfile ที่รากของโปรเจ็กต์เพื่ออธิบายสิ่งที่ควรอยู่ในคอนเทนเนอร์ เนื่องจากเราไม่ต้องการเปิดเผยโทเค็นของบอทไม่ว่าที่ใด เราจะต้องส่งต่อทุกครั้งที่เราต้องการปรับใช้แอปพลิเคชัน คุณสามารถอ่านเพิ่มเติมเกี่ยวกับหัวข้อนี้ได้ที่นี่และที่นี่เราเขียน JRTB-13
เราจำเป็นต้องตั้งค่ากระบวนการปรับใช้ที่ง่ายและรวดเร็วสำหรับแอปพลิเคชันของเราไปยังเซิร์ฟเวอร์ นั่นก็คือสำหรับเครื่องจักรที่ทำงานตลอด 24 ชั่วโมงทุกวัน ลองใช้ Docker เป็นพื้นฐาน แต่ไม่มีงานใดในรายการของเราที่จะต้องรับผิดชอบในการเพิ่มฟังก์ชันนี้ อย่างใดฉันพลาดมันเมื่อสร้างมันขึ้นมา ไม่มีปัญหา เราจะสร้างมันขึ้นมาทันที ไปที่ แท็บ การสร้างปัญหาบน GitHub และเลือกคำขอคุณลักษณะ: เพิ่มคำอธิบายของงาน เกณฑ์สำหรับการยอมรับ กำหนดว่าปัญหานี้เป็นของโครงการใด และคุณสามารถสร้างปัญหาใหม่ได้: ตอนนี้ เพื่อแสดงว่างานได้รับการยอมรับ แล้ว สำหรับงานให้เปลี่ยนสถานะของงานจาก To do on In Progress: นี่คงเป็นบทความที่ยาก หากคุณมีปัญหาใด ๆ เขียนความคิดเห็น: ฉันจะตรวจสอบและตอบคำถามเหล่านี้อย่างสุดความสามารถ นี่จะเป็นการสนับสนุนลูกค้าเล็กๆ น้อยๆ :Dการสร้าง Dockerfile
ด็อคเกอร์ไฟล์คืออะไร? สำหรับ Docker นี่คือสคริปต์ (คำแนะนำทีละขั้นตอน) เกี่ยวกับวิธีการสร้างรูปภาพสำหรับคอนเทนเนอร์ Docker เพื่อให้แอปพลิเคชันของเราทำงานได้ เราจำเป็นต้องมี JDK เวอร์ชัน 11 นั่นคือเราต้องค้นหาอิมเมจนักเทียบท่า JDK 11 และเพิ่มลงในอิมเมจของเรา นี่เป็นสิ่งที่คล้ายกับวิธีที่เราเพิ่มการพึ่งพาให้กับหน่วยความจำ Docker มี DockerHubเพื่อจุดประสงค์นี้ หากต้องการดาวน์โหลดภาพในเครื่อง คุณต้องลงทะเบียนจากที่นั่น หลังจากลงทะเบียนแล้วไปหา JDK11 กัน จากสิ่งที่ ฉันพบ นี่คือคอนเทนเนอร์: adoptopenjdk/openjdk11 คำอธิบายของคอนเทนเนอร์นี้มีสิ่งที่จำเป็นสำหรับ dockerfile:FROM adoptopenjdk/openjdk11:ubi
RUN mkdir /opt/app
COPY japp.jar /opt/app
CMD ["java", "-jar", "/opt/app/japp.jar"]
มาแก้ไขโฟลเดอร์ที่เรานำไฟล์ jar มา เรามีมันอยู่ในโฟลเดอร์เป้าหมายหลังจากที่เรารันงาน mvn package maven ก่อนที่จะทำทั้งหมดนี้ เราจะสร้างสาขาหลักใหม่สำหรับงานของเรา: STEP_4_JRTB-13 ตามสาขาหลักที่อัปเด ต ตอนนี้คุณสามารถทำงานได้ ในรูทของโปรเจ็กต์ ให้สร้างไฟล์ที่ไม่มี นามสกุล Dockerfileและเพิ่มไฟล์ต่อไปนี้เข้าไปภายใน:
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
บรรทัดแรกคือสิ่งที่รูปภาพจะใช้ - adoptopenjdk/openjdk11 บรรทัดที่สองคือการเพิ่มอาร์กิวเมนต์ให้กับรูปภาพชื่อ JAR_FILE ซึ่งอยู่ในโฟลเดอร์เป้าหมาย นอกจากนี้ โฟลเดอร์ปัจจุบันยังถูกกำหนดโดยตำแหน่งของ Dockerfile บรรทัดที่สาม - คัดลอก jar ของโปรเจ็กต์ของเราลงในอิมเมจนักเทียบท่า บรรทัดสุดท้ายประกอบด้วยอาร์เรย์ที่สร้างขึ้นจากคำสั่งในเทอร์มินัล ซึ่งถูกคั่นด้วยช่องว่าง นั่นคือในท้ายที่สุดสิ่งต่อไปนี้จะถูกดำเนินการ: “java -jar /app.jar” เพื่อรักษาโทเค็นโทเค็นของบอทไว้เป็นความลับ เมื่อเริ่มต้นคอนเทนเนอร์ เราจะต้องส่งผ่านตัวแปรสองตัว - ชื่อของบอทและโทเค็นของมัน เมื่อต้องการทำเช่นนี้ เราจะเขียนแบบสอบถามที่ควรเปิดโครงการของเราด้วยตัวแปร และจะทำอย่างไร? คุณต้องใช้ Google: นี่คือลิงค์แรกพร้อมคำอธิบายปกติ เราต้องการทำอะไร? เรามีตัวแปรสองตัวในไฟล์ application.properties ที่เรากำหนดไว้:
- bot.ชื่อผู้ใช้
- bot.โทเค็น
- มารันสคริปต์ทุบตีกัน
- สคริปต์ทุบตีรันนักเทียบท่าเขียน
- Docker-compose เปิดตัวคอนเทนเนอร์นักเทียบท่าด้วยแอปพลิเคชันของเรา
- คอนเทนเนอร์ Docker รันแอปพลิเคชันของเรา
FROM adoptopenjdk/openjdk11:ubi
ARG JAR_FILE=target/*.jar
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}", "-jar", "/app.jar"]
คุณจะเห็นว่าเราได้เพิ่มสองบรรทัดและอัปเดต ENTRYPOINT เส้น:
ENV BOT_NAME=test.javarush_community_bot
ENV BOT_TOKEN=1375780501:AAE4A6Rz0BSnIGzeu896OjQnjzsMEG6_uso
ประกาศตัวแปรภายในไฟล์ตัวเข้ารหัส โดยค่าเริ่มต้นจะมีการระบุค่าไว้ หากเมื่อสร้างรูปภาพจาก dockerfile นี้ มีการส่งผ่านตัวแปรสภาพแวดล้อมที่มีชื่อดังกล่าว ค่าจะแตกต่างออกไป และใน ENTRYPOINT เราได้เพิ่มองค์ประกอบอีกสองสามรายการที่จะอ่านตัวแปรสภาพแวดล้อมเหล่านี้:
"-Dbot.username=${BOT_NAME}", "-Dbot.token=${BOT_TOKEN}"
ที่นี่คุณจะเห็นว่าภายในบรรทัดโดยใช้โครงสร้าง ${} ค่าของ BOT_NAME และ BOT_TOKEN จะถูกส่งผ่าน ต่อไป เราต้องสอนวิธีรับและส่งตัวแปรเหล่านี้ไปยังนักเทียบท่าเขียน
สร้าง docker-compose.yml
คงจะดีถ้าคุณอ่านเกี่ยวกับรูปแบบ YAML แยกกัน ไม่เช่นนั้นบทความจะเติบโตอย่างก้าวกระโดดแล้ว สำหรับเรา นี่เป็นอีกคำอธิบายหนึ่งของตัวแปรประเภท .properties เฉพาะในคุณสมบัติเท่านั้นที่เขียนผ่านจุด แต่ใน YAML สิ่งนี้ทำได้สวยงามขึ้นอีกเล็กน้อย ตัวอย่างเช่นเช่นนี้ ตัวแปรสองตัวใน .properties: javarush.telegram.bot.name=ivan javarush.telegram.bot.token=pupkin แต่ใน .yaml (เหมือนกับ .yml) มันจะเป็นดังนี้:javarush:
telegram:
bot:
name: ivan
token: pupkin
ตัวเลือกที่สองสวยงามและเข้าใจได้มากขึ้น ช่องว่างควรตรงตามที่ระบุไว้ข้างต้นทุกประการ มาแปล application.properties และ application.yml ของเรากันดีกว่า ก่อนอื่นคุณต้องสร้างมันขึ้นมา ในรูทของโปรเจ็กต์ ให้สร้างไฟล์docker-compose.ymlและเขียนสิ่งต่อไปนี้ที่นั่น:
version: '3.1'
services:
jrtb:
build:
context: .
environment:
- BOT_NAME=${BOT_NAME}
- BOT_TOKEN=${BOT_TOKEN}
restart: always
บรรทัดแรกคือเวอร์ชันที่เขียนโดยนักเทียบท่า บริการ:บอกว่าบรรทัดต่อไปนี้ทั้งหมดหลังจากนี้ (จะถูกเลื่อน) หมายถึงบริการที่เรากำลังกำหนดค่า จนถึงขณะนี้เรามีแอปพลิเคชัน Java ที่เรียกว่าjrtb เพียง รายการเดียวเท่านั้น และภายใต้นั้นจะเป็นการตั้งค่าทั้งหมด ตัวอย่างเช่นbuild: บริบท: . บอกว่าเราจะค้นหา Dockerfile ในไดเรกทอรีเดียวกันกับ docker-compose.yml แต่ ส่วน สภาพแวดล้อม:จะรับผิดชอบในการทำให้แน่ใจว่าเราส่งตัวแปรสภาพแวดล้อมที่จำเป็นไปยัง Dockerfile สิ่งที่เราต้องการ ดังนั้นเราจึงส่งตัวแปรด้านล่าง นักเทียบท่าเขียนจะค้นหาสิ่งเหล่านี้ในตัวแปรสภาพแวดล้อมการทำงานของเซิร์ฟเวอร์ มาเพิ่มลงในสคริปต์ทุบตี
การสร้างสคริปต์ทุบตี
ขั้นตอนสุดท้ายคือการสร้างสคริปต์ทุบตี สร้างไฟล์ชื่อ start.sh ในรูทของโปรเจ็กต์และเขียนไฟล์ต่อไปนี้:#!/bin/bash
# Pull new changes
git pull
# Prepare Jar
mvn clean
mvn package
# Ensure, that docker-compose stopped
docker-compose stop
# Add environment variables
export BOT_NAME=$1
export BOT_TOKEN=$2
# Start new deployment
docker-compose up --build -d
บรรทัดแรกจำเป็นสำหรับสคริปต์ทุบตีทั้งหมด: มันจะไม่ทำงานหากไม่มีมัน จากนั้น - เพียงชุดคำสั่งในเทอร์มินัลที่ต้องดำเนินการ ฉันได้เพิ่มความคิดเห็นในแต่ละคำสั่งดังนั้นจึงควรมีความชัดเจน สิ่งเดียวที่ฉันต้องการอธิบายคือความหมายของ $1 และ $2 นี่คือตัวแปรสองตัวที่จะถูกส่งไปเมื่อมีการเปิดใช้งานสคริปต์ทุบตี เมื่อใช้คำสั่งส่งออก พวกมันจะถูกเพิ่มลงในตัวแปรเซิร์ฟเวอร์และอ่านใน docker-compose สิ่งนี้ใช้ได้กับ Ubuntu อาจไม่ใช่สำหรับ Windows แต่ฉันไม่แน่ใจ ตอนนี้คุณต้องเพิ่มสคริปต์ stop.sh ซึ่งจะหยุดการทำงาน จะประกอบด้วยหลายบรรทัด:
#!/bin/bash
# Ensure, that docker-compose stopped
docker-compose stop
# Ensure, that the old application won't be deployed again.
mvn clean
ที่นี่เราหยุดการเขียนนักเทียบท่าและทำความสะอาดโปรเจ็กต์ jarnik ซึ่งวางอยู่รอบ ๆ นับตั้งแต่การสร้างครั้งล่าสุด เราทำเช่นนี้เพื่อให้แน่ใจว่าโครงการของเราถูกสร้างขึ้นใหม่อย่างถูกต้อง มีแบบอย่างอยู่แล้ว นั่นคือเหตุผลที่ฉันเพิ่ม) ด้วยเหตุนี้ เราจึงได้ไฟล์ใหม่ 4 ไฟล์:
- Dockerfile - ไฟล์สำหรับสร้างรูปภาพแอปพลิเคชันของเรา
- docker-compose.yml - ไฟล์ที่มีการตั้งค่าว่าเราจะเปิดตัวคอนเทนเนอร์ของเราอย่างไร
- start.sh - สคริปต์ทุบตีสำหรับการปรับใช้แอปพลิเคชันของเรา
- stop.sh เป็นสคริปต์ทุบตีเพื่อหยุดแอปพลิเคชันของเรา
# Release Notes ## 0.3.0-SNAPSHOT * JRTB-13: เพิ่มกระบวนการปรับใช้ให้กับโครงการ ## 0.2.0-SNAPSHOT * JRTB-3: ใช้รูปแบบคำสั่งสำหรับจัดการคำสั่ง Telegram Bot ## 0.1.0-SNAPSHOT * JRTB -2: เพิ่มบอทโทรเลข stub * JRTB-0: เพิ่มโครงการโครงกระดูก SpringBoot
และใน README เราจะเพิ่มย่อหน้าใหม่ที่อธิบายวิธีการปรับใช้แอปพลิเคชันของเรา:
## Deployment กระบวนการปรับใช้ง่ายที่สุดเท่าที่จะเป็นไปได้: ซอฟต์แวร์ที่จำเป็น: - เทอร์มินัลสำหรับการรันสคริปต์ทุบตี - นักเทียบท่า - นักเทียบท่าเขียนเพื่อปรับใช้แอปพลิเคชัน สลับไปที่สาขาที่ต้องการและเรียกใช้สคริปต์ทุบตี: $ bash start.sh ${bot_username} ${bot_token } เพียงเท่านี้
แน่นอนว่าทุกอย่างเขียนเป็นภาษาอังกฤษ ตามปกติในสาขา STEP_4_JRTB-13 ที่สร้างขึ้นใหม่ของเรา เราจะสร้างการคอมมิตใหม่โดยใช้ชื่อ: JRTB-13: ใช้กระบวนการปรับใช้ผ่านนักเทียบท่าและพุชมัน ฉันหยุดจมอยู่กับรายละเอียดเกี่ยวกับสิ่งที่ฉันได้อธิบายไปแล้วในบทความก่อนหน้านี้ ฉันไม่เห็นประเด็นในการทำซ้ำสิ่งเดียวกัน นอกจากนี้ผู้ที่คิดและลงมือทำเองจะไม่มีคำถามใดๆ ฉันพูดถึงวิธีสร้างสาขาใหม่ วิธีสร้างการคอมมิต วิธีส่งคอมมิตไปยังพื้นที่เก็บข้อมูล
GO TO FULL VERSION