دليل كامل لتشغيل Sonarqube مع أي ديسيبل في Docker .
يبدو أن تنسيق Docker مع Compose سهل ، ولكن هناك بعض المزالق في الممارسة العملية. تابع القراءة لمعرفة القصة بأكملها ، أو إذا كنت تريد فقط تشغيلها ، فانتقل مباشرة إلى البدء .
عند تشغيل Sonarqube وحاويات قاعدة البيانات معًا عن طريق التأليف لأول مرة ، قد تواجه أخطاء مثل هذه:
Can not connect to database. Please check connectivity and settings (see the properties prefixed by 'sonar.jdbc.').ذلك لأن عملية تهيئة قاعدة البيانات تستغرق وقتًا أطول قليلاً من وقت التمهيد لـ Sonarqube ، خاصةً عندما لا توجد قاعدة بيانات ثابتة.
لذلك ، كيف تكتشف حالة الاستعداد لاتصال قاعدة البيانات؟
ما فشل :
depends_on خيار _on: يمكنك تحديد هذا الخيار في ملف docker-corm.yml لبدء الخدمات في ترتيب التبعية ، ولكن لن ينتظر أن تكون الخدمة التابعة جاهزة.
برنامج انتظار البرنامج النصي : يمكن استخدام برنامج Wait-for-IT الموصى به في أمر بدء التشغيل الخاص بـ Docker في مقالة Compose للتحقق من توفر منفذ قاعدة البيانات والانتظار. لسوء الحظ ، هذا لا يساعد أيضًا. والسبب هو أن المنفذ سيكون متاحًا مباشرة بعد بدء حاوية قاعدة البيانات ، لكن هذا لا يعني أن اتصال قاعدة البيانات جاهز. فقط ننسى nc -v -n -z -w1 $HOST $PORT .
تعليمات HEALTHCHECK : تتوفر هذه الميزة الجديدة لـ DockerFiles منذ الإصدار 1.12 ، ولكن ليس بعد لمفكّن Docker (الآن هناك). الاستخدام: HEALTHCHECK [OPTIONS] CMD command . هذا يبدو واعداً ، لكن لا يزال يتعين عليك كتابة الأمر بنفسك ، لإخبار Docker بما يجب التحقق منه.
أمر قاعدة البيانات : ماذا عن تشغيل mysql -e "select 1" للتحقق من توفر قاعدة البيانات؟ نعم - ولكن انتظر ثانية - لا تحتوي حاوية Sonarqube على عميل MySQL مثبتًا ، وليس لدينا أي سيطرة على صورة Sonarqube الرسمية.
خادم الويب : بعد اختراق آخر - ماذا لو قمنا بإعداد خادم ويب (خط واحد) في حاوية MySQL التي تستجيب مع حالة قاعدة البيانات؟ شيء مثل while true; do echo -e "HTTP/1.1 200 OKrnrn$(db_status)" | nc -l -q 0 -p 9999; done . لسوء الحظ مرة أخرى ، عادة ما تكون Netcat جزءًا من صورة قاعدة البيانات.
سجلات قاعدة البيانات : تكتب MySQL حالة الاستعداد إلى السجلات ، لذلك ربما يمكننا محاولة البحث هناك باستخدام grep 'ready for connections' . عادة ، لا يمكن الوصول إلى السجلات إلا داخل حاوية MySQL ، أو من جهاز المضيف ، ولكن ليس من حاوية Sonarqube. ربما يمكننا محاولة الاستمرار في سجلات MySQL إلى دليل المضيف عن طريق إضافة command: bash -c "mkdir -p /var/log/mysql && mysqld 2>&1 | tee /var/log/mysql/mysql.log" و volumes: ./data/mysql:/var/log/mysql : بعد ذلك ، يمكننا تركيب مستوى الصوت لمشاركته مع حاوية Sonarqube ، بحيث يكون متاحًا هناك. ولكن هل نريد حقًا العبث بإضافة تكوينات command volumes على جانبي الخدمتين؟
يجب أن تكون هناك طريقة أفضل ...
ما نجح :
بدءًا من Sonarqube v7.9 ، لن يدعم MySQL. لمزيد من المعلومات ، يرجى زيارة End of Life of MySQL Support. نتيجة لذلك ، لأي فقرة أدناه ذكر MySQL ، يرجى التجاهل. ما لم تكن تريد استخدام MySQL مع Sonarqube v7.7 (أو إصدار سابق).
تأكد من استنساخ المشروع بأكمله ، وخاصة Detector.java - للتحقق من استعداد قاعدة البيانات.
اسحب الإصدار المطلوب من صور Docker لـ Sonarqube و Database (على سبيل المثال MySQL أو Postgresql ):
# pull SonarQube image
docker pull sonarqube[:TAG]
# pull database image
docker pull mysql[:TAG]
# or
docker pull postgres[:TAG]Heads : ليس من الجيد استخدام أحدث إصدار من قاعدة البيانات دون التحقق من متطلبات Sonarqube (المتطلب السابق لأحدث إصدار Sonarqube ، أو مستندات للإصدارات السابقة). على سبيل المثال ، يدعم Sonarqube 6.3 فقط MySQL 5.6 و 5.7. وإذا قمت بتدوير Sonarqube 6.3 مع MySQL 8.0 ، فسيتم طرح استثناء:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. (اختياري - MySQL & MacOS فقط) هناك مشكلة في الإذن عندما يقوم بتثبيت دليل مضيف في حاوية MySQL باستخدام boot2docker .
[ERROR] InnoDB: Operating system error number 13 in a file operation.
[ERROR] InnoDB: The error means mysqld does not have the access rights to the directory.حل :
قم بإنشاء صورة MySQL مخصصة لـ MacOS (لا تنس تغيير latest علامة في mysql_mac/Dockerfile ):
docker build -t mysql_mac[:TAG] [PATH_OF_THIS_REPO_ON_YOUR_DISK]/mysql_mac/ تحرير Docker-corm-mysql.yml ، استبدل image: mysql بواسطة image: mysql_mac .
من أجل استمرار البيانات ، تحتاج إلى إعداد أحجام بيانات تصاعد: استبدال نقطتين للتصاعد تحت وحدات التخزين في ملف Docker-Corm- <DB> .IML .
- [PATH_TO_PERSIST_SONAR_DATA_ON_HOST]:/opt/sonarqube/extensions
- [PATH_TO_PERSIST_DATABASE_DATA_ON_HOST]:[DATABASE_VOLUMES]
ملاحظة: يمكن أن يكون المسار إلى استمرار بيانات المضيف مسارًا نسبيًا ، على سبيل المثال: ./data/xyz
بدلاً من استخدام العلامة الفارغة الافتراضية أو latest علامة ديناميكية ، يرجى تغييرها في ملف Dockerfile أو docker-compose مع علامات أكثر تحديدًا. لأن latest يمكن أن يؤدي إلى بناء صورة لا يمكن التنبؤ بها ولا يمكن التفكير فيها.
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up الإضافات Sonarqube.
/opt/sonarqube/extensionsجميع بيانات التحليل التاريخي ، والقواعد المستوردة ، يتم حفظ الإعدادات التي تم تغييرها في قاعدة البيانات.
/var/lib/mysql
# or
/var/lib/postgresql لا تستمر مؤشرات Elasticsearch (التي تقع على /opt/sonarqube/data/es ) ، دعها تعيد بناءها بنفسها ، وإلا فإنها قد تسبب مشكلة أثناء الترقية. وأي إغلاق غير مفيد (مثل تحطم) من Sonarqube يمكن أن يؤدي إلى مؤشرات خارج المزامنة.
احتفظ دائمًا بقاعدة بيانات احتياطية في حالة فشل الترقية وتراجع الحاجة.
قم بإجراء نسخة احتياطية منطقية على الإصدار القديم من MySQL
mysqldump -u sonar -p --opt sonar > [PATH_TO_MYSQL_BACKUP]/sonar.sqlابدأ حاوية MySQL Docker (إصدار جديد من MySQL)
docker run -i -t -v [PATH_TO_MYSQL_BACKUP]:/tmp -v [PATH_TO_PERSIST_DB]:/var/lib/mysql mysql /bin/bashابدأ خادم MySQL
/etc/init.d/mysql startابدأ عميل MySQL
mysqlإنشاء قاعدة البيانات واستخدامها
create database sonar ;
use sonar;منح امتيازات للمستخدم
grant all on sonar. * to ' sonar ' @ ' % ' identified by ' sonar ' ;
grant all on sonar. * to ' sonar ' @ ' localhost ' identified by ' sonar ' ;
grant usage on * . * to sonar@localhost identified by ' sonar ' ;
grant all privileges on sonar. * to sonar@localhost;استعادة ملف النسخ الاحتياطي (عن طريق تنفيذ البرنامج النصي SQL)
source / tmp / sonar . sqlترك عميل MySQL
exitأوقف خادم MySQL
/etc/init.d/mysql stopالآن قمت بنجاح استعادة قاعدة البيانات على الإصدار الجديد من MySQL. يتم تخزين بيانات قاعدة البيانات في path_to_persist_db من مضيفك.
عملية ترقية Sonarqube Server مؤتمتة ، ليس لديك أي شيء لتغييره يدويًا في قاعدة بيانات Sonarqube.
مسار الترحيل : [YOUR_VERSION] -> LTS (if exists) -> [EXPECTED_VERSION]
دليل الترقية بواسطة Sonarqube (فقط للرجوع إليه ، يرجى اتباع الخطوات أدناه.)
لا تحاول إيقاف خادم Sonarqube ، إذا قتلت العملية ، فإن حاوية Sonarqube تخرج على الفور. لذلك لا يمكنك حقًا ترقية Sonarqube باليد داخل الحاوية. لا تقلق ، فقط جرب الخطوات أدناه.
خطوات:
docker-compose -f [PATH_OF_THIS_REPO_ON_YOUR_DISK]/docker-compose-<db>.yml up ؛من أجل ترقية Big Sonarqube ، يتطلب أيضًا ترقية قاعدة البيانات ، ولكن هذا يحدث تلقائيًا.
بعد انتهاء حاوية Sonarqube الجديدة ، افتح صفحة الويب الخاصة بها ، سيتم إعادة توجيهك إلى صفحة صيانة ؛
sonarqube_1 | 2099.12.31 12:00:00 WARN web[o.s.s.p.DatabaseServerCompatibility] Database must be upgraded. Please backup database and browse /setup
sonarqube_1 | 2099.12.31 12:00:00 INFO web[o.s.s.p.Platform] DB needs migration, entering safe modeافتح http: // [your_sonarqube_url]: 9000/setup ؛
انقر فوق زر الترقية .
يمكن أن تستغرق ترقية قاعدة البيانات عدة دقائق. عندما تنتهي ترحيل DB بنجاح ، ستعرض الصفحة "قاعدة البيانات محدثة" ، ثم تعيد توجيهك إلى الصفحة الرئيسية.
حقوق الطبع والنشر (C) 2016-2019 Jing Li. يتم إصدار Sonarondocker تحت رخصة GNU Lesser العامة العامة ، الإصدار 3.0. انظر ملف الترخيص للحصول على التفاصيل.