10.06.2026
Juris Dabasinskas

Kaip automatizuoti OpenEdge PASOE diegimą su Jenkins?

Komandoms, dirbančioms su Progress OpenEdge programomis, diegimas dažnai vis dar reikalauja rankinių veiksmų, lokalios aplinkos priklausomybių ir pasikartojančių užduočių, kurios atitraukia laiką nuo tikrojo kūrimo darbo. Kai diegimo ciklai tampa greitesni, bent dalies šio proceso automatizavimas padeda padaryti diegimus nuoseklesnius, atsekamus ir mažiau pažeidžiamus žmogiškoms klaidoms.

Šiame blogo įraše apžvelgiame, kaip Jenkins gali būti naudojamas ABL kodui kompiliuoti ir diegti į PASOE egzempliorių, neremiantis Docker sprendimu. Vietoj pilno Kubernetes pagrindu veikiančio modelio, dėmesys skiriamas tiesesnei konfigūracijai, kurioje Jenkins atsiunčia kodą, jį kompiliuoja, nukopijuoja sugeneruotą r-kodą į PASOE egzempliorių ir, jei reikia, paleidžia jį iš naujo.

Tikslas

Šio straipsnio tikslas – pademonstruoti Jenkins pagrindu veikiančią diegimo eigą ABL kodui, veikiančiam PASOE egzemplioriuje. Dėmesys skiriamas pagrindiniams konfigūravimo žingsniams, konvejerio (angl. pipeline) nustatymams ir diegimo logikai, reikalingai šiam procesui automatizuoti esamoje Progress OpenEdge aplinkoje.

Diagrama

Sprendimo apžvalga

Konvejeris (angl. pipeline) susideda iš kelių pagrindinių komponentų:

  1. Programuotojas: programuotojas rašo ABL kodą lokaliai ir nusiunčia jį į nutolusią Git saugyklą, pvz., GitHub.
  2. Git saugykla: Git saugykloje laikomas ABL kodas, r-kodas, Jenkinsfile failas ir kompiliavimo skriptai.
  3. PASOE egzempliorius: PASOE egzempliorius suteikia vykdymo aplinką OpenEdge web programoms.
  4. Jenkins: Jenkins naudojamas kūrimo ir diegimo procesui automatizuoti. Jis atsiunčia kodą iš saugyklos, kompiliuoja ABL kodą, įdiegia sukompiliuotą r-kodą į PASOE egzempliorių ir, jei reikia, paleidžia egzempliorių iš naujo.

Kaip įdiegti Jenkins?

  1. Atsisiųskite Jenkins.war failą. Tai galite atlikti paspausdami šią nuorodą: Download and deploy ir pasirinkdami atsisiųsti universalų (generic) Java paketą.
  2. Paleiskite Jenkins. Atidarykite komandų eilutę savo sistemoje ir įveskite šią komandą: java -jar \jenkinsDirectory\jenkins.war. Žemiau komandų eilutėje atsiradusios eilutės parodys, kad Jenkins paleistas sėkmingai. Jei paleidžiate Jenkins pirmą kartą, jis sugeneruos slaptažodį, kurį turėsite naudoti prisijungdami prie Jenkins per naršyklę.
  3. Atidarykite Jenkins. Atidarykite norimą naršyklę ir eikite į Jenkins naudodami atitinkamą adresą ir prievadą. Jei paleidote Jenkins lokaliai (localhost) su numatytuoju prievadu, adresas bus http://localhost:8080/. Atkreipkite dėmesį, kad localhost čia naudojamas tik kaip pavyzdys, nes standartinė praktika dažniausiai numato Jenkins talpinimą dedikuotame serveryje ar kitame serveryje.
  4. Susikurkite paskyrą. Pirmą kartą atidarius Jenkins, reikės susikurti paskyrą, sukuriant naudotojo vardą, kurį naudosite prisijungimui ateityje. Susikūrę paskyrą, pamatysite Jenkins skydelį (dashboard).

Paleidę Jenkins, turėtumėte pamatyti kažką panašaus į tai:

Jenkins skydelio vaizdas:

Konvejerio parengimas

Prieš sukuriant patį konvejerį, buvo atlikti šie žingsniai:

  1. sukurtas PASOE egzempliorius;
  2. parašytas pavyzdinis ABL kodas;
  3. paruošta nutolusi Git saugykla;
  4. sukurtas SSH raktas saugiai prieigai prie saugyklos.

PASOE egzemplioriaus sukūrimas

Šiam straipsniui PASOE egzempliorius, pavadintas oepasTest3, buvo sukurtas atliekant šiuos žingsnius:

  1. Paleidžiant Admin serverį naudojant komandą:
proadsv --start. 
  1. Sukuriant pačią egzempliorių paleidžiant komandą:
pasman create -p (HTTP prievadas egzemplioriui) -s (SSL prievadas) -N (egzemplioriaus pavadinimas) -v -f (aplankas ar kelias PASOE vietai)

Šiam straipsniui naudota komanda atrodė taip:

pasman create -p 9910 -p 9911 -s 9912 -N oepasTest3 -v -f oepasTest3
  1. Pasirinktinai paleidžiant egzempliorių naudojant:

pasman run (egzemplioriaus pavadinimas)

Pavyzdinio ABL kodo rašymas

Šiam straipsniui buvo naudotas paprastas ABL kodas.

Žemiau pateikta pagrindinė pavyzdinė procedūra:

procedure DemoProc: 
  define buffer bEmployee for Employee. 

  define input parameter  cPosition     as character. 

  define output parameter cEmpFirstName as character. 
  define output parameter cEmpLastName  as character. 

  find first bEmployee no-lock where 
             bEmployee.Position = cPosition no-error. 

  if not available bEmployee then 
  do: 
    message "There is no such Employee". 
    assign 
      cEmpFirstName = "" 
      cEmpLastName  = "". 
  end. 

  cEmpFirstName = bEmployee.FirstName. 
  cEmpLastName  = bEmployee.LastName. 

end. 

Taip pat buvo sukurtas compile.p failas, skirtas kodui kompiliuoti CI/CD konvejeryje ir sugeneruoti r-kodo failus.

os-create-dir value("rcode"). 
def var cfile as character no-undo. 
def var cfull as character no-undo. 
cfull = "src". 
input from os-dir(cfull). 
repeat: 
  import cfile. 
  if cfile matches "*.p" then 
    compile value(cfull + "\" + cfile) save into "rcode". 
end. 

input close. 

os-create-dir value("tests/rcode"). 
cfull = "tests".  

input from os-dir(cfull). 
repeat: 
  import cfile. 
  if cfile matches "*.p" or cfile matches "*.cls" then 
      compile value(cfull + "\" + cfile) save into "tests/rcode". 
end. 

input close. 

Git saugyklos ir SSH rakto paruošimas

Kad šis nustatymas veiktų, kompiuteryje buvo sukurtas SSH raktas ir pridėtas į Git saugyklą.

SSH raktai užtikrina saugų būdą autentifikuoti kompiuterį Git saugykloje, nereikalaujant kaskart iš naujo įvesti naudotojo vardo ir slaptažodžio. SSH raktą sudaro dvi kriptografinės raktų dalys:

  • privatusis raktas, kuris išlieka lokalioje sistemoje;
  • viešasis raktas, kuris pridedamas į Git saugyklą.

Šiame straipsnyje GitHub buvo naudojamas kaip nutolusi Git paslauga. Tačiau galima naudoti bet kurį tiekėją, kuris palaiko SSH autentifikaciją.

Kai bandote prisijungti prie GitHub, sistema patikrina, ar viešasis raktas GitHub aplinkoje ir privatusis raktas jūsų kompiuteryje sudaro tinkamą porą. Jei taip, ryšys autentifikuojamas saugiai.

SSH rakto sukūrimas ir pridėjimas:

  1. Atidarykite komandų eilutę.
  2. Naudokite komandą ssh-keygen.
  3. Buvo sugeneruoti du failai – vienas standartinio failo tipo, kitas .old tipo (kai kuriuose dokumentacijos šaltiniuose minima, kad failas gali būti .pub).
  4. Savo nutolusios Git talpinimo paslaugos aplinkoje (šiuo atveju GitHub) eikite į atitinkamus paskyros nustatymus (pavyzdžiui, Account → Settings → SSH and GPG keys GitHub aplinkoje) ir sukurkite naują SSH raktą.

Kartu su tuo buvo sukurta nauja saugykla, į kurią buvo nusiųstas aukščiau parodytas kodas.

Jenkins konvejerio sukūrimas

Prieš sukuriant konvejerį, SSH raktas turi būti pridėtas kaip kredencialas (angl. credential) Jenkins aplinkoje. Šį kredencialą Jenkins naudoja prieigai prie saugyklos.

Pridėję kredencialą, sukurkite konvejerį pasirinkdami: New Item → Pipeline.

Konvejerio etapai ir Jenkinsfile

Konvejerio nustatymuose reikia apibrėžti Jenkinsfile failą. Šiame faile aprašomi konvejerio etapai, kuriuos Jenkins vykdys po kodo atsiuntimo iš saugyklos.

Šiam straipsniui naudotas Jenkinsfile buvo parašytas Groovy sintakse.

pipeline { 
  agent any 
  parameters { 
    string(name: 'BRANCH_NAME', defaultValue: 'main', description: 'Git branch to build') 
  } 
  environment { 
    DLC = "C:\\Progress\\OpenEdge" 
    BUILD_DIR = "C:\\Repos\\RepoForJenkins" 
    SRC_DIR = "C:\\Repos\\RepoForJenkins\\src" 
    RCODE_DIR = "C:\\Repos\\RepoForJenkins\\rcode" 
    DB = "C:\\OpenEdge\\WRK\\sports2023" 
  } 
  stages { 
    stage('Checkout') { 
      steps { 
        echo "Checking out source code." 
        git branch: "${params.BRANCH_NAME}", 
        url: '[email protected]:your/repository.git', 
        credentialsId: 'jenkinsId' 
      } 
    } 
    stage('Start Database'){ 
      steps{ 
        bat ''' 
        call "C:\\Progress\\OpenEdge\\bin\\proenv.bat" 
        if %ERRORLEVEL% EQU 0 ( 
          echo Database is NOT running. Starting it... 
          proserve C:\\OpenEdge\\WRK\\sports2023 -pf C:\\OpenEdge\\WRK\\sports2023.pf 
        ) else ( 
          echo Database is already running. Proceeding. 
        ) 
        ''' 
      } 
    } 
    stage('Start PASOE Instance'){ 
      steps{ 
        bat ''' 
        call "C:\\Progress\\OpenEdge\\bin\\proenv.bat" 
        pasman start oepasTest3 
        ''' 
      } 
    } 
    stage('Build') { 
      steps { 
        bat """ 
        call "%DLC%\\bin\\proenv.bat" 
        cd "%BUILD_DIR%" 
        "%DLC%\\bin\\_progres" -b -db "%DB%" -p compile.p 
        """ 
      } 
    } 
    stage('Deploy to PASOE'){ 
      steps{ 
          bat ''' 
              xcopy /E /Y "%RCODE_DIR%\\*.*" "C:\\OpenEdge\\WRK\\oepasTest3\\ablapps\\JenkinsDemonstration\\" 
              ''' 
      } 
    } 
    stage('Restart PASOE Instance') { 
      steps { 
        bat ''' 
            call "C:\\Progress\\OpenEdge\\bin\\proenv.bat" 
            pasman stop oepasTest3 
            pasman start oepasTest3 
        ''' 
      } 
    } 
  } 
  post { 
    success { 
        echo "Deployment completed successfully!" 
    } 
    failure { 
        echo "Deployment failed!" 
    } 

  } 

} 

Konvejerio etapai:

  • Checkout. Atsiunčiama saugykla su ABL kodu. Saugyklai atsiųsti naudojamas kredencialas su SSH raktu.
  • Start Database. Paleidžiama sports2023 duomenų bazė, kurią naudoja ABL kodas.
  • Start PASOE Instance. Paleidžiamas anksčiau sukurtas PASOE egzempliorius.
  • Build. ABL kodas kompiliuojamas, po kompiliavimo sugeneruojami r-kodo failai.
  • Deploy to PASOE. Kadangi šiam pavyzdžiui naudotas ABL kodas yra paprastas (nėra API integracijos ir pan.), į PASOE egzemplioriaus katalogą įdiegti tik r-kodo failai.
  • Restart PASOE Instance. Šis etapas pridėtas daugiausia derinimo (debugging) tikslais, nes PASOE egzemplioriaus terminale galima pamatyti, ar failai buvo tikrai įdiegti.

Konvejerio paleidimas

Jenkins aplinkoje konvejerius galima paleisti automatiškai. Šiame skyriuje GitHub naudojamas kaip Git paslaugos pavyzdys.

Jei tikslas – paleisti kūrimą kiekvieną kartą, kai į saugyklą nusiunčiamas naujas kodas, reikėtų pasirinkti GitHub hook trigger for GITScm polling parinktį. Tam reikalingas webhook (tinklinis kablys) sukonfigūruotas GitHub aplinkoje.

Atkreipkite dėmesį, kad norint, jog webhook veiktų, Jenkins neturėtų veikti lokaliai (localhost). Jei Jenkins veikia lokaliai, gali reikėti trečiosios šalies tuneliavimo įrankio.

GitHub Webhook sukūrimas

Norėdami sukurti webhook, atidarykite saugyklą, eikite į nustatymus ir paspauskite „webhooks“.

Payload URL lauke įveskite jenkinsURL/github-webhook, pasirinkite Content Type kaip application/json. Pasirinkite Just the push event, tuomet Add Webhook.

Žemiau esančiame paveikslėlyje pateiktas GitHub webhook užklausos pavyzdys (paveikslėlio šaltinis).

Kai GitHub siunčia webhook užklausą, ji pateikiama kaip HTTP POST pranešimas su dviem pagrindinėmis dalimis: antrašte (header) ir turiniu (payload).

POST užklausos antraštėje paprastai rasite:

  • Content-Type: dažniausiai nustatytas kaip „application/json“, nurodantis, kad turinys yra JSON formatu.
  • X-Hub-Signature arba X-Hub-Signature-256: antraštė, kurioje yra hash parašas, sugeneruotas naudojant slaptą raktą, leidžiantis gaunančiam serveriui (šiuo atveju – Jenkins) patikrinti, kad turinys atėjo iš GitHub.
  • X-GitHub-Event: ši antraštė nurodo, kuris įvykis sukėlė webhook (pvz., „push“, „pull_request“ ir kt.).
  • Papildomi metaduomenys, tokie kaip naudotojo agento informacija ir unikalus pristatymo ID, padedantys sekti ir spręsti webhook pristatymo problemas.

Payload yra JSON formato turinys, kuriame pateikiama detali informacija apie įvykį. Pavyzdžiui, push įvykio payload turinyje matytumėte:

  • šaką (branch) ar nuorodą (ref), kuri buvo nusiųsta;
  • informaciją apie commit'us, įskaitant commit pranešimus, autoriaus informaciją ir laiko žymas;
  • saugyklos informaciją, tokią kaip saugyklos pavadinimas, URL, savininkas ir t.t.;
  • informaciją apie tai, kas inicijavo siuntimą (pusher).

Jei nenorite, kad užduotis būtų paleidžiama po kiekvieno siuntimo, alternatyva – naudoti Build periodically trigerį, kuris atsiunčia naujausią kodą iš saugyklos ir jį kompiliuoja pagal konkretų suplanuotą laiką, kuris Jenkins aplinkoje rašomas cron sintakse.

Žemiau pateiktas Jenkins konvejerio kūrimo grafiko pavyzdys. Šiuo atveju grafikas reiškia: kūrimas vykdomas kartą per valandą, skirtingais intervalais.

Konvejeris dabar pilnai sukonfigūruotas ir vyks pagal nurodytą grafiką. Aukščiau pateiktame pavyzdyje jis nustatytas vykdomas kas valandą.

Papildomos konvejerio galimybės

Nors dabartinis konvejeris daugiausia orientuotas į ABL kodo kūrimą ir diegimą į PASOE egzempliorių, verta apsvarstyti ir kitas konvejerio konfigūracijas tvirtesnei CI/CD sistemai:

  • Syntax Check Pipeline: paleidžia ABL kompiliatorių, siekiant įsitikinti, kad kodas kompiliuojasi teisingai, be klaidų.
  • Unit Test Pipeline: vykdo vienetų testus (angl. unit tests), dažniausiai naudojant tokį įrankį kaip ABLUnit, atskirų komponentų funkcionalumui patikrinti.
  • Static Analysis Pipeline: naudoja įrankius, tokius kaip SonarLint/SonarQube, kodo kokybei patikrinti ir kodavimo standartams įgyvendinti.
  • Integration Pipeline: automatizuoja sukompiliuotų artefaktų (angl. build artifacts) diegimą į PASOE egzempliorių. Gali apimti integracijos testus, patikrinančius sklandų diegtos programos veikimą vykdymo aplinkoje.

Rezultatai

Šio straipsnio pagrindiniai rezultatai:

  • automatizuotas kūrimo konvejeris naudojant Jenkins;
  • atnaujintas PASOE egzempliorius;
  • sukompiliuoti ir įdiegti kūrimo artefaktai;
  • mažiau pasikartojančių rankinių užduočių programuotojams;
  • nuoseklesnis kūrimo ir diegimo procesas;
  • sumažėjusi rankinio diegimo klaidų rizika.

Kadangi šis straipsnis apima tik dalį platesnio Kubernetes diegimo modelio, pristatyto originalioje PUG Challenge sesijoje, galimas kitas žingsnis būtų įgyvendinti visą modelį.

Iššūkiai

PASOE ir ABL nėra natūraliai palaikomi Jenkins aplinkoje, ir nėra oficialių Jenkins papildinių (plugins) tokio tipo konfigūracijai. Todėl kompiliavimą ir diegimą reikia įgyvendinti per pasirinktinius (custom) skriptus.

Kitas iššūkis – šioje konfigūracijoje nenaudojamas Docker, todėl konvejeris stipriai priklauso nuo lokalios aplinkos. Tai gali padaryti konfigūraciją jautresnę konkrečios sistemos keliams, įdiegtoms versijoms ir lokalioms priklausomybėms.

Kaip padaryti PASOE diegimą pakartojamą?

Šis blogo įrašas parodo, kad Jenkins gali padėti automatizuoti PASOE diegimą net ir be Docker ar pilnai konteinerizuotos (containerised) konfigūracijos. Sujungus Jenkins su Git saugykla, kompiliavimo skriptais ir PASOE egzemplioriumi, komandos gali sumažinti rankinį darbą ir padaryti ABL kodo diegimą nuoseklesnį.

Nors šis sprendimas tebepriklauso nuo lokalios aplinkos ir pasirinktinių skriptų, jis gali būti naudingas pradinis žingsnis komandoms, norinčioms įvesti daugiau struktūros į savo OpenEdge CI/CD procesą, prieš pereinant prie platesnio Kubernetes ar GitOps modelio.

Norite automatizuoti OpenEdge diegimus? „Baltic Amadeus“ padės sukurti patikimesnį CI/CD procesą OpenEdge ir PASOE programoms. Susisiekite su mūsų komanda.

Dažniausiai užduodami klausimai

Kaip Jenkins automatizuoja OpenEdge PASOE diegimą?

Jenkins atsiunčia ABL kodą iš Git saugyklos, jį kompiliuoja, sugeneruoja r-kodo failus, nukopijuoja juos į PASOE egzempliorių ir, jei reikia, paleidžia egzempliorių iš naujo – visa tai be Docker.

Ar šiam sprendimui reikalingas Docker?

Ne. Šis konvejeris veikia tiesiogiai per lokalią aplinką, nenaudojant Docker ar konteinerizuoto modelio, tačiau dėl to konfigūracija labiau priklauso nuo konkrečios sistemos nustatymų.

Kas yra Jenkinsfile?

Jenkinsfile – failas, parašytas Groovy sintakse, kuriame aprašomi konvejerio etapai: kodo atsiuntimas, duomenų bazės ir PASOE egzemplioriaus paleidimas, kompiliavimas, diegimas ir egzemplioriaus paleidimas iš naujo.

Kaip paleisti Jenkins konvejerį automatiškai?

Naudojant GitHub webhook, konvejeris paleidžiamas automatiškai po kiekvieno kodo siuntimo į saugyklą. Alternatyviai galima naudoti Build periodically trigerį su cron sintakse, vykdantį kūrimą pagal nustatytą grafiką.

Pasikalbėkime apie jūsų projektą

Pradedate projektą arba norite sustiprinti jau vykdomą? Susisiekite ir atsakysime jums per vieną darbo dieną.

Parašykite mums

Ačiū! Jūsų pateikimas gautas!
Oi! Pateikiant formą kažkas nutiko.