java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

ဤဆေá€Ŧငá€ēးပá€Ģးသညá€ē GitLab ကို á€Ąá€žá€¯á€ļးပá€ŧု၍ sonatype နှင့á€ē/á€žá€­á€¯á€ˇá€™á€Ÿá€¯á€á€ē maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēခနá€ēးမá€ģá€Ŧးတá€Ŋငá€ē ၎ငá€ēá€¸á€á€­á€¯á€ˇá ထုတá€ēကုနá€ēမá€ģá€Ŧးကို လá€ģငá€ēမá€ŧနá€ēစá€Ŋá€Ŧ ထုတá€ēá€á€ąá€œá€­á€¯á€žá€Šá€ˇá€ē java developer မá€ģá€Ŧးအတá€Ŋကá€ē ရညá€ēရá€Ŋယá€ēပá€Ģသညá€ē။ ဤဆေá€Ŧငá€ēးပá€Ģးတá€Ŋငá€ē ဤပá€ŧá€ŋနá€Ŧကိုဖá€ŧေရှငá€ēးရနá€ē gitlab-runner၊ gitlab-ci နှင့á€ē maven-plugin ကိုတညá€ēဆေá€Ŧကá€ēခá€ŧငá€ēးအကá€ŧေá€Ŧငá€ēးပá€ŧေá€Ŧပá€Ģမညá€ē။

á€œá€­á€¯á€Ąá€•á€ēခá€ģကá€ēမá€ģá€Ŧး

  • mvn နှင့á€ē GPG သေá€Ŧ့မá€ģá€Ŧးကို လုá€ļခá€ŧုá€ļစá€Ŋá€Ŧသိမá€ēးဆညá€ēးပá€Ģ။
  • အမá€ģá€Ŧးသူငှá€Ŧ CI လုပá€ēငနá€ēးမá€ģá€Ŧးကို လုá€ļခá€ŧုá€ļစá€Ŋá€Ŧ အကေá€Ŧငá€ēအထညá€ēဖေá€Ŧá€ēခá€ŧငá€ēး။
  • ရှေးဟေá€Ŧငá€ēးပစ္စညá€ēးမá€ģá€Ŧး (ထုတá€ēလá€Ŋှတá€ēခá€ŧငá€ēး/လá€ģှပá€ēတစá€ēပá€ŧကá€ē) ကို အမá€ģá€Ŧးသူငှá€Ŧ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရá€Ŧမá€ģá€Ŧá€¸á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēခá€ŧငá€ēး။
  • maven Central တá€Ŋငá€ē ထုတá€ēဝေရနá€ēအတá€Ŋကá€ē ထá€Ŋကá€ēရှိသေá€Ŧဗá€Ŧးရှငá€ēးမá€ģá€Ŧးကို á€Ąá€œá€­á€¯á€Ąá€œá€ģေá€Ŧကá€ēစစá€ēဆေးခá€ŧငá€ēး။
  • ပရေá€Ŧဂá€ģကá€ēမá€ģá€Ŧးစá€Ŋá€Ŧအတá€Ŋကá€ē ရှေးဟေá€Ŧငá€ēးပစ္စညá€ēးမá€ģá€Ŧးကို á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရုá€ļá€žá€­á€¯á€ˇ အပá€ēလုဒá€ēတငá€ēခá€ŧငá€ēးအတá€Ŋကá€ē á€šá€ąá€˜á€¯á€šá€ģဖá€ŧေရှငá€ēးခá€ģကá€ē။
  • ရိုးရသငá€ēá€¸á€™á€žá€¯á€”á€žá€„á€ˇá€ē á€Ąá€žá€¯á€ļးပá€ŧုရလá€Ŋယá€ēကူခá€ŧငá€ēး။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧ

á€šá€ąá€˜á€¯á€šá€ģသတငá€ēးအခá€ģကá€ēအလကá€ē

  • Sonatype OSS Repository Hosting Service မှတစá€ēဆင့á€ē Maven Central တá€Ŋငá€ē ရှေးဟေá€Ŧငá€ēးပစ္စညá€ēးမá€ģá€Ŧး ဖá€ŧန့á€ēခá€ģိသည့á€ē ယန္တရá€Ŧး၏ အသေးစိတá€ēဖေá€Ŧá€ēပá€ŧခá€ģကá€ēကို တá€Ŋငá€ē ဖေá€Ŧá€ēပá€ŧထá€Ŧးပá€ŧီးဖá€ŧစá€ēသညá€ē။ ဤဆေá€Ŧငá€ēပá€Ģး á€Ąá€žá€¯á€ļးပá€ŧုသူကို Googolplexá€‘á€­á€¯á€ˇá€€á€ŧေá€Ŧင့á€ē ကá€ģá€Ŋနá€ēုပá€ēသညá€ē ဤဆေá€Ŧငá€ēးပá€Ģးကို မှနá€ēကနá€ēသေá€Ŧနေရá€Ŧမá€ģá€Ŧးတá€Ŋငá€ē ကိုးကá€Ŧးပá€Ģမညá€ē။
  • ကá€ŧိုတငá€ēစá€Ŧရငá€ēးပေးသá€Ŋငá€ēးပá€Ģ။ Sonatype JIRA á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရုá€ļကိုဖá€Ŋင့á€ēရနá€ē လကá€ēမှတá€ēတစá€ēစေá€Ŧငá€ēကိုဖá€Ŋင့á€ēပá€Ģ (အသေးစိတá€ēအခá€ģကá€ēအလကá€ēမá€ģá€Ŧးအတá€Ŋကá€ē á€Ąá€•á€­á€¯á€„á€ēးကို ဖတá€ēရသုပá€Ģ။ Sonatype JIRA တá€Ŋငá€ē လကá€ēမှတá€ēတစá€ēခု ဖနá€ēတီးပá€Ģ။) repository ကိုဖá€Ŋင့á€ēပá€ŧီးနေá€Ŧကá€ē၊ JIRA မှ လေá€Ŧ့ဂá€ēအငá€ē/စကá€Ŧးဝှကá€ēအတá€Ŋဲ (á€šá€á€¯á€”á€ąá€Ŧကá€ēပိုငá€ēးတá€Ŋငá€ē Sonatype အကေá€Ŧင့á€ēအဖá€ŧစá€ēရညá€ēညá€Ŋှနá€ēးသညá€ē) ကို Sonatype nexus á€žá€­á€¯á€ˇ ရှေးဟေá€Ŧငá€ēးပစ္စညá€ēးမá€ģá€Ŧး အပá€ēလုဒá€ēလုပá€ēရနá€ēအတá€Ŋကá€ē á€Ąá€žá€¯á€ļးပá€ŧုပá€Ģမညá€ē။
  • á€‘á€­á€¯á€ˇá€”á€ąá€Ŧကá€ē၊ GPG သေá€Ŧá€ˇá€‘á€¯á€á€ēပေးခá€ŧငá€ēးလုပá€ēငနá€ēးစဉá€ēကို အလá€Ŋနá€ēခá€ŧေá€Ŧကá€ēသá€Ŋေ့စá€Ŋá€Ŧဖေá€Ŧá€ēပá€ŧသညá€ē။ အသေးစိတá€ēအခá€ģကá€ēအလကá€ēမá€ģá€Ŧးအတá€Ŋကá€ē ကဏယဍကို ကá€ŧည့á€ēပá€Ģ။ ရှေးဟေá€Ŧငá€ēးပစ္စညá€ēးမá€ģá€Ŧးကို လကá€ēမှတá€ēထိုးရနá€ē GnuPG ကို ပá€ŧငá€ēဆငá€ēသတá€ēမှတá€ēခá€ŧငá€ēး။
  • သငá€ēá€Ąá€žá€¯á€ļးပá€ŧá€¯á€”á€ąá€á€šá€ēဆိုရငá€ē Linux GPG key (gnupg/gnupg2) ထုတá€ēလုပá€ēá€–á€­á€¯á€ˇá€Ąá€á€Ŋကá€ē console ကို install လုပá€ēရပá€Ģမယá€ē။ RNG-tools မá€ģá€Ŧး entropy ကိုထုတá€ēလုပá€ēရနá€ē။ မဟုတá€ēပá€Ģက သေá€Ŧ့မá€ģိုးဆကá€ēသညá€ē အလá€Ŋနá€ēအခá€ģိနá€ēယူရပေမညá€ē။
  • á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēခá€ŧငá€ēးဝနá€ēဆေá€Ŧငá€ēမသုမá€ģá€Ŧး အမá€ģá€Ŧးသူငှá€Ŧ GPG သေá€Ŧ့မá€ģá€Ŧး

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

GitLab တá€Ŋငá€ē ဖá€ŧန့á€ēကá€ģကá€ē ပရေá€Ŧဂá€ģကá€ēတစá€ēခု တညá€ēဆေá€Ŧကá€ēခá€ŧငá€ēး။

  • ပထမá€Ļးစá€Ŋá€Ŧ၊ သငá€ēသညá€ē ရှေးဟေá€Ŧငá€ēးပစ္စညá€ēးမá€ģá€Ŧးကို á€Ąá€žá€¯á€ļးခá€ģရနá€ēအတá€Ŋကá€ē ပိုကá€ēလိုငá€ēးကို သိမá€ēးဆညá€ēးမည့á€ē ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို ဖနá€ēတီးပá€ŧီး ပá€ŧငá€ēဆငá€ēသတá€ēမှတá€ēရနá€ē á€œá€­á€¯á€Ąá€•á€ēသညá€ē။ ကá€ģá€Ŋနá€ēုပá€ē၏ ပရေá€Ŧဂá€ģကá€ēကို ရိုးရိုးရသငá€ēးရှငá€ēးနှင့á€ē ရသုပá€ēထá€Ŋေးစá€Ŋá€Ŧ အမညá€ēပေးခဲ့ပá€Ģသညá€ē။ ကá€ģယá€ēပá€ŧန့á€ē
  • repository ကိုဖနá€ēတီးပá€ŧီးနေá€Ŧကá€ē၊ repository ကိုပá€ŧေá€Ŧငá€ēးလဲရနá€ēဝငá€ēရေá€Ŧကá€ēခá€Ŋင့á€ēကိုသငá€ēကန့á€ēသတá€ēရနá€ēá€œá€­á€¯á€Ąá€•á€ēသညá€ē။
    ပရေá€Ŧဂá€ģကá€ē -> ဆကá€ēတငá€ēမá€ģá€Ŧး -> á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရေး -> အကá€Ŧအကá€Ŋယá€ēဌá€Ŧနခá€Ŋဲမá€ģá€Ŧá€¸á€žá€­á€¯á€ˇ သá€Ŋá€Ŧးပá€Ģ။ ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá€žá€Šá€ē စညá€ēးမá€ģဉá€ēးမá€ģá€Ŧးအá€Ŧးလုá€ļးကို ဖá€ģကá€ēပá€ŧီး စညá€ēးကမá€ēးခá€ģကá€ēတစá€ēခုတညá€ēးကို Wildcard * ဖá€ŧင့á€ē ထိနá€ēးညှိပေးသည့á€ē အခနá€ēးကဏ္ဍဖá€ŧင့á€ē á€Ąá€žá€¯á€ļးပá€ŧုသူမá€ģá€Ŧးအတá€Ŋကá€ēသá€Ŧ တá€Ŋနá€ēးအá€Ŧးပေးပá€ŧီး ပေá€Ģငá€ēးစညá€ēးပိုငá€ēခá€Ŋင့á€ēရှိသညá€ē။ ဤစညá€ēးမá€ģဉá€ēးသညá€ē ဤပရေá€Ŧဂá€ģကá€ēနှစá€ēခုလုá€ļးနှင့á€ē ဤပရေá€Ŧဂá€ģကá€ēပိုငá€ēဆိုငá€ēသည့á€ēအဖá€Ŋဲ့၏ á€Ąá€žá€¯á€ļးပá€ŧá€¯á€žá€°á€Ąá€Ŧးလုá€ļးအတá€Ŋကá€ē á€Ąá€œá€¯á€•á€ēလုပá€ēမညá€ēဖá€ŧစá€ēသညá€ē။
    java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။
  • ထိနá€ēးသိမá€ēးသူအမá€ģá€Ŧးအပá€ŧá€Ŧးရှိပá€Ģက၊ အကေá€Ŧငá€ēးဆုá€ļးဖá€ŧေရှငá€ēးခá€ģကá€ēမှá€Ŧ ပရေá€Ŧဂá€ģကá€ēá€žá€­á€¯á€ˇá€á€„á€ēရေá€Ŧကá€ēခá€Ŋင့á€ēá€€á€­á€¯á€™á€°á€Ąá€›á€€á€”á€ˇá€ēသတá€ēရနá€ēဖá€ŧစá€ēသညá€ē။
    ပရေá€Ŧဂá€ģကá€ē -> ဆကá€ēတငá€ēမá€ģá€Ŧး -> အထá€Ŋေထá€Ŋေ -> မá€ŧငá€ēနိုငá€ēမသု၊ ပရေá€Ŧဂá€ģကá€ēအငá€ē္ဂá€Ģရပá€ēမá€ģá€Ŧး၊ ခá€Ŋင့á€ēပá€ŧုခá€ģကá€ēမá€ģá€Ŧးကို သá€Ŋá€Ŧးပá€ŧီး ပရေá€Ŧဂá€ģကá€ēမá€ŧငá€ēနိုငá€ēစá€Ŋမá€ēးကို သတá€ēမှတá€ēပá€Ģ။ ကိုယá€ēပိုငá€ē.
    ကá€ģá€Ŋနá€ēုပá€ēသညá€ē ကá€ģá€Ŋနá€ēုပá€ē၏ကိုယá€ēပိုငá€ē GitLab Runner á€€á€­á€¯á€Ąá€žá€¯á€ļးပá€ŧုပá€ŧီး repository ကိုပá€ŧေá€Ŧငá€ēးလဲရနá€ē တစá€ēá€Ļးတညá€ēးသá€Ŧ ဝငá€ēရေá€Ŧကá€ēခá€Ŋင့á€ēရှိသေá€Ŧကá€ŧေá€Ŧင့á€ē ကá€ģá€Ŋနá€ēုပá€ēတá€Ŋငá€ē အမá€ģá€Ŧးသူငှá€Ŧ á€Ąá€žá€¯á€ļးပá€ŧုနိုငá€ēသေá€Ŧ ပရေá€Ŧဂá€ģကá€ēတစá€ēခုရသိသညá€ē။ အမှနá€ēတေá€Ŧ့၊ အမá€ģá€Ŧးသူငှá€Ŧ ပိုကá€ēလိုငá€ēးမှတá€ēတမá€ēးမá€ģá€Ŧးတá€Ŋငá€ē ကိုယá€ēá€›á€ąá€¸á€€á€­á€¯á€šá€ēတá€Ŧအခá€ģကá€ēအလကá€ēမá€ģá€Ŧးကိုပá€ŧသရနá€ē ကá€ģá€Ŋနá€ēုပá€ē၏အကá€ģိုးစဎးပá€Ŋá€Ŧးမဟုတá€ēပá€Ģ။
  • á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēá€™á€žá€¯á€Ąá€Ŧး ပá€ŧေá€Ŧငá€ēးလဲခá€ŧငá€ēးအတá€Ŋကá€ē စညá€ēးမá€ģဉá€ēးမá€ģá€Ŧး တငá€ēးကá€ģပá€ēခá€ŧငá€ēး။
    ပရေá€Ŧဂá€ģကá€ē -> Settings -> Repository -> Push Rules ကိုသá€Ŋá€Ŧးပá€ŧီး Committer ကန့á€ēသတá€ēခá€ģကá€ēကို သတá€ēမှတá€ēပá€Ģ၊ စá€Ŧရေးသူသညá€ē GitLab á€Ąá€žá€¯á€ļးပá€ŧá€¯á€žá€°á€Ąá€œá€ļမá€ģá€Ŧး ဟုတá€ēမဟုတá€ē စစá€ēဆေးပá€Ģ။ တပá€ēဆငá€ēရနá€ēလညá€ēး အကá€ŧá€ļပá€ŧုပá€Ģသညá€ē။ လကá€ēမှတá€ēထိုးပá€Ģ။နှင့á€ē Reject unsigned commits အလá€ļကို သတá€ēမှတá€ēပá€Ģ။
  • á€‘á€­á€¯á€ˇá€”á€ąá€Ŧကá€ē လုပá€ēဆေá€Ŧငá€ēစရá€Ŧမá€ģá€Ŧးကို စတငá€ēရနá€ē အစပá€ģိုးတစá€ēခုကို သတá€ēမှတá€ēရနá€ē á€œá€­á€¯á€Ąá€•á€ēသညá€ē။
    ပရေá€Ŧဂá€ģကá€ē -> ဆကá€ēတငá€ēမá€ģá€Ŧး -> CI / CD -> ပိုကá€ēလိုငá€ēးအစပá€ģိုးမသုမá€ģá€Ŧá€¸á€žá€­á€¯á€ˇ သá€Ŋá€Ŧးပá€ŧီး အစပá€ģိုး-တိုကငá€ēအသစá€ēတစá€ēခု ဖနá€ēတီးပá€Ģ။
    ဤတိုကငá€ēကို ပရေá€Ŧဂá€ģကá€ēá€Ąá€¯á€•á€ēစုတစá€ēá€á€¯á€Ąá€á€Ŋကá€ē ကိနá€ēးရှငá€ēမá€ģá€Ŧး၏ á€šá€ąá€˜á€¯á€šá€ģဖá€Ŋဲ့စညá€ēးပုá€ļတá€Ŋငá€ē ခá€ģကá€ēခá€ģငá€ēးထည့á€ēနိုငá€ēသညá€ē။
    group -> Settings -> CI / CD -> Variables á€žá€­á€¯á€ˇá€žá€Ŋá€Ŧး၍ variable á€€á€­á€¯á€‘á€Šá€ˇá€ēပá€Ģ။ DEPLOY_TOKEN တနá€ēဖိုးရသိ trigger-token နှင့á€ēအတူ။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

GitLab အပá€ŧေးသမá€Ŧး

သင့á€ēကိုယá€ēပိုငá€ē (Specific) နှင့á€ē အမá€ģá€Ŧးသူငှá€Ŧ (မá€ģှဝေထá€Ŧးသေá€Ŧ) အပá€ŧေးသမá€Ŧးကို á€Ąá€žá€¯á€ļးပá€ŧု၍ ဖá€ŧန့á€ēကá€ģကá€ēလုပá€ēဆေá€Ŧငá€ēသည့á€ē လုပá€ēဆေá€Ŧငá€ēစရá€Ŧမá€ģá€Ŧးကို လုပá€ēဆေá€Ŧငá€ēရနá€ēအတá€Ŋကá€ē ဖá€Ŋဲ့စညá€ēးမသုပုá€ļစá€ļကို ဤကဏ္ဍတá€Ŋငá€ē ဖေá€Ŧá€ēပá€ŧထá€Ŧးသညá€ē။

သတá€ēသတá€ēမှတá€ēမှတá€ē အပá€ŧေးသမá€Ŧး

ပထမဆုá€ļးအနေနဲ့ အဆငá€ēပá€ŧေတယá€ē၊ ​​မá€ŧနá€ēတယá€ē၊ စá€ģေးပေá€Ģတယá€ē၊ ဘá€Ŧကá€ŧေá€Ŧင့á€ēá€œá€˛á€†á€­á€¯á€á€ąá€Ŧ့ á€€á€­á€¯á€šá€ˇá€ēကိုယá€ēပိုငá€ē အပá€ŧေးသမá€Ŧးတá€Ŋá€ąá€€á€­á€¯ သုá€ļးတယá€ē။
အပá€ŧေးသမá€Ŧးအတá€Ŋကá€ē၊ CPU 1၊ 2 GB RAM၊ 20 GB HDD ပá€Ģသေá€Ŧ Linux VDS ကို အကá€ŧá€ļပá€ŧုပá€Ģသညá€ē။ ထုတá€ēပေးသေá€Ŧစá€ģá€ąá€¸á€”á€žá€¯á€”á€ēးမှá€Ŧ တစá€ēနှစá€ēလá€ģှငá€ē ~3000â‚Ŋ ဖá€ŧစá€ēသညá€ē။

ငá€Ģ့အပá€ŧေးသမá€Ŧး

အပá€ŧေးသမá€Ŧးအတá€Ŋကá€ē ကá€ģá€Ŋနá€ēုပá€ēသညá€ē VDS 4 CPU၊ 4 GB RAM ၊ 50 GB SSD ကို ယူခဲ့သညá€ē။ ~11000â‚Ŋ ကုနá€ēကá€ģပá€ŧီး ဘယá€ēတေá€Ŧ့မှ နေá€Ŧငá€ēတမရပá€Ģဘူး။
á€…á€¯á€…á€¯á€•á€ąá€Ģငá€ēး စကá€ē ၇ လုá€ļးရှိတယá€ē။ Aruba တá€Ŋငá€ē 7 နှင့á€ē 5 ihor ။

အဲဒီတေá€Ŧ့ အပá€ŧေးသမá€Ŧးရှိတယá€ē။ ယခု ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇ ၎ငá€ēးကို configure လုပá€ēပá€Ģမညá€ē။
SSH မှတစá€ēဆင့á€ē စကá€ēá€žá€­á€¯á€ˇá€žá€Ŋá€Ŧး၍ java, git, maven, gnupg2 ကို install လုပá€ēပá€Ģ။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

gitlab runner ကို ထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

  • အဖá€Ŋဲ့အသစá€ēတစá€ēခုဖနá€ēတီးပá€Ģ။ runner
    sudo groupadd runner
  • maven ကကá€ēရှá€ēအတá€Ŋကá€ē လမá€ēးညá€Ŋှနá€ēတစá€ēခုဖနá€ēတီးပá€ŧီး အဖá€Ŋဲ့ခá€Ŋင့á€ēပá€ŧုခá€ģကá€ēမá€ģá€Ŧးကို သတá€ēမှတá€ēပá€Ģ။ runner
    စကá€ēတစá€ēလုá€ļးတá€Ŋငá€ē အပá€ŧေးသမá€Ŧးအမá€ģá€Ŧးအပá€ŧá€Ŧးကို လညá€ēပတá€ēရနá€ē အစီအစဉá€ēမရှိပá€Ģက ဤအမှတá€ēကို ကá€ģေá€Ŧá€ēသá€Ŋá€Ŧးနိုငá€ēသညá€ē။
    mkdir -p /usr/cache/.m2/repository
    chown -R :runner /usr/cache
    chmod -R 770 /usr/cache
  • á€Ąá€žá€¯á€ļးပá€ŧုသူဖနá€ēတီးပá€Ģ။ gitlab-deployer နှင့á€ēအဖá€Ŋá€˛á€ˇá€žá€­á€¯á€ˇá€‘á€Šá€ˇá€ēပá€Ģ။ runner
    useradd -m -d /home/gitlab-deployer gitlab-deployer
    usermod -a -G runner gitlab-deployer
  • ဖိုငá€ēá€žá€­á€¯á€ˇá€‘á€Šá€ˇá€ēပá€Ģ။ /etc/ssh/sshd_config နေá€Ŧကá€ēတစá€ēကá€ŧေá€Ŧငá€ēး
    AllowUsers root@* gitlab-deployer@127.0.0.1
  • ပá€ŧနá€ēဖá€Ŋင့á€ēပá€Ģ။ sshd
    systemctl restart sshd
  • á€Ąá€žá€¯á€ļးပá€ŧá€¯á€žá€°á€Ąá€á€Ŋကá€ē စကá€Ŧးဝှကá€ēတစá€ēခု သတá€ēမှတá€ēခá€ŧငá€ēး။ gitlab-deployer (Localhost အတá€Ŋကá€ē ကန့á€ēသတá€ēခá€ģကá€ēတစá€ēခု ရှိသေá€Ŧကá€ŧေá€Ŧင့á€ē ရိုးရသငá€ēးနိုငá€ēပá€Ģသညá€ē။)
    passwd gitlab-deployer
  • GitLab Runner ကို ထည့á€ēသá€Ŋငá€ēးပá€Ģ (Linux x၈၆-၆၄)
    sudo wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    sudo chmod +x /usr/local/bin/gitlab-runner
    ln -s /usr/local/bin/gitlab-runner /etc/alternatives/gitlab-runner
    ln -s /etc/alternatives/gitlab-runner /usr/bin/gitlab-runner
  • gitlab.com -> deploy-project -> Settings -> CI/CD -> Runners -> Specific Runners á€žá€­á€¯á€ˇá€žá€Ŋá€Ŧး၍ မှတá€ēပုá€ļတငá€ēထá€Ŧးသေá€Ŧ တိုကငá€ēကို ကူးယူပá€Ģ။

မá€ģကá€ēနှá€Ŧပá€ŧငá€ē

java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

  • အပá€ŧေးသမá€Ŧး မှတá€ēပုá€ļတငá€ēခá€ŧငá€ēး။
    gitlab-runner register --config /etc/gitlab-runner/gitlab-deployer-config.toml

ဖá€ŧစá€ēစဉá€ē

Runtime platform arch=amd64 os=linux pid=17594 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
https://gitlab.com/
Please enter the gitlab-ci token for this runner:
REGISTRATION_TOKEN
Please enter the gitlab-ci description for this runner:
[ih1174328.vds.myihor.ru]: Deploy Runner
Please enter the gitlab-ci tags for this runner (comma separated):
deploy
Registering runner... succeeded                     runner=ZvKdjJhx
Please enter the executor: docker-ssh, parallels, virtualbox, docker-ssh+machine, kubernetes, docker, ssh, docker+machine, shell:
shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
  • အပá€ŧေးသမá€Ŧးစá€Ŧရငá€ēးသá€Ŋငá€ēးပá€ŧီးကá€ŧေá€Ŧငá€ēး စစá€ēဆေးပá€Ģတယá€ē။ gitlab.com -> deploy-project -> ဆကá€ēတငá€ēမá€ģá€Ŧး -> CI/CD -> Runners -> Specific Runners -> Runners မá€ģá€Ŧးကို ဤပရေá€Ŧဂá€ģကá€ēအတá€Ŋကá€ē activated

မá€ģကá€ēနှá€Ŧပá€ŧငá€ē

java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

  • ထည့á€ēပá€Ģ သီးခá€ŧá€Ŧး ဝနá€ēဆေá€Ŧငá€ēမသု /etc/systemd/system/gitlab-deployer.service
    [Unit]
    Description=GitLab Deploy Runner
    After=syslog.target network.target
    ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
    [Service]
    StartLimitInterval=5
    StartLimitBurst=10
    ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-deployer" "--config" "/etc/gitlab-runner/gitlab-deployer-config.toml" "--service" "gitlab-deployer" "--syslog" "--user" "gitlab-deployer"
    Restart=always
    RestartSec=120
    [Install]
    WantedBy=multi-user.target
  • ဝနá€ēဆေá€Ŧငá€ēမသုကို စလိုကá€ēရအေá€Ŧငá€ē။
    systemctl enable gitlab-deployer.service
    systemctl start gitlab-deployer.service
    systemctl status gitlab-deployer.service
  • အပá€ŧေးသမá€Ŧးက ပá€ŧေးနေတá€Ŧကို စစá€ēဆေးတယá€ē။

နမူနá€Ŧ

java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

GPG သေá€Ŧ့မá€ģá€Ŧးထုတá€ēပေးခá€ŧငá€ēး။

  • တူညီသေá€Ŧစကá€ēá€™á€žá€Ąá€žá€¯á€ļးပá€ŧá€¯á€žá€°á€Ąá€ąá€Ŧကá€ēရှိ ssh မှတဆင့á€ēကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá€á€„á€ēရေá€Ŧကá€ēသညá€ē။ gitlab-deployer (၎ငá€ēးသညá€ē GPG သေá€Ŧá€ˇá€€á€­á€¯á€–á€”á€ēတီးရနá€ēအတá€Ŋကá€ē အရေးကá€ŧီးသညá€ē)
    ssh gitlab-deployer@127.0.0.1
  • ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá€žá€Šá€ē မေးခá€Ŋနá€ēးမá€ģá€Ŧးကိုဖá€ŧá€ąá€†á€­á€¯á€á€ŧငá€ēးဖá€ŧင့á€ē သေá€Ŧ့တစá€ēခုထုတá€ēပေးပá€Ģသညá€ē။ á€€á€­á€¯á€šá€ˇá€ēနá€Ŧမညá€ēနဲ့ အီးမေးလá€ēကို သုá€ļးတယá€ē။
    သေá€Ŧ့အတá€Ŋကá€ē စကá€Ŧးဝှကá€ēကို သေခá€ģá€Ŧသတá€ēမှတá€ēပá€Ģ။ ပစ္စညá€ēးမá€ģá€Ŧးကို ဤသေá€Ŧ့ဖá€ŧင့á€ē လကá€ēမှတá€ēá€›á€ąá€¸á€‘á€­á€¯á€¸á€•á€Ģမညá€ē။
    gpg --gen-key 
  • ယငá€ēးစစá€ēဆေး
    gpg --list-keys -a
    /home/gitlab-deployer/.gnupg/pubring.gpg
    ----------------------------------------
    pub   4096R/00000000 2019-04-19
    uid                  Petruha Petrov <pp@example.com>
    sub   4096R/11111111 2019-04-19
  • ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá အမá€ģá€Ŧးသူငှá€Ŧသေá€Ŧá€ˇá€€á€­á€¯ သေá€Ŧ့ဆá€Ŧဗá€Ŧá€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēခá€ŧငá€ēး။
    gpg --keyserver keys.gnupg.net --send-key 00000000
    gpg: sending key 00000000 to hkp server keys.gnupg.net

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

Maven ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

  • á€Ąá€žá€¯á€ļးပá€ŧá€¯á€žá€°á€Ąá€–á€ŧစá€ē အကေá€Ŧင့á€ēဝငá€ēပá€Ģ။ gitlab-deployer
    su gitlab-deployer 
  • maven လမá€ēးညá€Ŋှနá€ēတစá€ēခုဖနá€ēတီးပá€Ģ။ repository နှင့á€ē cache á€žá€­á€¯á€ˇá€œá€„á€ˇá€ēခá€ē (အမှá€Ŧးမလုပá€ēပá€Ģနှင့á€ē)
    စကá€ēတစá€ēလုá€ļးတá€Ŋငá€ē အပá€ŧေးသမá€Ŧးအမá€ģá€Ŧးအပá€ŧá€Ŧးကို လညá€ēပတá€ēရနá€ē အစီအစဉá€ēမရှိပá€Ģက ဤအမှတá€ēကို ကá€ģေá€Ŧá€ēသá€Ŋá€Ŧးနိုငá€ēသညá€ē။
    mkdir -p ~/.m2/repository
    ln -s /usr/cache/.m2/repository /home/gitlab-deployer/.m2/repository
  • မá€Ŧစတá€Ŧကီးတစá€ēခုဖနá€ēတီးပá€Ģ။
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • ~/.m2/settings-security.xml ဖိုငá€ēတစá€ēခု ဖနá€ēတီးပá€Ģ။
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype အကေá€Ŧင့á€ēအတá€Ŋကá€ē စကá€Ŧးဝှကá€ēကို ကုဒá€ēဝှကá€ēခá€ŧငá€ēး။
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ~/.m2/settings.xml ဖိုငá€ēတစá€ēခု ဖနá€ēတီးပá€Ģ။
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>SONATYPE_USERNAME</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

ဘယá€ēမှá€Ŧလဲ၊
GPG_SECRET_KEY_PASSHRASE - GPG သေá€Ŧ့အတá€Ŋကá€ē စကá€Ŧးဝှကá€ē
SONATYPE_USERNAME — sonatype အကေá€Ŧင့á€ē အကေá€Ŧင့á€ēဝငá€ēပá€Ģ။

၎ငá€ēးသညá€ē အပá€ŧေးသမá€Ŧး၏ တပá€ēဆငá€ēá€™á€žá€¯á€Ąá€Ŧး အပá€ŧီးသတá€ēပá€ŧီး á€Ąá€•á€­á€¯á€„á€ēá€¸á€žá€­á€¯á€ˇ ဆကá€ēလကá€ēလုပá€ēဆေá€Ŧငá€ēနိုငá€ēသညá€ē။ GitLab CI

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

Shared Runner ပá€Ģ။

GPG သေá€Ŧ့မá€ģá€Ŧးထုတá€ēပေးခá€ŧငá€ēး။

  • ပထမá€Ļးစá€Ŋá€Ŧ၊ သငá€ēသညá€ē GPG သေá€Ŧá€ˇá€€á€­á€¯á€–á€”á€ēတီးရနá€ēá€œá€­á€¯á€Ąá€•á€ēသညá€ē။ ဒဎလိုလုပá€ēá€–á€­á€¯á€ˇ gnupg ကို install လုပá€ēပá€Ģ။
    yum install -y gnupg
  • ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá€žá€Šá€ē မေးခá€Ŋနá€ēးမá€ģá€Ŧးကိုဖá€ŧá€ąá€†á€­á€¯á€á€ŧငá€ēးဖá€ŧင့á€ē သေá€Ŧ့တစá€ēခုထုတá€ēပေးပá€Ģသညá€ē။ á€€á€­á€¯á€šá€ˇá€ēနá€Ŧမညá€ēနဲ့ အီးမေးလá€ēကို သုá€ļးတယá€ē။ သေá€Ŧ့အတá€Ŋကá€ē စကá€Ŧးဝှကá€ēကို သေခá€ģá€Ŧသတá€ēမှတá€ēပá€Ģ။
    gpg --gen-key 
  • သေá€Ŧ့ပေá€Ģá€ēတá€Ŋငá€ē အခá€ģကá€ēအလကá€ēကို ပá€ŧသခá€ŧငá€ēး။
    gpg --list-keys -a
    pub   rsa3072 2019-04-24 [SC] [expires: 2021-04-23]
      2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    uid           [ultimate] tttemp <temp@temp.temp>
    sub   rsa3072 2019-04-24 [E] [expires: none]
  • ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá အမá€ģá€Ŧးသူငှá€Ŧသေá€Ŧá€ˇá€€á€­á€¯ သေá€Ŧ့ဆá€Ŧဗá€Ŧá€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēခá€ŧငá€ēး။
    gpg --keyserver keys.gnupg.net --send-key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    gpg: sending key 2D0D1706366FC4AEF79669E24D09C55BBA3FD728 to hkp server keys.gnupg.net
  • ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá€žá€Šá€ē သီးသန့á€ēသေá€Ŧá€ˇá€€á€­á€¯ ရရှိပá€Ģသညá€ē။
    gpg --export-secret-keys --armor 2D0D1706366FC4AEF79669E24D09C55BBA3FD728
    -----BEGIN PGP PRIVATE KEY BLOCK-----
    lQWGBFzAqp8BDADN41CPwJ/gQwiKEbyA902DKw/WSB1AvZQvV/ZFV77xGeG4K7k5
    ...
    =2Wd2
    -----END PGP PRIVATE KEY BLOCK-----
  • ပရေá€Ŧဂá€ģကá€ēဆကá€ēတငá€ēမá€ģá€Ŧး -> ဆကá€ēတငá€ēမá€ģá€Ŧး -> CI / CD -> Variables á€žá€­á€¯á€ˇá€žá€Ŋá€Ŧးကá€Ŧ သီးသန့á€ēကဎးကို ကိနá€ēးရှငá€ēတစá€ēခုတá€Ŋငá€ē သိမá€ēးဆညá€ēးပá€Ģ။ GPG_SECRET_KEY
    java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

Maven ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

  • မá€Ŧစတá€Ŧကီးတစá€ēခုဖနá€ēတီးပá€Ģ။
    mvn --encrypt-master-password password
    {hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}
  • ပရေá€Ŧဂá€ģကá€ēဆကá€ēတငá€ēမá€ģá€Ŧး -> ဆကá€ēတငá€ēမá€ģá€Ŧး -> CI / CD -> Variables á€žá€­á€¯á€ˇá€žá€Ŋá€Ŧးကá€Ŧ variable တá€Ŋငá€ēသိမá€ēးဆညá€ēးပá€Ģ။ SETTINGS_SECURITY_XML အေá€Ŧကá€ēပá€Ģစá€Ŧကá€ŧေá€Ŧငá€ēးမá€ģá€Ŧး
    <settingsSecurity>
    <master>{hnkle5BJ9HUHUMP+CXfGBl8dScfFci/mpsur/73tR2I=}</master>
    </settingsSecurity>
  • Sonatype အကေá€Ŧင့á€ēအတá€Ŋကá€ē စကá€Ŧးဝှကá€ēကို ကုဒá€ēဝှကá€ēခá€ŧငá€ēး။
    mvn --encrypt-password SONATYPE_PASSWORD
    {98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}
  • ပရေá€Ŧဂá€ģကá€ēဆကá€ēတငá€ēမá€ģá€Ŧး -> ဆကá€ēတငá€ēမá€ģá€Ŧး -> CI / CD -> Variables á€žá€­á€¯á€ˇá€žá€Ŋá€Ŧးကá€Ŧ variable တá€Ŋငá€ēသိမá€ēးဆညá€ēးပá€Ģ။ SETTINGS_XML အေá€Ŧကá€ēပá€Ģစá€Ŧကá€ŧေá€Ŧငá€ēးမá€ģá€Ŧး
    <settings>  
    <profiles>
        <profile>
            <id>env</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <gpg.passphrase>GPG_SECRET_KEY_PASSPHRASE</gpg.passphrase>
            </properties>
        </profile>
    </profiles>
    <servers>
        <server>
            <id>sonatype</id>
            <username>sonatype_username</username>
            <password>{98Wv5+u+Tn0HX2z5G/kR4R8Z0WBgcDBgi7d12S/un+SCU7uxzaZGGmJ8Cu9pAZ2J}</password>
        </server>
    </servers>
    </settings>

ဘယá€ēမှá€Ŧလဲ၊
GPG_SECRET_KEY_PASSHRASE - GPG သေá€Ŧ့အတá€Ŋကá€ē စကá€Ŧးဝှကá€ē
SONATYPE_USERNAME — sonatype အကေá€Ŧင့á€ē အကေá€Ŧင့á€ēဝငá€ēပá€Ģ။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

docker ပုá€ļအá€Ŧး á€Ąá€žá€¯á€ļးပá€ŧုပá€Ģ။

  • á€œá€­á€¯á€Ąá€•á€ēသေá€Ŧ Java ဗá€Ŧးရှငá€ēးဖá€ŧင့á€ē လုပá€ēဆေá€Ŧငá€ēစရá€Ŧမá€ģá€Ŧးကို ဖá€ŧန့á€ēကá€ģကá€ēလုပá€ēဆေá€Ŧငá€ēရနá€ē မá€ģှမá€ģှတတ ရိုးရသငá€ēးသေá€Ŧ Dockerfile တစá€ēခုကို ဖနá€ēတီးပá€Ģသညá€ē။ အေá€Ŧကá€ēတá€Ŋငá€ē alpine á€Ĩပမá€Ŧတစá€ēခုဖá€ŧစá€ēသညá€ē။
    FROM java:8u111-jdk-alpine
    RUN apk add gnupg maven git --update-cache 
    --repository http://dl-4.alpinelinux.org/alpine/edge/community/ --allow-untrusted && 
    mkdir ~/.m2/
  • သင့á€ēပရေá€Ŧဂá€ģကá€ēအတá€Ŋကá€ē ကá€Ŋနá€ēတိနá€ēနá€Ŧတစá€ēခုကို တပá€ēဆငá€ēခá€ŧငá€ēး။
    docker build -t registry.gitlab.com/group/deploy .
  • ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá€žá€Šá€ē စစá€ēမှနá€ēကá€ŧေá€Ŧငá€ēးအထေá€Ŧကá€ēအထá€Ŧးပá€ŧပá€ŧီး ကá€Ŋနá€ēတိနá€ēနá€Ŧကို မှတá€ēပုá€ļတငá€ēခá€ŧငá€ēá€¸á€žá€­á€¯á€ˇ တငá€ēပá€Ģသညá€ē။
    docker login -u USER -p PASSWORD registry.gitlab.com
    docker push registry.gitlab.com/group/deploy

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

GitLab CI

ပရေá€Ŧဂá€ģကá€ēကို á€Ąá€žá€¯á€ļးခá€ģပá€Ģ။

deploy ပရေá€Ŧဂá€ģကá€ē၏ root တá€Ŋငá€ē .gitlab-ci.yml ဖိုငá€ēကို ထည့á€ēပá€Ģ။
ဇá€Ŧတá€ēညá€Ŋှနá€ēးသညá€ē အပá€ŧနá€ēအလှနá€ēသီးသန့á€ē ဖá€ŧန့á€ēကá€ģကá€ēလုပá€ēဆေá€Ŧငá€ēစရá€Ŧ နှစá€ēခုကို တငá€ēပá€ŧသညá€ē။ Specific Runner á€žá€­á€¯á€ˇá€™á€Ÿá€¯á€á€ē Shared Runner အသီးသီး။

.gitlab-ci.yml

stages:
  - deploy

Specific Runner:
  extends: .java_deploy_template
  # Đ—Đ°Đ´Đ°Ņ‡Đ° ĐąŅƒĐ´ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒŅŅ ĐŊа Đ˛Đ°ŅˆĐĩĐŧ shell-Ņ€Đ°ĐŊĐŊĐĩŅ€Đĩ
  tags:
    - deploy

Shared Runner:
  extends: .java_deploy_template
  # Đ—Đ°Đ´Đ°Ņ‡Đ° ĐąŅƒĐ´ĐĩŅ‚ Đ˛Ņ‹ĐŋĐžĐģĐŊŅŅ‚ŅŒŅŅ ĐŊа ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊĐžĐŧ docker-Ņ€Đ°ĐŊĐŊĐĩŅ€Đĩ
  tags:
    - docker
  # ĐžĐąŅ€Đ°Đˇ иС Ņ€Đ°ĐˇĐ´ĐĩĐģа GitLab Runner -> Shared Runner -> Docker
  image: registry.gitlab.com/group/deploy-project:latest
  before_script:
    # ИĐŧĐŋĐžŅ€Ņ‚Đ¸Ņ€ŅƒĐĩĐŧ GPG ĐēĐģŅŽŅ‡
    - printf "${GPG_SECRET_KEY}" | gpg --batch --import
    # ĐĄĐžŅ…Ņ€Đ°ĐŊŅĐĩĐŧ maven ĐēĐžĐŊŅ„Đ¸ĐŗŅƒŅ€Đ°Ņ†Đ¸ŅŽ
    - printf "${SETTINGS_SECURITY_XML}" > ~/.m2/settings-security.xml
    - printf "${SETTINGS_XML}" > ~/.m2/settings.xml

.java_deploy_template:
  stage: deploy
  # Đ—Đ°Đ´Đ°Ņ‡Đ° ŅŅ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ ĐŋĐž Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€Ņƒ, ĐĩҁĐģи ĐŋĐĩŅ€ĐĩдаĐŊа ĐŋĐĩŅ€ĐĩĐŧĐĩĐŊĐŊĐ°Ņ DEPLOY ŅĐž СĐŊĐ°Ņ‡ĐĩĐŊиĐĩĐŧ java
  only:
    variables:
    - $DEPLOY == "java"
  variables:
    # ĐžŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ĐēĐģĐžĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°
    GIT_STRATEGY: none
  script:
    # ĐŸŅ€ĐĩĐ´ĐžŅŅ‚Đ°Đ˛ĐģŅĐĩĐŧ вОСĐŧĐžĐļĐŊĐžŅŅ‚ŅŒ Ņ…Ņ€Đ°ĐŊĐĩĐŊĐ¸Ņ ĐŋĐ°Ņ€ĐžĐģŅ в ĐŊĐĩĐˇĐ°ŅˆĐ¸Ņ„Ņ€ĐžĐ˛Đ°ĐŊĐŊĐžĐŧ видĐĩ
    - git config --global credential.helper store
    # ĐĄĐžŅ…Ņ€Đ°ĐŊŅĐĩĐŧ Đ˛Ņ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đĩ ĐēŅ€ĐĩĐ´Ņ‹ ĐŋĐžĐģŅŒĐˇĐžĐ˛Đ°Ņ‚ĐĩĐģŅ gitlab-ci-token
    # ĐĸĐžĐēĐĩĐŊ Ņ€Đ°ĐąĐžŅ‚Đ°ĐĩŅ‚ Đ´ĐģŅ Đ˛ŅĐĩŅ… ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊҋ҅ ĐŋŅ€ĐžĐĩĐēŅ‚ĐžĐ˛ gitlab.com и Đ´ĐģŅ ĐŋŅ€ĐžĐĩĐēŅ‚ĐžĐ˛ ĐŗŅ€ŅƒĐŋĐŋŅ‹
    - echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
    # ПоĐģĐŊĐžŅŅ‚ŅŒŅŽ Ņ‡Đ¸ŅŅ‚Đ¸Đŧ Ņ‚ĐĩĐēŅƒŅ‰ŅƒŅŽ Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸ŅŽ
    - rm -rf .* *
    # КĐģĐžĐŊĐ¸Ņ€ŅƒĐĩĐŧ ĐŋŅ€ĐžĐĩĐēŅ‚ ĐēĐžŅ‚ĐžŅ€Ņ‹Đš, ĐąŅƒĐ´ĐĩĐŧ Đ´ĐĩĐŋĐģĐžĐ¸Ņ‚ŅŒ в Sonatype Nexus
    - git clone ${DEPLOY_CI_REPOSITORY_URL} .
    # ПĐĩŅ€ĐĩĐēĐģŅŽŅ‡Đ°ĐĩĐŧŅŅ ĐŊа ĐŊ҃ĐļĐŊŅ‹Đš ĐēĐžĐŧĐŧĐ¸Ņ‚
    - git checkout ${DEPLOY_CI_COMMIT_SHA} -f
    # Đ•ŅĐģи Ņ…ĐžŅ‚ŅŒ ОдиĐŊ pom.xml ŅĐžĐ´ĐĩŅ€ĐļĐ¸Ņ‚ ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ autoReleaseAfterClose ваĐģиĐŧ ŅĐąĐžŅ€Đē҃.
    # В ĐŋŅ€ĐžŅ‚Đ¸Đ˛ĐŊĐžĐŧ ҁĐģŅƒŅ‡Đ°Đĩ ĐĩŅŅ‚ŅŒ Ņ€Đ¸ŅĐē СаĐģĐ¸Ņ‚ŅŒ ҁҋҀҋĐĩ Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ в maven central
    - >
      for pom in $(find . -name pom.xml); do
        if [[ $(grep -q autoReleaseAfterClose "$pom" && echo $?) == 0 ]]; then
          echo "File $pom contains prohibited setting: <autoReleaseAfterClose>";
          exit 1;
        fi;
      done
    # Đ•ŅĐģи ĐŋĐ°Ņ€Đ°ĐŧĐĩ҂Ҁ DEPLOY_CI_COMMIT_TAG ĐŋŅƒŅŅ‚ĐžĐš, Ņ‚Đž ĐŋŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐž ŅŅ‚Đ°Đ˛Đ¸Đŧ SNAPSHOT-вĐĩŅ€ŅĐ¸ŅŽ
    - >
      if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then
        mvn versions:set -DnewVersion=${DEPLOY_CI_COMMIT_TAG}
      else
        VERSION=$(mvn -q -Dexec.executable=echo -Dexec.args='${project.version}' --non-recursive exec:exec)
        if [[ "${VERSION}" == *-SNAPSHOT ]]; then
          mvn versions:set -DnewVersion=${VERSION}
        else
          mvn versions:set -DnewVersion=${VERSION}-SNAPSHOT
        fi
      fi
    # ЗаĐŋ҃ҁĐēаĐĩĐŧ ĐˇĐ°Đ´Đ°Ņ‡Ņƒ ĐŊа ŅĐąĐžŅ€Đē҃ и Đ´ĐĩĐŋĐģОК Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ĐžĐ˛
    - mvn clean deploy -DskipTests=true

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

Java ပရေá€Ŧဂá€ģကá€ē

အမá€ģá€Ŧးသူငှá€Ŧ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရá€Ŧမá€ģá€Ŧá€¸á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēထá€Ŧးရမည့á€ē java ပရေá€Ŧဂá€ģကá€ēမá€ģá€Ŧးတá€Ŋငá€ē၊ Release နှင့á€ē Snapshot ဗá€Ŧးရှငá€ēးမá€ģá€Ŧးကို ဒေá€Ģငá€ēးလုဒá€ēလုပá€ēရနá€ē အဆင့á€ē ၂ ဆင့á€ē ထပá€ēထည့á€ēရနá€ē á€œá€­á€¯á€Ąá€•á€ēသညá€ē။

.gitlab-ci.yml

stages:
  - build
  - test
  - verify
  - deploy

<...>

Release:
  extends: .trigger_deploy
  # ЗаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ ĐˇĐ°Đ´Đ°Ņ‡Ņƒ Ņ‚ĐžĐģҌĐēĐž Đŋo Ņ‚ĐĩĐŗŅƒ.
  only:
    - tags

Snapshot:
  extends: .trigger_deploy
  # ЗаĐŋ҃ҁĐēаĐĩĐŧ ĐˇĐ°Đ´Đ°Ņ‡Ņƒ ĐŊа ĐŋŅƒĐąĐģиĐēĐ°Ņ†Đ¸ŅŽ SNAPSHOT вĐĩŅ€ŅĐ¸Đ¸ Đ˛Ņ€ŅƒŅ‡ĐŊŅƒŅŽ
  when: manual
  # НĐĩ СаĐŋ҃ҁĐēĐ°Ņ‚ŅŒ ĐˇĐ°Đ´Đ°Ņ‡Ņƒ, ĐĩҁĐģи ĐŋŅ€ĐžŅŅ‚Đ°Đ˛ĐģĐĩĐŊ Ņ‚ĐĩĐŗ.
  except:
    - tags

.trigger_deploy:
  stage: deploy
  variables:
    # ĐžŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ĐēĐģĐžĐŊĐ¸Ņ€ĐžĐ˛Đ°ĐŊиĐĩ Ņ‚ĐĩĐēŅƒŅ‰ĐĩĐŗĐž ĐŋŅ€ĐžĐĩĐēŅ‚Đ°
    GIT_STRATEGY: none
    # ĐĄŅŅ‹ĐģĐēа ĐŊа Ņ‚Ņ€Đ¸ĐŗĐŗĐĩŅ€ deploy-ĐˇĐ°Đ´Đ°Ņ‡Đ¸
    URL: "https://gitlab.com/api/v4/projects/<deploy project ID>/trigger/pipeline"
    # ПĐĩŅ€ĐĩĐŧĐĩĐŊĐŊŅ‹Đĩ deploy-ĐˇĐ°Đ´Đ°Ņ‡Đ¸
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
    # НĐĩ Đ¸ŅĐŋĐžĐģŅŒĐˇŅƒŅŽ cURL, Ņ‚Đ°Đē ĐēаĐē ҁ Ņ„ĐģĐ°ĐŗĐ°Đŧи --fail --show-error
    # ĐžĐŊ ĐŊĐĩ Đ˛Ņ‹Đ˛ĐžĐ´Đ¸Ņ‚ Ņ‚ĐĩĐģĐž ĐžŅ‚Đ˛ĐĩŅ‚Đ°, ĐĩҁĐģи HTTP ĐēОд 400 и йОĐģĐĩĐĩ 
    - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

ဤဖá€ŧေရှငá€ēးခá€ģကá€ēတá€Ŋငá€ē၊ ကá€ģá€Ŋနá€ēုပá€ēသညá€ē အနညá€ēးငယá€ēပို၍ java ပရေá€Ŧဂá€ģကá€ēမá€ģá€Ŧးအတá€Ŋကá€ē CI နမူနá€Ŧပုá€ļစá€ļတစá€ēခုကို á€Ąá€žá€¯á€ļးပá€ŧုရနá€ē ဆုá€ļးဖá€ŧတá€ēခဲ့သညá€ē။

ပိုပá€ŧီးအသေးစိတá€ē

သီးခá€ŧá€Ŧးပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို ဖနá€ēတီးခဲ့တယá€ē။ gitlab-ci java ပရေá€Ŧဂá€ģကá€ēမá€ģá€Ŧးအတá€Ŋကá€ē CI ပုá€ļစá€ļတစá€ēခုကို ထá€Ŧးရှိခဲ့သညá€ē။ common.yml.

common.yml

stages:
  - build
  - test
  - verify
  - deploy

variables:
  SONAR_ARGS: "
  -Dsonar.gitlab.commit_sha=${CI_COMMIT_SHA} 
  -Dsonar.gitlab.ref_name=${CI_COMMIT_REF_NAME} 
  "

.build_java_project:
  stage: build
  tags:
    - touchbit-shell
  variables:
    SKIP_TEST: "false"
  script:
    - mvn clean
    - mvn package -DskipTests=${SKIP_TEST}
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.build_sphinx_doc:
  stage: build
  tags:
    - touchbit-shell
  variables:
    DOCKERFILE: .indirect/docs/Dockerfile
  script:
    - docker build --no-cache -t ${CI_PROJECT_NAME}/doc -f ${DOCKERFILE} .

.junit_module_test_run:
  stage: test
  tags:
    - touchbit-shell
  variables:
    MODULE: ""
  script:
    - cd ${MODULE}
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
      - "*/target/reports"

.junit_test_run:
  stage: test
  tags:
    - touchbit-shell
  script:
    - mvn test
  artifacts:
    when: always
    expire_in: 30 day
    paths:
    - "*/target/reports"

.sonar_review:
  stage: verify
  tags:
    - touchbit-shell
  dependencies: []
  script:
    - >
      if [ "$CI_BUILD_REF_NAME" == "master" ]; then
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS
      else
        mvn compile sonar:sonar -Dsonar.login=$SONAR_LOGIN $SONAR_ARGS -Dsonar.analysis.mode=preview
      fi

.trigger_deploy:
  stage: deploy
  tags:
    - touchbit-shell
  variables:
    URL: "https://gitlab.com/api/v4/projects/10345765/trigger/pipeline"
    POST_DATA: "
      token=${DEPLOY_TOKEN}&
      ref=master&
      variables[DEPLOY]=${DEPLOY}&
      variables[DEPLOY_CI_REPOSITORY_URL]=${CI_REPOSITORY_URL}&
      variables[DEPLOY_CI_PROJECT_NAME]=${CI_PROJECT_NAME}&
      variables[DEPLOY_CI_COMMIT_SHA]=${CI_COMMIT_SHA}&
      variables[DEPLOY_CI_COMMIT_TAG]=${CI_COMMIT_TAG}
      "
  script:
  - wget --content-on-error -qO- ${URL} --post-data ${POST_DATA}

.trigger_release_deploy:
  extends: .trigger_deploy
  only:
    - tags

.trigger_snapshot_deploy:
  extends: .trigger_deploy
  when: manual
  except:
    - tags

ရလဒá€ēအနေနှင့á€ē၊ java ပရေá€Ŧဂá€ģကá€ēမá€ģá€Ŧးတá€Ŋငá€ē ၎ငá€ēá€¸á€á€­á€¯á€ˇá€€á€­á€¯á€šá€ēတိုငá€ē၊ .gitlab-ci.yml သညá€ē အလá€Ŋနá€ēကá€ģစá€ēလá€ģစá€ēပá€ŧီး စကá€Ŧးမပá€ŧေá€Ŧနိုငá€ē၊

.gitlab-ci.yml

include: https://gitlab.com/TouchBIT/gitlab-ci/raw/master/common.yml

Shields4J:
  extends: .build_java_project

Sphinx doc:
  extends: .build_sphinx_doc
  variables:
    DOCKERFILE: .docs/Dockerfile

Sonar review:
  extends: .sonar_review
  dependencies:
    - Shields4J

Release:
  extends: .trigger_release_deploy

Snapshot:
  extends: .trigger_snapshot_deploy

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

Pom.xml ဖá€Ŋဲ့စညá€ēးမသု

ဤအကá€ŧေá€Ŧငá€ēးအရá€Ŧကို အသေးစိတá€ēဖေá€Ŧá€ēပá€ŧထá€Ŧးသညá€ē။ Googolplex в လá€ģှပá€ēတစá€ēပá€ŧကá€ēရိုကá€ēခá€ģကá€ēမá€ģá€Ŧးနှင့á€ē á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရá€Ŧနေရá€Ŧမá€ģá€Ŧá€¸á€žá€­á€¯á€ˇ á€Ąá€œá€­á€¯á€Ąá€œá€ģေá€Ŧကá€ē လကá€ēမှတá€ēထိုးပá€ŧီး အပá€ēလုဒá€ēလုပá€ēရနá€ē maven ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။ဒá€Ģကá€ŧေá€Ŧင့á€ē Plugins á€Ąá€žá€¯á€ļးပá€ŧုခá€ŧငá€ēးရဲ့ ကá€Ŋဲပá€ŧá€Ŧးခá€ģကá€ēအခá€ģá€­á€¯á€ˇá€€á€­á€¯ ဖေá€Ŧá€ēပá€ŧပá€Ģမယá€ē။ ဘယá€ēလို လá€Ŋယá€ēကူပá€ŧီး ပေá€Ģ့ပေá€Ģ့ပá€Ģးပá€Ģး သုá€ļးနိုငá€ēá€œá€˛á€†á€­á€¯á€á€Ŧကိုလညá€ēး ပá€ŧေá€Ŧပá€ŧပေးသá€Ŋá€Ŧးမှá€Ŧပá€Ģ။ nexus-staging-maven-pluginသင့á€ēပရေá€Ŧဂá€ģကá€ēအတá€Ŋကá€ē မိဘအနေဖá€ŧင့á€ē org.sonatype.oss:oss-parent ကို á€Ąá€žá€¯á€ļးမပá€ŧုလိုပá€Ģက á€žá€­á€¯á€ˇá€™á€Ÿá€¯á€á€ē မသုá€ļးနိုငá€ēလá€ģှငá€ē။

maven-install-plugin

á€’á€ąá€žá€†á€­á€¯á€„á€ēရá€Ŧá€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēမသုတá€Ŋငá€ē မေá€Ŧá€ēဂá€ģူးမá€ģá€Ŧးကို ထည့á€ēသá€Ŋငá€ēးပá€Ģ။
အခá€ŧá€Ŧးပရေá€Ŧဂá€ģကá€ēမá€ģá€Ŧးရှိ ဖá€ŧေရှငá€ēးခá€ģကá€ēမá€ģá€Ŧးအá€Ŧး á€’á€ąá€žá€†á€­á€¯á€„á€ēရá€Ŧ စိစစá€ēခá€ŧငá€ēးအပá€ŧငá€ē checksum တစá€ēá€á€¯á€Ąá€á€Ŋကá€ē အလá€Ŋနá€ēá€Ąá€žá€¯á€ļးဝငá€ēပá€Ģသညá€ē။

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <executions>
    <execution>
      <id>install-project</id>
      <!-- Đ•ŅĐģи ҃ Đ˛Đ°Ņ ĐŧĐŊĐžĐŗĐžĐŧĐžĐ´ŅƒĐģҌĐŊŅ‹Đš ĐŋŅ€ĐžĐĩĐēŅ‚ ҁ Đ´ĐĩĐŋĐģĐžĐĩĐŧ Ņ€ĐžĐ´Đ¸Ņ‚ĐĩĐģҌҁĐēĐžĐŗĐž ĐŋĐžĐŧиĐēа -->
      <phase>install</phase>
      <!-- Đ¯Đ˛ĐŊĐž ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°ĐĩĐŧ Ņ„Đ°ĐšĐģŅ‹ Đ´ĐģŅ ĐģĐžĐēаĐģҌĐŊОК ŅƒŅŅ‚Đ°ĐŊОвĐēи -->
      <configuration>
        <file>target/${project.artifactId}-${project.version}.jar</file>
```target/${project.artifactId}-${project.version}-sources.jar</sources>
        <pomFile>dependency-reduced-pom.xml</pomFile>
        <!-- ĐŸŅ€Đ¸ĐŊŅƒĐ´Đ¸Ņ‚ĐĩĐģҌĐŊĐžĐĩ ОйĐŊОвĐģĐĩĐŊиĐĩ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊҋ҅ ĐŋŅ€ĐžĐĩĐēŅ‚Đ° -->
        <updateReleaseInfo>true</updateReleaseInfo>
        <!-- КоĐŊŅ‚Ņ€ĐžĐģҌĐŊŅ‹Đĩ ҁ҃ĐŧĐŧŅ‹ Đ´ĐģŅ ĐŋŅ€ĐžĐ˛ĐĩŅ€Đēи ҆ĐĩĐģĐžŅŅ‚ĐŊĐžŅŅ‚Đ¸ -->
        <createChecksum>true</createChecksum>
      </configuration>
    </execution>
  </executions>
</plugin>

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

maven-javadoc-ပလပá€ēအငá€ē

ပရေá€Ŧဂá€ģကá€ēအတá€Ŋကá€ē javadoc ကိုထုတá€ēလုပá€ēခá€ŧငá€ēး။

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <executions>
    <execution>
      <goals>
        <goal>jar</goal>
      </goals>
      <!-- ГĐĩĐŊĐĩŅ€Đ°Ņ†Đ¸Ņ javadoc Đ´ĐžĐģĐļĐŊа ĐąŅ‹Ņ‚ŅŒ ĐŋĐžŅĐģĐĩ Ņ„Đ°ĐˇŅ‹ ĐŗĐĩĐŊĐĩŅ€Đ°Ņ†Đ¸Đ¸ Ņ€ĐĩŅŅƒŅ€ŅĐžĐ˛ -->
      <phase>prepare-package</phase>
      <configuration>
        <!-- ĐžŅ‡ĐĩĐŊҌ ĐŋĐžĐŧĐžĐŗĐ°ĐĩŅ‚ в ĐŋŅƒĐąĐģĐ¸Ņ‡ĐŊҋ҅ ĐŋŅ€ĐžĐĩĐēŅ‚Đ°Ņ… -->
        <failOnError>true</failOnError>
        <failOnWarnings>true</failOnWarnings>
        <!-- ĐŖĐąĐ¸Ņ€Đ°ĐĩŅ‚ ĐžŅˆĐ¸ĐąĐē҃ ĐŋĐžĐ¸ŅĐēа Đ´ĐžĐē҃ĐŧĐĩĐŊŅ‚Đ°Ņ†Đ¸Đ¸ в target Đ´Đ¸Ņ€ĐĩĐēŅ‚ĐžŅ€Đ¸Đ¸ -->
        <detectOfflineLinks>false</detectOfflineLinks>
      </configuration>
    </execution>
  </executions>
</plugin>

သင့á€ēတá€Ŋငá€ē java မပá€Ģဝငá€ēသည့á€ē module တစá€ēခုရသိပá€Ģက (á€Ĩပမá€Ŧ အရငá€ēးအမá€ŧစá€ēမá€ģá€Ŧးသá€Ŧ)
ဒá€Ģမသမဟုတá€ē မူအရ javadoc ကို မဖနá€ēတီးခá€ģငá€ēဘူးဆိုရငá€ē ကူညဎလိုကá€ēပá€Ģ။ maven-jar-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <executions>
    <execution>
      <id>empty-javadoc-jar</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>jar</goal>
      </goals>
      <configuration>
        <classifier>javadoc</classifier>
        <classesDirectory>${basedir}/javadoc</classesDirectory>
      </configuration>
    </execution>
  </executions>
</plugin>

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

maven-gpg-plugin

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <!-- ĐĄĐąĐžŅ€Đēа ĐąŅƒĐ´ĐĩŅ‚ ĐŋĐ°Đ´Đ°Ņ‚ŅŒ, ĐĩҁĐģи ĐžŅ‚ŅŅƒŅ‚ŅŅ‚Đ˛ŅƒĐĩŅ‚ GPG ĐēĐģŅŽŅ‡ -->
      <!-- ПодĐŋĐ¸ŅŅ‹Đ˛Đ°ĐĩĐŧ Đ°Ņ€Ņ‚ĐĩŅ„Đ°Đē҂ҋ Ņ‚ĐžĐģҌĐēĐž ĐŊа Ņ„Đ°ĐˇĐĩ deploy -->
      <phase>deploy</phase>
      <goals>
        <goal>sign</goal>
      </goals>
    </execution>
  </executions>
</plugin>

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

nexus-staging-maven-plugin

ဖá€Ŋဲ့စညá€ēးမသု-

<project>
  <!-- ... -->
  <build>
    <plugins>
      <!-- ... -->
      <plugin>
        <groupId>org.sonatype.plugins</groupId>
        <artifactId>nexus-staging-maven-plugin</artifactId>
      </plugin>
    </plugins>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.sonatype.plugins</groupId>
          <artifactId>nexus-staging-maven-plugin</artifactId>
          <extensions>true</extensions>
          <configuration>
            <serverId>sonatype</serverId>
            <nexusUrl>https://oss.sonatype.org/</nexusUrl>
            <!-- ОбĐŊОвĐģŅĐĩĐŧ ĐŧĐĩŅ‚Đ°Đ´Đ°ĐŊĐŊŅ‹Đĩ, Ņ‡Ņ‚ĐžĐąŅ‹ ĐŋĐžĐŧĐĩŅ‚Đ¸Ņ‚ŅŒ Đ°Ņ€Ņ‚ĐĩŅ„Đ°ĐēŅ‚ ĐēаĐē release -->
            <!-- НĐĩ вĐģĐ¸ŅĐĩŅ‚ ĐŊа snapshot вĐĩŅ€ŅĐ¸Đ¸ -->
            <updateReleaseInfo>true</updateReleaseInfo>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-deploy-plugin</artifactId>
          <configuration>
            <!-- ĐžŅ‚ĐēĐģŅŽŅ‡Đ°ĐĩĐŧ ĐŋĐģĐ°ĐŗĐ¸ĐŊ -->
            <skip>true</skip>
          </configuration>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
  <distributionManagement>
    <snapshotRepository>
      <id>sonatype</id>
      <name>Nexus Snapshot Repository</name>
      <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
    </snapshotRepository>
    <repository>
      <id>sonatype</id>
      <name>Nexus Release Repository</name>
      <url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
    </repository>
  </distributionManagement>
</project>

သင့á€ēတá€Ŋငá€ē multi-module ပရေá€Ŧဂá€ģကá€ēတစá€ēခုရသိ၍ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēခနá€ēá€¸á€žá€­á€¯á€ˇ သီးခá€ŧá€Ŧး module တစá€ēခုကို အပá€ēလုဒá€ēလုပá€ēရနá€ē á€™á€œá€­á€¯á€Ąá€•á€ēပá€Ģက၊ သငá€ēထည့á€ēရနá€ē á€œá€­á€¯á€Ąá€•á€ēပá€Ģသညá€ē။ nexus-staging-maven-plugin အလá€ļနှင့á€ēအတူ skipNexusStagingDeployMojo

<build>
  <plugins>
    <plugin>
      <groupId>org.sonatype.plugins</groupId>
      <artifactId>nexus-staging-maven-plugin</artifactId>
      <configuration>
        <skipNexusStagingDeployMojo>true</skipNexusStagingDeployMojo>
      </configuration>
    </plugin>
  </plugins>
</build>

ဒေá€Ģငá€ēးလုဒá€ēလုပá€ēပá€ŧီးနေá€Ŧကá€ē၊ လá€ģှပá€ēတစá€ēပá€ŧကá€ēရိုကá€ēခá€ģကá€ē/ထုတá€ēá€á€ąá€™á€žá€¯á€—á€Ŧးရှငá€ēးမá€ģá€Ŧးတá€Ŋငá€ē ရနိုငá€ēပá€Ģသညá€ē။ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရုá€ļမá€ģá€Ŧး

<repositories>
  <repository>
    <id>SonatypeNexus</id>
    <url>https://oss.sonatype.org/content/groups/staging/</url>
    <!-- НĐĩ ĐŊадО ҃ĐēĐ°ĐˇŅ‹Đ˛Đ°Ņ‚ŅŒ Ņ„ĐģĐ°ĐŗĐ¸ snapshot/release Đ´ĐģŅ Ņ€ĐĩĐŋĐžĐˇĐ¸Ņ‚ĐžŅ€Đ¸Ņ -->
  </repository>
</repositories>

á€•á€­á€¯á€Ąá€Ŧးသá€Ŧခá€ģကá€ēမá€ģá€Ŧး

  • nexus repository နှင့á€ē á€Ąá€œá€¯á€•á€ēလုပá€ēရနá€ēအတá€Ŋကá€ē အလá€Ŋနá€ēကá€ŧá€Ŋယá€ēဝသေá€Ŧ ပနá€ēးတိုငá€ēမá€ģá€Ŧးစá€Ŧရငá€ēး (mvn help:describe -Dplugin=org.sonatype.plugins:nexus-staging-maven-plugin).
  • maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēတငá€ēခá€ŧငá€ēးအတá€Ŋကá€ē á€Ąá€œá€­á€¯á€Ąá€œá€ģေá€Ŧကá€ēထုတá€ēလá€Ŋှတá€ēမသုကို စစá€ēဆေးပá€Ģ။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

ရလဒá€ē

SNAPSHOT ဗá€Ŧးရှငá€ēးကို ထုတá€ēဝေခá€ŧငá€ēး။

ပရေá€Ŧဂá€ģကá€ēတစá€ēခုတညá€ēဆေá€Ŧကá€ēသေá€Ŧအခá€Ģ၊ SNAPSHOT ဗá€Ŧးရှငá€ēးကို ခá€ģိတá€ēဆကá€ēရနá€ēအတá€Ŋကá€ē လုပá€ēဆေá€Ŧငá€ēစရá€Ŧတစá€ēခုကို ကိုယá€ēတိုငá€ēစတငá€ēလုပá€ēဆေá€Ŧငá€ēနိုငá€ēသညá€ē။

java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

ဤလုပá€ēငနá€ēးကို စတငá€ēသေá€Ŧအခá€Ģ၊ ဖá€ŧန့á€ēကá€ģကá€ēပရေá€Ŧဂá€ģကá€ēရှိ သကá€ēဆိုငá€ēသည့á€ēတá€Ŧဝနá€ēကို အစပá€ģိုးသညá€ē (နမူနá€Ŧ).

ဖá€ŧတá€ēတေá€Ŧကá€ēထá€Ŧးသေá€Ŧ မှတá€ēတမá€ēး

Running with gitlab-runner 11.10.0 (3001a600)
  on Deploy runner JSKWyxUw
Using Shell executor...
Running on ih1174328.vds.myihor.ru...
Skipping Git repository setup
Skipping Git checkout
Skipping Git submodules setup
$ rm -rf .* *
$ git config --global credential.helper store
$ echo "https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com" >> ~/.git-credentials
$ git clone ${DEPLOY_CI_REPOSITORY_URL} .
Cloning into 'shields4j'...
$ git checkout ${DEPLOY_CI_COMMIT_SHA}
Note: checking out '850f86aa317194395c5387790da1350e437125a7'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
  git checkout -b new_branch_name
HEAD is now at 850f86a... skip deploy test-core
$ for pom in $(find . -name pom.xml); do # collapsed multi-line command
$ if [[ "${DEPLOY_CI_COMMIT_TAG}" != "" ]]; then # collapsed multi-line command
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0                                           [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:2.5:set (default-cli) @ shields4j-parent ---
[INFO] Searching for local aggregator root...
[INFO] Local aggregation root: /home/gitlab-deployer/JSKWyxUw/0/TouchBIT/deploy/shields4j
[INFO] Processing change of org.touchbit.shields4j:shields4j-parent:1.0.0 -> 1.0.0-SNAPSHOT
[INFO] Processing org.touchbit.shields4j:shields4j-parent
[INFO]     Updating project org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:client
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:test-core
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] Processing org.touchbit.shields4j:testng
[INFO]     Updating parent org.touchbit.shields4j:shields4j-parent
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:client
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO]     Updating dependency org.touchbit.shields4j:test-core
[INFO]         from version 1.0.0 to 1.0.0-SNAPSHOT
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  0.992 s]
[INFO] test-core .......................................... SKIPPED
[INFO] Shields4J client ................................... SKIPPED
[INFO] TestNG listener 1.0.0 .............................. SKIPPED
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.483 s
[INFO] Finished at: 2019-04-21T02:40:42+03:00
[INFO] ------------------------------------------------------------------------
$ mvn clean deploy -DskipTests=${SKIP_TESTS}
[INFO] Scanning for projects...
[INFO] Inspecting build with total of 4 modules...
[INFO] Installing Nexus Staging features:
[INFO]   ... total of 4 executions of maven-deploy-plugin replaced with nexus-staging-maven-plugin
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO] 
[INFO] Shields4J                                                          [pom]
[INFO] test-core                                                          [jar]
[INFO] Shields4J client                                                   [jar]
[INFO] TestNG listener                                                    [jar]
[INFO] 
[INFO] --------------< org.touchbit.shields4j:shields4j-parent >---------------
[INFO] Building Shields4J 1.0.0-SNAPSHOT                                  [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
...
DELETED
...
[INFO]  * Bulk deploy of locally gathered snapshot artifacts finished.
[INFO] Remote deploy finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0-SNAPSHOT ........................... SUCCESS [  2.375 s]
[INFO] test-core .......................................... SUCCESS [  3.929 s]
[INFO] Shields4J client ................................... SUCCESS [  3.815 s]
[INFO] TestNG listener 1.0.0-SNAPSHOT ..................... SUCCESS [ 36.134 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 47.629 s
[INFO] Finished at: 2019-04-21T02:41:32+03:00
[INFO] ------------------------------------------------------------------------

ရလဒá€ēအနေဖá€ŧင့á€ē၊ ဗá€Ŧးရှငá€ēးကို Nexus တá€Ŋငá€ēတငá€ēထá€Ŧးသညá€ē။ 1.0.0-SNAPSHOT.

လá€ģှပá€ēတစá€ēပá€ŧကá€ē ဗá€Ŧးရှငá€ēးအá€Ŧးလုá€ļးကို ဝဘá€ēဆိုကá€ēရှိ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēမသုမသ ဖá€ģကá€ēနိုငá€ēသညá€ē။ oss.sonatype.org သင့á€ēအကေá€Ŧင့á€ēအေá€Ŧကá€ēတá€Ŋငá€ē။

java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

ထုတá€ēá€á€ąá€™á€žá€¯á€—á€Ŧးရှငá€ēးကို ထုတá€ēဝေခá€ŧငá€ēး။

တဂá€ēကို ထည့á€ēသá€Ŋငá€ēးသေá€Ŧအခá€Ģ၊ ဖá€ŧန့á€ēကá€ģကá€ēပရေá€Ŧဂá€ģကá€ēရှိ သကá€ēဆိုငá€ēရá€Ŧလုပá€ēငနá€ēးတá€Ŧဝနá€ēသညá€ē ဖá€ŧန့á€ēခá€ģိသည့á€ēဗá€Ŧးရှငá€ēးကို nexus á€žá€­á€¯á€ˇá€’á€ąá€Ģငá€ēးလုဒá€ēလုပá€ēရနá€ē á€Ąá€œá€­á€¯á€Ąá€œá€ģေá€Ŧကá€ē အစပá€ģိုးသá€Ŋá€Ŧးသညá€ē (နမူနá€Ŧ).

java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

အကေá€Ŧငá€ēးဆုá€ļá€¸á€Ąá€•á€­á€¯á€„á€ēးမှá€Ŧ အနီးကပá€ēထုတá€ēလá€Ŋှတá€ēမသုသညá€ē ခá€ģိတá€ēဆကá€ēမသုတá€Ŋငá€ē á€Ąá€œá€­á€¯á€Ąá€œá€ģေá€Ŧကá€ē အစပá€ģá€­á€¯á€¸á€”á€ąá€á€ŧငá€ēး ဖá€ŧစá€ēသညá€ē။

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1037".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1037
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1037".
Waiting for operation to complete...
.........
[INFO] Remote staged 1 repositories, finished with success.
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  9.603 s]
[INFO] test-core .......................................... SUCCESS [  3.419 s]
[INFO] Shields4J client ................................... SUCCESS [  9.793 s]
[INFO] TestNG listener 1.0.0 .............................. SUCCESS [01:23 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:47 min
[INFO] Finished at: 2019-04-21T04:05:46+03:00
[INFO] ------------------------------------------------------------------------

တစá€ēခုခုမသá€Ŧးသá€Ŋá€Ŧးရငá€ē á€Ąá€œá€¯á€•á€ēက ကá€ģိနá€ēးသေပá€Ģပဲ။

[INFO] Performing remote staging...
[INFO] 
[INFO]  * Remote staging into staging profile ID "9043b43f77dcc9"
[INFO]  * Created staging repository with ID "orgtouchbit-1038".
[INFO]  * Staging repository at https://oss.sonatype.org:443/service/local/staging/deployByRepositoryId/orgtouchbit-1038
[INFO]  * Uploading locally staged artifacts to profile org.touchbit
[INFO]  * Upload of locally staged artifacts finished.
[INFO]  * Closing staging repository with ID "orgtouchbit-1038".
Waiting for operation to complete...
.......
[ERROR] Rule failure while trying to close staging repository with ID "orgtouchbit-1039".
[ERROR] 
[ERROR] Nexus Staging Rules Failure Report
[ERROR] ==================================
[ERROR] 
[ERROR] Repository "orgtouchbit-1039" failures
[ERROR]   Rule "signature-staging" failures
[ERROR]     * No public key: Key with id: (1f42b618d1cbe1b5) was not able to be located on &lt;a href=http://keys.gnupg.net:11371/&gt;http://keys.gnupg.net:11371/&lt;/a&gt;. Upload your public key and try the operation again.
...
[ERROR] Cleaning up local stage directory after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Deleting context 9043b43f77dcc9.properties
[ERROR] Cleaning up remote stage repositories after a Rule failure during close of staging repositories: [orgtouchbit-1039]
[ERROR]  * Dropping failed staging repository with ID "orgtouchbit-1039" (Rule failure during close of staging repositories: [orgtouchbit-1039]).
[ERROR] Remote staging finished with a failure: Staging rules failure!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] Shields4J 1.0.0 .................................... SUCCESS [  4.073 s]
[INFO] test-core .......................................... SUCCESS [  2.788 s]
[INFO] Shields4J client ................................... SUCCESS [  3.962 s]
[INFO] TestNG listener 1.0.0 .............................. FAILURE [01:07 min]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------

á€‘á€­á€¯á€ˇá€€á€ŧေá€Ŧင့á€ē ကá€ģá€Ŋနá€ēုပá€ēá€á€­á€¯á€ˇá€žá€Šá€ē ရá€Ŋေးခá€ģယá€ēမသုတစá€ēခုသá€Ŧ ကá€ģနá€ēတေá€Ŧ့သညá€ē။ ဤဗá€Ŧးရှငá€ēးကို ဖá€ģကá€ēပစá€ēပá€Ģ á€žá€­á€¯á€ˇá€™á€Ÿá€¯á€á€ē ထုတá€ēဝေမညá€ēလá€Ŧး။

java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

ထုတá€ēဝေပá€ŧီးနေá€Ŧကá€ē အခá€ģိနá€ēအတနá€ēကá€ŧá€Ŧသေá€Ŧအခá€Ģတá€Ŋငá€ē ပစ္စညá€ēးမá€ģá€Ŧး ဝငá€ēလá€Ŧမညá€ēဖá€ŧစá€ēသညá€ē။ java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို maven á€—á€Ÿá€­á€¯á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēလုပá€ēရနá€ē GitLab CI ကို စနစá€ēထည့á€ēသá€Ŋငá€ēးခá€ŧငá€ēး။

ပá€ŧငá€ēပအကá€ŧေá€Ŧငá€ēးအရá€Ŧ

maven သညá€ē အခá€ŧá€Ŧးသေá€Ŧ အမá€ģá€Ŧးသူငှá€Ŧ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရá€Ŧမá€ģá€Ŧးကို အညá€Ŋှနá€ēးကိနá€ēးမá€ģá€Ŧး ပá€ŧုလုပá€ēပေးသေá€Ŧ ရှá€Ŧဖá€Ŋေတá€Ŋá€ąá€ˇá€›á€žá€­á€™á€žá€¯á€á€…á€ēခုဖá€ŧစá€ēသညá€ē။
၎ငá€ēးသညá€ē ကá€ģá€Ŋနá€ēုပá€ē၏ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēá€™á€žá€¯á€Ÿá€ąá€Ŧငá€ēးကို ညá€Ŋှနá€ēးထá€Ŧးသေá€Ŧကá€ŧေá€Ŧင့á€ē robots.txt ကို ထည့á€ēခဲ့ရသညá€ē။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

ကေá€Ŧကá€ēခá€ģကá€ē

ငá€Ģá€á€­á€¯á€ˇá€™á€žá€Ŧ ဘá€Ŧရှိလဲ။

  • ဖá€Ŋá€ļ့ဖá€ŧိုးတိုးတကá€ēမသုဘá€Ŧသá€Ŧစကá€Ŧးအမá€ģိုးမá€ģá€­á€¯á€¸á€Ąá€á€Ŋကá€ē artifacts မá€ģá€Ŧးကို အမá€ģá€Ŧးသူငှá€Ŧ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရá€Ŧမá€ģá€Ŧá€¸á€žá€­á€¯á€ˇ အပá€ēလုဒá€ēတငá€ēရနá€ēအတá€Ŋကá€ē CI လုပá€ēငနá€ēးမá€ģá€Ŧးစá€Ŋá€Ŧကို သငá€ēအကေá€Ŧငá€ēအထညá€ēဖေá€Ŧá€ēနိုငá€ēသည့á€ē သီးခá€ŧá€Ŧá€¸á€Ąá€žá€¯á€ļးခá€ģပရေá€Ŧဂá€ģကá€ēတစá€ēခု။
  • Deploy ပရေá€Ŧဂá€ģကá€ēကို ပá€ŧငá€ēပဝငá€ēရေá€Ŧကá€ēစá€Ŋကá€ēဖကá€ēမသုမသ သီးခá€ŧá€Ŧးခá€Ŋá€˛á€‘á€¯á€á€ēထá€Ŧးပá€ŧီး ပိုငá€ēရှငá€ēနှင့á€ē ထိနá€ēးသိမá€ēးသူ အခနá€ēးကဏ္ဍမá€ģá€Ŧးဖá€ŧင့á€ē á€Ąá€žá€¯á€ļးပá€ŧုသူမá€ģá€Ŧးသá€Ŧ ပá€ŧေá€Ŧငá€ēá€¸á€œá€˛á€”á€­á€¯á€„á€ēသညá€ē။
  • လုပá€ēဆေá€Ŧငá€ēစရá€Ŧမá€ģá€Ŧးကို á€Ąá€žá€¯á€ļးခá€ģရနá€ēအတá€Ŋကá€ēသá€Ŧ လုပá€ēဆေá€Ŧငá€ēရနá€ē "hot" cache ပá€Ģသေá€Ŧ သီးခá€ŧá€Ŧး သီးခá€ŧá€Ŧး Runner တစá€ēခု။
  • အမá€ģá€Ŧးသူငှá€Ŧ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēမသုတá€Ŋငá€ē လá€ģှပá€ēတစá€ēပá€ŧကá€ēရိုကá€ēခá€ģကá€ē/ထုတá€ēá€á€ąá€™á€žá€¯á€—á€Ŧးရှငá€ēးမá€ģá€Ŧးကို ထုတá€ēဝေခá€ŧငá€ēး။
  • maven Central တá€Ŋငá€ē ထုတá€ēဝေရနá€ē အဆငá€ēသင့á€ēဖá€ŧစá€ēမသု အတá€Ŋကá€ē ထá€Ŋကá€ēရှိသည့á€ēဗá€Ŧးရှငá€ēးကို á€Ąá€œá€­á€¯á€Ąá€œá€ģေá€Ŧကá€ēစစá€ēဆေးပá€Ģ။
  • maven အလယá€ēပိုငá€ēးရှိ "ကá€ŧမá€ēး" ဗá€Ŧးရှငá€ēးမá€ģá€Ŧá€¸á€Ąá€œá€­á€¯á€Ąá€œá€ģေá€Ŧကá€ēထုတá€ēဝေခá€ŧငá€ēးမှကá€Ŧကá€Ŋယá€ēမသု။
  • လá€ģှပá€ēတစá€ēပá€ŧကá€ē ဗá€Ŧးရှငá€ēးမá€ģá€Ŧးကို "ကလစá€ēနှိပá€ēပá€Ģ" ကို တညá€ēဆေá€Ŧကá€ēပá€ŧီး ထုတá€ēဝေပá€Ģ။
  • လá€ģှပá€ēတစá€ēပá€ŧကá€ēရိုကá€ēခá€ģကá€ē/ထုတá€ēလá€Ŋှတá€ēမသုဗá€Ŧးရှငá€ēးမá€ģá€Ŧးရယူရနá€ēအတá€Ŋကá€ē တစá€ēခုတညá€ēးသေá€Ŧ á€žá€­á€¯á€œá€žá€ąá€Ŧငá€ēရုá€ļ။
  • Java ပရေá€Ŧဂá€ģကá€ēတစá€ēခုကို တညá€ēဆေá€Ŧကá€ēခá€ŧငá€ēး/စမá€ēးသပá€ēခá€ŧငá€ēး/ထုတá€ēဝေခá€ŧငá€ēးအတá€Ŋကá€ē အထá€Ŋေထá€Ŋá€ąá€•á€­á€¯á€€á€ēလိုငá€ēး။

GitLab CI ကို စတငá€ēသတá€ēမှတá€ēခá€ŧငá€ēးသညá€ē ပထမတစá€ēခá€ģကá€ēတá€Ŋငá€ē ထငá€ēထá€Ŧးသည့á€ēá€Ąá€á€­á€¯á€„á€ēး ရသုပá€ēထá€Ŋေးသေá€Ŧအကá€ŧေá€Ŧငá€ēးအရá€Ŧမဟုတá€ēပá€Ģ။ turn-key အခá€ŧေခá€ļဖá€ŧင့á€ē CI ကို နှစá€ēကá€ŧိမá€ēသတá€ēမှတá€ēရနá€ē လုá€ļလေá€Ŧကá€ēပá€ŧီ၊ ယခု သငá€ēသညá€ē ဤကိစ္စအတá€Ŋကá€ē အပá€ģေá€Ŧá€ēတမá€ēးနှင့á€ē ဝေးကá€Ŋá€Ŧနေပá€Ģသညá€ē။ á€‘á€­á€¯á€ˇá€Ąá€•á€ŧငá€ē၊ GitLab စá€Ŧရá€Ŋကá€ēစá€Ŧတမá€ēးသညá€ēအလá€Ŋနá€ēá€™á€œá€­á€¯á€Ąá€•á€ēတေá€Ŧ့ပá€Ģ။ ပထမခá€ŧေလှမá€ēးကိုလသမá€ēá€¸á€–á€­á€¯á€ˇ မကá€ŧေá€Ŧကá€ēပá€Ģနဲ့။ လမá€ēးသညá€ē လမá€ēးလá€ģှေá€Ŧကá€ēနေသူ၏ ခá€ŧေလှမá€ēးမá€ģá€Ŧးအေá€Ŧကá€ēတá€Ŋငá€ē ပေá€Ģá€ēလá€Ŧသညá€ē (ဘယá€ēသူပá€ŧေá€Ŧလဲ မမှတá€ēမိတေá€Ŧ့ပá€Ģ။ :)

တုá€ļ့ပá€ŧနá€ēခá€ģကá€ēá€›á€œá€­á€¯á€ˇ ဝမá€ēးသá€Ŧပá€Ģတယá€ē။

လá€Ŧမည့á€ēဆေá€Ŧငá€ēးပá€Ģးတá€Ŋငá€ē သင့á€ēတá€Ŋငá€ē shell runner တစá€ēခုသá€Ŧရှိလá€ģှငá€ē ပေá€Ģငá€ēးစပá€ēစမá€ēးသပá€ēမသုမá€ģá€Ŧးဖá€ŧင့á€ē á€Ąá€œá€¯á€•á€ēမá€ģá€Ŧးကို အပá€ŧိုငá€ēá€Ąá€†á€­á€¯á€„á€ēလုပá€ēဆေá€Ŧငá€ēရနá€ē (docker-compose á€€á€­á€¯á€Ąá€žá€¯á€ļးပá€ŧု၍ စမá€ēးသပá€ēá€™á€žá€¯á€Ąá€ąá€Ŧကá€ēတá€Ŋငá€ē ဝနá€ēဆေá€Ŧငá€ēမသုမá€ģá€Ŧးကို လုပá€ēဆေá€Ŧငá€ēနေသညá€ē) တá€Ŋငá€ē GitLab CI ကို မညá€ēá€žá€­á€¯á€ˇ configure လုပá€ēရမညá€ēကို ဆá€Ŋေးနá€Ŋေးပá€Ģမညá€ē။

အကá€ŧေá€Ŧငá€ēးအရá€Ŧရနá€ē

source: www.habr.com

DDoS ကá€Ŧကá€Ŋယá€ēရေး၊ VPS VDS ဆá€Ŧဗá€Ŧမá€ģá€Ŧးပá€Ģသည့á€ē ဆိုကá€ēမá€ģá€Ŧးအတá€Ŋကá€ē ယုá€ļကá€ŧညá€ēစိတá€ēခá€ģရသေá€Ŧ hosting ကို ဝယá€ēယူပá€Ģ။ đŸ”Ĩ DDoS ကá€Ŧကá€Ŋယá€ēမသု၊ VPS VDS ဆá€Ŧဗá€Ŧမá€ģá€Ŧးပá€Ģရှိသေá€Ŧ ယုá€ļကá€ŧညá€ēစိတá€ēခá€ģရသေá€Ŧ ဝဘá€ēဆိုကá€ē hosting ကို ဝယá€ēယူပá€Ģ | ProHoster