JavaRush /จาวาบล็อก /Random-TH /เรากำลังเขียนโครงการ เพิ่ม SpringBoot และตั้งค่ากระบวนการ...
Roman Beekeeper
ระดับ

เรากำลังเขียนโครงการ เพิ่ม SpringBoot และตั้งค่ากระบวนการ CI - "โครงการ Java จาก A ถึง Z"

เผยแพร่ในกลุ่ม
บทความจากซีรีส์เกี่ยวกับการสร้างโปรเจ็กต์ Java (ลิงก์ไปยังเนื้อหาอื่นอยู่ท้ายสุด) เป้าหมายคือการวิเคราะห์เทคโนโลยีที่สำคัญ ผลลัพธ์คือการเขียนบอทโทรเลข สวัสดีผู้อ่านที่รัก ตามที่อธิบายไว้ใน ส่วน ที่แล้วเราจะไปตามแผน เราได้สร้างโปรเจ็กต์แล้ว และถึงเวลากรอกโค้ดแล้ว ตอนนี้ปัญหาทั้งหมดจะถูกเพิ่มเป็นคอมมิตแยกกัน ฉันจะอธิบายทุกสิ่งที่จำเป็นที่นี่ หากฉันพลาดบางสิ่งบางอย่างหรืออธิบายไม่ชัดเจนเพียงพอ ถามในความคิดเห็น ฉันจะพยายามตอบ"โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 1

เราเขียน JRTB-0M

ในงานนี้ เราจำเป็นต้องเพิ่มเฟรมเวิร์ก SpringBoot ว่างๆ สำหรับงานในอนาคต เราจะทำสิ่งนี้ในลักษณะเดียวกับที่เราทำในบทความเกี่ยวกับ SpringBoot + Flyway ดาวน์โหลดโปรเจ็กต์เปิดใน IDEA และสร้างสาขาใหม่ชื่อJRTB- 0 ฉันอธิบายวิธีการทำ สิ่งนี้ผ่านแนวคิดที่นี่ ซึ่งจะทำให้เราติดตามงานในอนาคตได้ง่ายขึ้น "โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 2คุณรู้อยู่แล้วว่าไม่มี สาขา หลัก อีกต่อไปแล้ว ? ตอนนี้เรียกว่าเป็นกลาง - หลัก . ดังนั้นเราจึงคุ้นเคยกับมัน แม้ว่าพูดตามตรงแล้ว เราสามารถเปลี่ยนชื่อกลับเป็นมาสเตอร์ได้เสมอ เราไปที่Spring Initializrและสร้างเฟรมเวิร์ก SpringBoot สำหรับบอทของเรา "โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 3ในขณะนี้ boot sprint เวอร์ชันที่อายุน้อยที่สุดที่มีให้คือ 2.3.7 มาดูกันดีกว่า ฉันจะอธิบายการตั้งค่าต่อไปนี้แยกกัน:
  • โครงการ: โครงการ Maven - เราได้พูดคุยเรื่อง Maven แล้วที่นี่และที่นี่ ดังนั้นฉันจะอธิบายเพิ่มเติมเฉพาะสิ่งที่ฉันไม่ได้เปิดเผยในบทความก่อนหน้านี้เท่านั้น ถ้ามี “จุดขาว” แบบนี้แน่นอน)
  • ภาษา: Java - ทุกอย่างชัดเจนที่นี่ หากมีความปรารถนาเราสามารถเขียนเรื่องนี้ใหม่ใน Kotlin ได้ ฉันเพิ่งซื้อหนังสือ Kotlin in Action ให้ตัวเอง เราจะเรียนรู้ Kotlin ด้วยกัน))
  • Spring Boot: 2.3.7 - เราใช้เวอร์ชันที่เล็กที่สุดที่นำเสนอเพื่อขจัดปัญหาต่างๆ นี่เป็นการบูตเวอร์ชันที่ทันสมัยโดยสมบูรณ์อยู่แล้ว
ข้อมูลเมตาของโครงการ:
  • กลุ่ม: com.github.javarushcommunity - ที่นี่เราเลือกโดเมนที่โฮสต์กลุ่มพื้นที่เก็บข้อมูลของเรา
  • สิ่งประดิษฐ์: javarush-telegrambot - คำอธิบายสูงสุดของโครงการ
  • ชื่อ: Javarush TelegramBot - เราจะเขียนแบบเต็มที่นี่
  • คำอธิบาย: Telegram bot สำหรับ Javarush จากชุมชนสู่ชุมชน - นี่คือคำอธิบายโดยละเอียดเพิ่มเติมของโครงการ
  • ชื่อแพ็คเกจ: com.github.javarushcommunity.jrtb - ที่นี่คุณสามารถใช้ตัวย่อสำหรับชื่อโปรเจ็กต์ได้แล้ว ตอนนี้โครงการจะเริ่มด้วยแพ็คเกจนี้ ทำไมมากมาย? ดังนั้นเมื่อเราเพิ่มโปรเจ็กต์อื่นให้กับ classpath โปรเจ็กต์เหล่านั้นจะอยู่ในแพ็คเกจที่แตกต่างกัน แต่ละคนมีเอกลักษณ์ของตัวเอง นี่เป็นสิ่งสำคัญในการรักษาหลักการ OOP
  • บรรจุภัณฑ์: Jarเป็นมาตรฐานของเรา)
  • Java: 11 - เราจะนำหน้าไปหนึ่งก้าว ฉันไม่คิดว่าฉันจะใช้นวัตกรรมหลังจาก Java ที่แปด แต่ปล่อยให้มันเป็นไป เขาไม่ขออาหาร)...การตัดสินใจครั้งนี้จะทำให้เรามีไข่อีสเตอร์ตัวเล็ก ๆ ให้เราในอนาคต)
เราจะไม่เพิ่มการพึ่งพาใดๆ ในตอนนี้ เราไม่ต้องการสิ่งนี้สำหรับงานนี้ เมื่อกรอกทั้งหมดนี้แล้วเราได้รับ (นี่คือลิงค์ไปยังโครงการที่สร้างขึ้น): "โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 4เมื่อกรอกแล้วคลิกสร้างและเพิ่มข้อมูลภายในทั้งหมดในไฟล์เก็บถาวรให้กับโครงการของเรา "โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 5เพิ่มไฟล์ในโครงการ ส่งผลให้เรามีใบสมัคร หากต้องการตรวจสอบว่าประกอบแล้วหรือไม่ ให้ไปที่เทอร์มินัลแล้วเขียนว่า: $ mvn clean package"โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 6หากคุณมีแบบเดียวกันจากที่นี่ ทุกอย่างก็โอเค: โปรเจ็กต์ถูกประกอบแล้ว และ jarnik ก็พร้อมแล้วในโฟลเดอร์เป้าหมาย ณ จุดนี้ งานภายในคำอธิบายพร้อมแล้ว มันง่ายใช่มั้ย? ดังนั้นเราจึงมุ่งมั่นและผลักดันสาขาของเรา: "โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 7เราเพิ่มชื่องานของเราไว้ที่จุดเริ่มต้นของคำอธิบายการคอมมิต เพื่อที่ภายหลังจะได้ชัดเจนภายในกรอบงานของงานที่ทำเสร็จแล้ว คลิกCommit and Push ... "โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 8อีกครั้งหนึ่งที่เราตรวจสอบและตรวจสอบว่าเราต้องการพุชอะไรจากที่เก็บข้อมูลในเครื่องไปยังที่เก็บข้อมูลระยะไกล และตรวจสอบให้แน่ใจว่าทุกอย่างเรียบร้อยดีคลิกPush ขั้นตอนต่อไปของเราคืออะไร? ตามกฎทั้งหมด (ซึ่งสามารถอ่านได้ในบทความนี้ในส่วนเกี่ยวกับโฟลว์ GitHub) คุณต้องสร้างคำขอดึงสำหรับสาขาหลักและรอให้คนจากทีมตรวจสอบโค้ด เนื่องจากฉันอยู่คนเดียว ฉันจะสร้างคำขอดึงอย่างเป็นทางการและตรวจทานทุกอย่างอีกครั้ง ฉันไปที่หน้าพื้นที่เก็บข้อมูลและ Github รู้อยู่แล้วว่าเรามีส่วนเพิ่มเติมและข้อเสนอในการสร้างคำขอดึง: "โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 9ไม่มีอุปสรรคสำหรับผู้รักชาติ (c) - เราสร้างมันขึ้นมาตามที่แนะนำ เราตั้งค่าป้ายกำกับเดียวกัน โครงการเดียวกับงานที่เรากำลังทำอยู่ และกรอกคำอธิบาย: คลิก"โครงการ Java จาก A ถึง Z": เรากำลังเขียนโครงการ  เพิ่ม SpringBoot และกำหนดค่ากระบวนการ CI - 10สร้างคำขอดึง

การตั้งค่ากระบวนการ CI

ไปที่คำขอดึงที่สร้างขึ้น: ด้านล่างเราจะเห็นว่าเราไม่มี การกำหนด ค่าการรวมอย่างต่อเนื่อง (ต่อไปนี้ - CI) "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 11มันไม่ได้กำหนดค่าแล้วไงล่ะ? ทำไมเราถึงต้องการ CI เลย? CI คืออะไรกันแน่? นี่คือรายการคำถามโดยประมาณที่เรากังวลในขณะนี้ โดยทั่วไปCIเป็นกระบวนการต่อเนื่องในการรวมโค้ดเข้ากับฐานโค้ดทั่วไปและรันบิลด์ของโปรเจ็กต์ก่อนหน้านั้น สิ่งที่เรียกว่าบิลด์ (จากบิลด์ภาษาอังกฤษ) ทุกครั้งที่เราสร้างโปรเจ็กต์ เราตรวจสอบให้แน่ใจว่าโปรเจ็กต์ได้รับการคอมไพล์แล้ว การทดสอบทั้งหมดผ่านการทดสอบเรียบร้อยแล้ว นอกจากนี้ หลังจากสร้างโปรเจ็กต์แล้ว คุณสามารถเพิ่มการทดสอบอัตโนมัติจากผู้ทดสอบไปยัง CI ที่รันบนบิลด์เฉพาะนี้ได้ ด้วยวิธีนี้ เราจะมั่นใจมากขึ้นว่าการเปลี่ยนแปลงใหม่ทำงานได้ตามที่เราคาดหวัง และไม่ทำให้ฟังก์ชันการทำงานก่อนหน้านี้เสียหาย CI ก็ดีเช่นกันเพราะมันเริ่มต้นโดยอัตโนมัติหลังจากอัปเดตฐานโค้ด นั่นคือเราได้ผลักดันการเปลี่ยนแปลงของเราไปที่สาขาและกระบวนการก็เริ่มต้นขึ้น - การประกอบ การทดสอบ การทดสอบอัตโนมัติ และขั้นตอนอื่นๆ หากขั้นตอนใดๆ เหล่านี้ล้มเหลว ระบบจะถือว่าบิลด์ใช้งานไม่ได้และไม่สามารถรวมเข้ากับสาขาหลักได้ นี่คือสิ่งที่เราจะทำตอนนี้: เราจะเพิ่ม GitHub Actions ซึ่งจะเรียกใช้โค้ดของเราหลังจากการพุช GitHub Actions เข้ากันได้อย่างลงตัวกับ GitHub Flow ของเรา ดังนั้นเราจะใช้มันเพื่อทำให้งานของเราเป็นแบบอัตโนมัติ เครื่องมือนี้ทรงพลังและมีขนาดใหญ่มาก แต่สำหรับตอนนี้เราจะใช้มันเพื่อรันบิลด์และตรวจสอบว่าประกอบแล้วตามความจำเป็นเท่านั้น หากต้องการเปิดใช้งาน ให้ค้นหา ปุ่ม การดำเนินการ บนหน้าพื้นที่เก็บข้อมูล แล้วปฏิบัติตาม: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 12ค้นหาเวิร์กโฟลว์การรวมอย่างต่อเนื่องที่เราต้องการ: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 13คลิกตั้งค่าเวิร์กโฟลว์นี้ ต่อไปเราเสนอให้ใช้เทมเพลต: เราเห็นด้วยอย่างยิ่ง ขอชี้แจงทุกอย่างให้กระจ่างหน่อย:
# This workflow will build a Java project with Maven
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-maven

name: Java CI with Maven

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK 1.8
      uses: actions/setup-java@v1
      with:
        java-version: 1.8
    - name: Build with Maven
      run: mvn -B package --file pom.xml
สิ่งนี้บ่งชี้ว่า GitHub Action ถูกเรียกในสองกรณี:
  1. เมื่อทำการผลักไปยังสาขาหลัก
  2. เมื่อมีการสร้างคำขอดึงในสาขาหลัก
ส่วนงานจะอธิบายขั้นตอนที่จะดำเนินการ เรามีขั้นตอนเดียวเท่านั้น - สร้าง มันแสดง ให้เห็นว่าโครงการของเราจะเปิดตัวใน Ubuntu ด้วยคำสั่งmvn -B package --file pom.xml นี่คือสิ่งที่เราทำในท้องถิ่น หากคุณต้องการเปลี่ยนแปลงบางสิ่งที่นี่โปรด ฉันจะใช้เทมเพลตนี้ก็จะเพียงพอสำหรับฉัน ฉันคลิกStart commitเลือกสร้างสาขาใหม่เพื่อกำหนดค่ากระบวนการ จากนั้นเลือกPropose new file แต่กระบวนการสร้างล้มเหลว... "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 14อย่างที่คุณเห็น ล้มเหลวหลังจากผ่านไป 14 วินาที - สร้าง ดูเหมือนว่ามีบางอย่างเกิดขึ้น: ไปที่การชุมนุมแล้วดูรายละเอียด: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 15มันบอกว่าฉันไม่พบความทรงจำเช่นนั้น ทำไม อ่า ถูกต้องเลย! เพราะเราสร้างการเปลี่ยนแปลงในสาขาหลัก แต่งานของเรายังไม่ถึงจุดนั้น และนั่นคือสาเหตุที่เขาไม่พบหน่วยความจำ... ดังนั้นตอนนี้เราจึงดำเนินการดังต่อไปนี้: เรารวมข้อมูลนี้เข้ากับข้อมูลหลัก จากนั้นเราจะรวมสาขาหลักเข้ากับ JRTB-0 จากนั้นทุกอย่างจะเป็นไปด้วยดี ในคำขอดึงที่มีการเปลี่ยนแปลงการดำเนินการ github ให้คลิกMerge pull request : "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 16และทำซ้ำConfirm Merge ถัดไป Github จะแจ้งให้เราลบสาขาที่เราทำงานอยู่ เราไม่ปฏิเสธและลบ: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 17ต่อไป ฉันไม่พบในคำขอดึงจาก SpringBoot วิธีดึงการเปลี่ยนแปลงจากสาขาหลักจากเว็บไซต์ ดังนั้นเราจะดำเนินการด้วยตนเองผ่าน IDEA

ขั้นตอนที่ 1: อัปเดตสาขาหลักเป็นพื้นที่เก็บข้อมูลในเครื่อง

แนวคิดคือไปที่สาขาหลัก กด ctrl + t และอัปเดตสาขาหลัก:"Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 18

ขั้นตอนที่ 2: รวมการเปลี่ยนแปลงจากสาขาหลักเป็นสาขา JRTB-0

ไปที่ JRTB-0 แล้วรวมอันหลักเข้าด้วยกัน"Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 19

ขั้นตอนที่ 3: ผลักดันการเปลี่ยนแปลง

กด ctrl + shift + k และยืนยันการกด ตอนนี้เรากำลังรอให้ build ผ่าน และมันจะเป็นสีเขียว!)) แต่มันก็เป็นสีแดงอีกครั้ง มันคืออะไร? เราเข้าไปในบันทึกการดำเนินการและพบว่าเราไม่ซิงค์ในเวอร์ชัน Java ใน GitHubActions คือ 8 แต่เราใช้ 11: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 20ขณะนี้มีสองตัวเลือก: แก้ไขการกระทำหรือลดเวอร์ชันลงเหลืออันดับที่แปด สำหรับฉันแล้วตัวเลือกแรกดูเหมือนว่าดีกว่าและถูกต้องมากกว่า เรากำลังทำการเปลี่ยนแปลงในการคอมมิตแยกต่างหาก: เราจะไม่ทำงานกับ Java 8 แต่กับ Java 11 "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 21และหลังจากนั้น ในที่สุด ทุกอย่างก็เรียบร้อยสำหรับเรา และเราก็สามารถตั้งค่ากระบวนการ CI สำหรับโปรเจ็กต์นี้ได้ สิ่งเหล่านี้จำเป็นต้องได้รับการตั้งค่าตั้งแต่เริ่มแรก เพื่อที่คุณจะได้ไม่ต้องกังวลในภายหลัง ตอนนี้คุณจะเห็นได้ว่างานสร้างได้ผ่านไปแล้ว และคุณสามารถรวมเข้าด้วยกันได้โดยไม่ต้องกลัว:"Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 22

การตั้งค่างานกับสาขาในพื้นที่เก็บข้อมูล

คุณยังสามารถกำหนดค่าสิ่งต่าง ๆ ในพื้นที่เก็บข้อมูลเป็นกฎเมื่อทำงานกับสาขาได้ ฉันต้องการสร้างมันเพื่อให้สาขาหลักไม่สามารถพุชได้โดยตรง แต่ทำได้ผ่านคำขอพุลเท่านั้น และฉันต้องการทำให้มันเป็นไปไม่ได้ที่จะรวมคำขอพุลหากบิลด์ล้มเหลว (นั่นคือ ถ้าการดำเนินการ GitHub ล้มเหลวที่ บางขั้นตอน) ในการดำเนินการนี้ ให้ค้นหา ปุ่ม การตั้งค่าและเลือกสาขา : "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 23ในขณะนี้ยังไม่มีกฎสำหรับสาขา ดังนั้นให้เพิ่มใหม่ผ่าน ปุ่ม เพิ่มกฎ : "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 24มีการตั้งค่ามากมายที่นี่ และทุกคนสามารถทำบางสิ่งให้เหมาะกับสาขาของตนได้ ความต้องการ เพื่อให้บิลด์ผ่านได้สำเร็จในคำขอดึงก่อนการรวม ให้เพิ่มช่องทำเครื่องหมายไปที่ Require status checks to pass before merge และเลือกสถานะที่เราต้องการ - บิลด์ ตอนนี้เพียงพอแล้ว: จากนั้นคุณสามารถอัปเดตพวงมาลัยนี้และดูว่าคุณต้องการอะไรอีก คลิกสร้างเพื่อสร้างพวงมาลัยนี้ "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 25ต่อไป ถ้าเราไปที่คำขอดึงของเราอีกครั้ง เราจะเห็นว่าเช็คของเราถูกทำเครื่องหมายว่าจำเป็นแล้ว: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 26มาตรวจสอบหน้าโครงการของเราซึ่งแสดงสถานะงานทั้งหมด: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 27คุณสามารถดูได้ทันทีว่างานใดที่กำลังทำงานอยู่ นอกจากนี้ งานได้เสร็จสิ้นแล้ว และงานอยู่ในสถานะการตรวจสอบโค้ด

ปิด JRTB-0

ตอนนี้เราได้เตรียมคำขอดึงและสร้าง CI สำหรับมันแล้ว เราจำเป็นต้องดำเนินการขั้นตอนสุดท้ายให้เสร็จสิ้น: ปิดงาน ย้ายไปยังสถานะที่ถูกต้อง ดูการเปลี่ยนแปลงในโครงการของเราบนกระดาน คำขอดึงของเราพร้อมที่จะรวมเข้ากับต้นแบบแล้ว ในคำขอดึงข้อมูล ให้คลิก ปุ่ม ผสานคำขอดึงข้อมูล : "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 28หลังจากผสานสำเร็จแล้ว คุณสามารถลบออกได้ และโดยปกติแล้วจะทำเช่นนั้น ฉันจะไม่ทำเช่นนี้เพื่อให้คุณเห็นการเปลี่ยนแปลงระหว่างสาขา/คอมมิตได้ง่ายขึ้น ทันทีที่มีการรวมคำขอดึงเข้าด้วยกัน มันจะไปที่บอร์ดโครงการของเราโดยอัตโนมัติ: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 29ขั้นตอนสุดท้ายคือการปิดปัญหา (ปัญหา) พร้อมลิงก์ไปยังคำขอดึงที่อยู่เดิม: "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 30ปัญหานี้จะดำเนินการให้เสร็จสิ้นโดยอัตโนมัติใน กระดาน. "Java-проект от А до Я": Пишем проект. Добавляем SpringBoot и настраиваем CI процесс - 31จุดเริ่มต้นได้ถูกสร้างขึ้น ภารกิจแรกเสร็จสิ้น!

ข้อสรุป

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

รายการเนื้อหาทั้งหมดในซีรีส์นี้อยู่ที่ตอนต้นของบทความนี้

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION