วิธีการลบโมดูลในสภาพแวดล้อมแบบฉากอย่างถูกต้อง


17

บางโมดูลมีการยกเลิกการติดตั้ง ซึ่งโดยทั่วไปแล้วจะลบฐานข้อมูลสำหรับโมดูลนั้นตัวแปรจากตารางตัวแปรและตำแหน่งที่แนะนำโดยโมดูลนั้น รูทีนเหล่านี้อาศัยอยู่ใน.installโมดูลนั้น

ดังนั้นจึงไม่สามารถรันได้หากไม่มีโมดูลนั้นอยู่ ดังนั้นนี่คือขั้นตอนปัจจุบันของเรา คำถามของฉันคือ: สิ่งนี้สามารถทำได้ง่ายขึ้นและมีประสิทธิภาพมากขึ้น? บอกว่าฉันลบโมดูล foo_bar

  1. ใน RCS ให้เตรียมรีลีสใหม่โดยที่:
    • css และการแทนที่ธีมทั้งหมดที่ใช้หรือสร้างที่ด้านบนของ foo_bar จะถูกลบออก
    • css และ theme-overrides สำหรับโมดูลขึ้นอยู่กับ foo_bar จะถูกลบออก
  2. ผลักดันการเปิดตัวที่จะยอมรับ ทดสอบการยกเลิกการติดตั้ง (จากผู้ดูแลระบบ / โมดูล) ด้วยสำเนาล่าสุดของฐานข้อมูลการผลิต
  3. หากทุกอย่างไปได้ด้วยดีให้ปรับใช้ codebase ใหม่เพื่อการผลิตและยกเลิกการติดตั้ง foo_bar และการพึ่งพาที่นั่น สิ่งนี้จะเรียกใช้การถอนการติดตั้งในโมดูลต่าง ๆ ทำความสะอาดฐานข้อมูล
  4. ใน RCS (git) ให้เตรียมรีลีสใหม่ที่มีการลบรหัสจริง
  5. ปรับใช้เพื่อยอมรับว่าเราทดสอบว่าไม่มีสิ่งใดขึ้นอยู่กับสิ่งนี้โดยบังเอิญ (โมดูลที่น่าเกลียดหรือฟังก์ชั่นชุดรูปแบบรวมถึงไฟล์โดยตรงจากโมดูลอื่น ๆ CSS, JS หรือไฟล์ภาพที่สะดุดตาที่สุด)
  6. หากยอมรับให้ปรับใช้รีลีสใหม่กับการผลิต การผลิตในขณะนี้มีฐานข้อมูลที่สะอาดและ codebase

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

หากเราลบโมดูลออกจาก codebase ในการวนซ้ำครั้งแรกเราจะไม่สามารถเรียกใช้ hooks การถอนการติดตั้งโดยเก็บขุยไว้ในฐานข้อมูลจำนวนมาก ไม่ใช่แค่เพียงไม่กี่ตาราง แต่ส่วนใหญ่เป็นตัวแปรและตำแหน่งที่ตั้ง หากเราไม่ลบโมดูลออกจาก codebase นั่นหมายความว่า codebase จะเติบโตไปพร้อมกับโค้ดเก่าที่ไม่ได้ใช้ สิ่งนี้ไม่มีค่าใช้จ่ายประสิทธิภาพ แต่ทำให้การบำรุงรักษารหัสยากขึ้นและหนักขึ้น

คุณจัดการกับสิ่งนี้ได้อย่างไร

[แก้ไข: เพิ่มหมายเหตุเกี่ยวกับการปรับใช้เป็นขั้นตอนที่ยากลำบาก]


2
หากคุณทำขั้นตอนที่ 1 - 6 บนเซิร์ฟเวอร์ staging ก่อนคุณไม่สามารถอัปเดตไซต์สดเป็น HEAD ^ แล้วทำการถอนการติดตั้งจากนั้นอัปเดตเป็น HEAD (ทั้งหมดในที่เดียว)
Andy

หากโครงการทั้งหมดของฉันถูกใช้งานคอมไพล์แล้วใช่ แต่บางคนต้องการ tarballs ที่จะส่งทางไปรษณีย์ในขณะที่คนอื่นใช้ (เท่านั้น!) ftp และอื่น ๆ แต่การมองหาคอมไพล์และสคริปต์คอมไพล์บางอันนั้นเป็นความคิดที่น่าสนใจอย่างแน่นอน
berkes

ทำไมมันจำเป็นต้องมีการลงเว็บไซต์?
Letharion

@Letharion: 1) การนำไซต์ลงไปห้ามมิให้มีการเขียนที่ไม่ต้องการไปยังฐานข้อมูลของคุณในระหว่างขั้นตอนการแก้ไขฐานข้อมูลนั้น Drupal ไม่ใช้ธุรกรรม 2) การปรับใช้โค้ดใหม่ที่ขึ้นอยู่กับสถานะฐานข้อมูลบางอย่าง (ธีมที่ต้องใช้ cck-field ที่แน่นอนเช่น) จะทำให้ไซต์ของคุณพังในช่วงเวลาระหว่างการเปิดใช้งานโค้ดและอัปเดตฐานข้อมูล
berkes

คำตอบ:


7

ใช้ความระมัดระวังเกี่ยวกับการทำให้ฐานข้อมูลและรหัสของคุณตรงกันอยู่เสมอ ในขณะที่คุณพูดถึงคำถามของคุณโมดูลที่จะถอนการติดตั้งจะต้องอยู่ในฐานรหัสจนกว่าจะมีการถอนการติดตั้ง hooks บนฐานข้อมูลสด นี่เป็นข้อ จำกัด ของ Drupal ที่กระบวนการดึง git เพียงอย่างเดียวไม่สามารถแก้ไขได้

ฉันอยากจะแนะนำว่าแทนที่จะพยายามปรับกระบวนการของคุณคุณแทนที่จะมองหาวิธีที่จะลดเวลาหยุดทำงานที่จำเป็นในการประมวลผลการอัปเดตของคุณ ฉันอยากจะแนะนำให้ตั้งค่าสภาพแวดล้อมการจัดเตรียมแบบหลายขั้นตอน / yang สำหรับการแก้ปัญหานี้ nb ฉันไม่ได้ใช้สคริปต์ที่มีอยู่ในลิงค์ก่อนหน้า; คุณอาจต้องการตั้งค่าสิ่งต่าง ๆ โดยทำตามแนวคิดเดียวกันกับที่คุณสามารถสลับไซต์สดและเวทีระหว่างการปรับใช้

ทำตามขั้นตอนเดียวกันกับที่คุณระบุไว้ในคำถามของคุณโดยทำการปรับเปลี่ยนต่อไปนี้:

ซิงค์จาก dev ไปยังเวที (หยาง) ตามปกติ ทดสอบโดยทำการถอนการติดตั้งโมดูลที่จะลบตามด้วยการลบโค้ด ฯลฯ บันทึกเวิร์กโฟลว์ Git: สร้างแท็กหรือบันทึก hashid ของสถานะต่างๆของรหัสของคุณ: โมดูลทั้งหมดในสถานที่ก่อนที่จะถอนการติดตั้งโมดูลรหัสที่ถูกลบ แทนที่ & c. ลบออก ฯลฯ ตามต้องการ อาจต้องการเพียงสองการอ้างอิง

ข เมื่อการทดสอบเสร็จสมบูรณ์และได้รับการยอมรับให้เรียกคืนรหัสบนเวที (หยาง) เป็นสถานะสด (ying)

ค. เตรียมไซต์ live (ying) สำหรับการอัปเดตโดยปิดการใช้งานความสามารถของผู้ใช้ในการเปลี่ยนแปลงเนื้อหาในระบบ การอัปเดต sql ของตารางสิทธิ์มักจะทำที่นี่ ณ จุดนี้ผู้ใช้จะยังสามารถอ่านเนื้อหาบนไซต์สดได้ แต่จะได้รับข้อผิดพลาดถูกปฏิเสธสิทธิ์หากพวกเขาพยายามอัปเดตเนื้อหา (หากคุณเจ๋งคุณอาจเปลี่ยนตัวจัดการปฏิเสธการอนุญาตเพื่อพิมพ์คำเตือนที่เหมาะสมว่าฟังก์ชั่นใช้งานไม่ได้ชั่วคราว)

d ตอนนี้ดันฐานข้อมูล live (ying) กลับไปยังฐานข้อมูล stage (yang) ไม่รวมตารางสิทธิ์จากการอัพเดต

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

ฉ ตอนนี้คุณพร้อมที่จะแลกเปลี่ยนหยิงและหยาง ทำสิ่งนี้โดยปรับการกำหนดค่า Apache ของคุณ โปรดทราบว่าถ้าคุณทำเช่นนั้นการ/etc/init.d/apache restartเชื่อมต่อบางอย่างอาจจะลดลง แต่/etc/init.d/apache reloadจะช่วยให้การแลกเปลี่ยนที่สะอาด

ก. สดตอนนี้ 'หยาง'; ตารางสิทธิ์ไม่ได้แก้ไขที่นี่เพื่อให้ผู้ใช้สามารถสร้างเนื้อหา หากคุณทำตามขั้นตอนอัตโนมัติ และ f. เวลาที่ใช้งานไม่ได้ควรต่ำมาก

ชั่วโมง พุชสด (หยาง) กลับสู่สเตจ (ยิ่ง) ทั้งรหัสและฐานข้อมูล - หรือดันจาก dev ตามต้องการ ตอนนี้คุณมีสภาพแวดล้อมที่สะอาดพร้อมสำหรับการทำซ้ำครั้งต่อไป


Ying yang ล้มเหลวอย่างน่ากลัวในขั้นตอน c เฉพาะไซต์ที่เฉพาะเจาะจงมาก ๆ เท่านั้นเช่นการแก้ไขโดยใช้การแก้ไขแบบอานนท์เข้าถึงเท่านั้นจะใช้งานได้ นั่นเป็นเพราะส่วนใหญ่ไม่เพียง แต่ความคิดเห็นโหนดและสิ่งนั้นจะต้องถูกปิดใช้งาน แต่ตารางเซสชั่น, สุนัขเฝ้าบ้าน, เคาน์เตอร์ ฯลฯ จะได้รับการปรับปรุงและเขียน การหยุดทำงานดูเหมือนว่าจะเป็นผลข้างเคียงที่โชคร้าย แต่หลีกเลี่ยงไม่ได้ แม้ว่าในบางเว็บไซต์หยิงหยางนั้นเป็นแนวคิดที่น่าสนใจมากเมื่อใช้งาน
berkes

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

คุณอาจพิจารณาติดตามธุรกรรมบนไซต์การเปลี่ยนแปลงโดยใช้บันทึกไบนารีของ mysql ดูdev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.html ฉันจะลังเลที่จะรวมสิ่งต่าง ๆ เข้าด้วยกัน แต่คุณสามารถติดตามข้อความเคาน์เตอร์ / สุนัขเฝ้าบ้านนอกวงพิเศษได้ วิธีที่ง่ายที่สุดในการจัดการกับตารางเซสชั่นก็คือการปิดการใช้งานการเข้าสู่ระบบในระหว่างการเปลี่ยนแปลง
greg_1_anderson

ความคิดเห็นของคุณนำฉันไปสู่วิธีแก้ไขปัญหาอื่น ๆ ที่เป็นไปได้: รวม hook_uninstall ทั้งหมดของโมดูลเป็น hook_update_n () s ของโมดูลที่มีวัตถุประสงค์พิเศษ: uninstall.module ด้วยวิธีนี้ฉันสามารถลบ codebase ในการวนซ้ำครั้งแรก / และ / รับการยกเลิกการติดตั้งได้เร็วขึ้นมากในรีลีสจริง อาจเป็นสคริปต์ที่ใช้ดักคอข้อมูลนี้
berkes

1
อีกสิ่งหนึ่งที่จะช่วยได้เล็กน้อย เปลี่ยนทั้งหมดของรหัส PHP ของคุณเองเช่นที่อ้างอิงใด ๆ if (module_exists('removeme')) { ... }ไปยังโมดูลเพื่อจะเอาออกเป็นห่อ ปรับใช้รหัสนั้น หากคุณทดสอบและยืนยันว่าการลบโมดูลไม่ทำให้รหัสที่กำหนดเองของคุณนั้นพังนั้นจะทำให้การปรับใช้ของคุณง่ายขึ้น ขอแนะนำให้ทำตามขั้นตอนการปิดการใช้งานในเว็บไซต์ที่ไม่ได้เผยแพร่ แต่อาจทำให้หน้าต่างของคุณแคบลงเล็กน้อย ฉันไม่คิดว่า hook การอัปเดตที่กำหนดเองของคุณจะทำให้การปิดการใช้งานโมดูลแบบสดปลอดภัยกว่า
greg_1_anderson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.