[{"data":1,"prerenderedAt":495},["ShallowReactive",2],{"docs-ci-cd-opmbuild-en":3},{"id":4,"title":5,"body":6,"category":485,"description":486,"draft":487,"extension":488,"meta":489,"navigation":174,"order":490,"path":491,"seo":492,"stem":493,"__hash__":494},"docsEn\u002Fdocs\u002Fci-cd-opmbuild.md","Build .opm in CI\u002FCD with opmbuild",{"type":7,"value":8,"toc":478},"minimark",[9,13,30,35,57,64,68,145,149,427,431,447,451,474],[10,11,5],"h1",{"id":12},"build-opm-in-cicd-with-opmbuild",[14,15,16,20,21,24,25,29],"p",{},[17,18,19],"code",{},"OPM::Maker"," is a standalone Perl CPAN module that provides the ",[17,22,23],{},".opm"," tools ",[26,27,28],"strong",{},"without"," requiring a full OTOBO or Znuny installation. This makes it ideal for CI\u002FCD pipelines.",[31,32,34],"h2",{"id":33},"installation","Installation",[36,37,42],"pre",{"className":38,"code":39,"language":40,"meta":41,"style":41},"language-bash shiki shiki-themes one-dark-pro","cpanm OPM::Maker\n","bash","",[17,43,44],{"__ignoreMap":41},[45,46,49,53],"span",{"class":47,"line":48},"line",1,[45,50,52],{"class":51},"sVbv2","cpanm",[45,54,56],{"class":55},"subq3"," OPM::Maker\n",[14,58,59,60,63],{},"This makes the ",[17,61,62],{},"opmbuild"," command available.",[31,65,67],{"id":66},"commands","Commands",[69,70,71,85],"table",{},[72,73,74],"thead",{},[75,76,77,82],"tr",{},[78,79,81],"th",{"align":80},"left","Command",[78,83,84],{"align":80},"Purpose",[86,87,88,99,109,119,132],"tbody",{},[75,89,90,96],{},[91,92,93],"td",{"align":80},[17,94,95],{},"opmbuild sopmtest MyPackage.sopm",[91,97,98],{"align":80},"Validate manifest XML and structure",[75,100,101,106],{},[91,102,103],{"align":80},[17,104,105],{},"opmbuild filetest MyPackage.sopm",[91,107,108],{"align":80},"Verify file list against files on disk",[75,110,111,116],{},[91,112,113],{"align":80},[17,114,115],{},"opmbuild dependencies MyPackage.sopm",[91,117,118],{"align":80},"List dependencies",[75,120,121,126],{},[91,122,123],{"align":80},[17,124,125],{},"opmbuild build --output dist\u002F MyPackage.sopm",[91,127,128,129,131],{"align":80},"Generate ",[17,130,23],{}," file",[75,133,134,139],{},[91,135,136],{"align":80},[17,137,138],{},"opmbuild index repo\u002F",[91,140,141,142,144],{"align":80},"Create repository index XML for a directory containing ",[17,143,23],{}," files",[31,146,148],{"id":147},"github-actions-example","GitHub Actions Example",[36,150,154],{"className":151,"code":152,"language":153,"meta":41,"style":41},"language-yaml shiki shiki-themes one-dark-pro","name: Build OPM package\n\non:\n  push:\n    tags: ['v*']\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    container: perl:5.40\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Install OPM::Maker\n        run: cpanm --notest OPM::Maker\n\n      - name: Validate manifest\n        run: |\n          opmbuild sopmtest MyPackage.sopm\n          opmbuild filetest MyPackage.sopm\n\n      - name: Build .opm\n        run: opmbuild build --output dist\u002F MyPackage.sopm\n\n      - name: Upload artifact\n        uses: actions\u002Fupload-artifact@v4\n        with:\n          name: opm-package\n          path: dist\u002F*.opm\n","yaml",[17,155,156,169,176,186,194,209,214,222,230,241,252,260,274,279,291,302,307,319,330,336,342,347,359,369,374,386,397,405,416],{"__ignoreMap":41},[45,157,158,162,166],{"class":47,"line":48},[45,159,161],{"class":160},"sVyAn","name",[45,163,165],{"class":164},"sn6KH",": ",[45,167,168],{"class":55},"Build OPM package\n",[45,170,172],{"class":47,"line":171},2,[45,173,175],{"emptyLinePlaceholder":174},true,"\n",[45,177,179,183],{"class":47,"line":178},3,[45,180,182],{"class":181},"sVC51","on",[45,184,185],{"class":164},":\n",[45,187,189,192],{"class":47,"line":188},4,[45,190,191],{"class":160},"  push",[45,193,185],{"class":164},[45,195,197,200,203,206],{"class":47,"line":196},5,[45,198,199],{"class":160},"    tags",[45,201,202],{"class":164},": [",[45,204,205],{"class":55},"'v*'",[45,207,208],{"class":164},"]\n",[45,210,212],{"class":47,"line":211},6,[45,213,175],{"emptyLinePlaceholder":174},[45,215,217,220],{"class":47,"line":216},7,[45,218,219],{"class":160},"jobs",[45,221,185],{"class":164},[45,223,225,228],{"class":47,"line":224},8,[45,226,227],{"class":160},"  build",[45,229,185],{"class":164},[45,231,233,236,238],{"class":47,"line":232},9,[45,234,235],{"class":160},"    runs-on",[45,237,165],{"class":164},[45,239,240],{"class":55},"ubuntu-latest\n",[45,242,244,247,249],{"class":47,"line":243},10,[45,245,246],{"class":160},"    container",[45,248,165],{"class":164},[45,250,251],{"class":55},"perl:5.40\n",[45,253,255,258],{"class":47,"line":254},11,[45,256,257],{"class":160},"    steps",[45,259,185],{"class":164},[45,261,263,266,269,271],{"class":47,"line":262},12,[45,264,265],{"class":164},"      - ",[45,267,268],{"class":160},"uses",[45,270,165],{"class":164},[45,272,273],{"class":55},"actions\u002Fcheckout@v4\n",[45,275,277],{"class":47,"line":276},13,[45,278,175],{"emptyLinePlaceholder":174},[45,280,282,284,286,288],{"class":47,"line":281},14,[45,283,265],{"class":164},[45,285,161],{"class":160},[45,287,165],{"class":164},[45,289,290],{"class":55},"Install OPM::Maker\n",[45,292,294,297,299],{"class":47,"line":293},15,[45,295,296],{"class":160},"        run",[45,298,165],{"class":164},[45,300,301],{"class":55},"cpanm --notest OPM::Maker\n",[45,303,305],{"class":47,"line":304},16,[45,306,175],{"emptyLinePlaceholder":174},[45,308,310,312,314,316],{"class":47,"line":309},17,[45,311,265],{"class":164},[45,313,161],{"class":160},[45,315,165],{"class":164},[45,317,318],{"class":55},"Validate manifest\n",[45,320,322,324,326],{"class":47,"line":321},18,[45,323,296],{"class":160},[45,325,165],{"class":164},[45,327,329],{"class":328},"seHd6","|\n",[45,331,333],{"class":47,"line":332},19,[45,334,335],{"class":55},"          opmbuild sopmtest MyPackage.sopm\n",[45,337,339],{"class":47,"line":338},20,[45,340,341],{"class":55},"          opmbuild filetest MyPackage.sopm\n",[45,343,345],{"class":47,"line":344},21,[45,346,175],{"emptyLinePlaceholder":174},[45,348,350,352,354,356],{"class":47,"line":349},22,[45,351,265],{"class":164},[45,353,161],{"class":160},[45,355,165],{"class":164},[45,357,358],{"class":55},"Build .opm\n",[45,360,362,364,366],{"class":47,"line":361},23,[45,363,296],{"class":160},[45,365,165],{"class":164},[45,367,368],{"class":55},"opmbuild build --output dist\u002F MyPackage.sopm\n",[45,370,372],{"class":47,"line":371},24,[45,373,175],{"emptyLinePlaceholder":174},[45,375,377,379,381,383],{"class":47,"line":376},25,[45,378,265],{"class":164},[45,380,161],{"class":160},[45,382,165],{"class":164},[45,384,385],{"class":55},"Upload artifact\n",[45,387,389,392,394],{"class":47,"line":388},26,[45,390,391],{"class":160},"        uses",[45,393,165],{"class":164},[45,395,396],{"class":55},"actions\u002Fupload-artifact@v4\n",[45,398,400,403],{"class":47,"line":399},27,[45,401,402],{"class":160},"        with",[45,404,185],{"class":164},[45,406,408,411,413],{"class":47,"line":407},28,[45,409,410],{"class":160},"          name",[45,412,165],{"class":164},[45,414,415],{"class":55},"opm-package\n",[45,417,419,422,424],{"class":47,"line":418},29,[45,420,421],{"class":160},"          path",[45,423,165],{"class":164},[45,425,426],{"class":55},"dist\u002F*.opm\n",[31,428,430],{"id":429},"without-a-dedicated-pipeline-the-hub-build-service","Without a Dedicated Pipeline: The Hub Build Service",[14,432,433,434,436,437,440,441,446],{},"Open ITSM Hub optionally provides a stateless service that wraps ",[17,435,62],{}," behind an HTTP API (see ",[17,438,439],{},"backend\u002Fopmbuild-service","). When enabled, the ",[442,443,445],"a",{"href":444},"\u002Ftools\u002Fsopm-validator",".sopm Validator"," and generators perform actual Perl validation on the server side—completely without a local Perl installation.",[31,448,450],{"id":449},"tip-multi-framework-builds","Tip: Multi-Framework Builds",[14,452,453,454,457,458,461,462,465,466,468,469,473],{},"Since a ",[17,455,456],{},".sopm"," file can contain multiple ",[17,459,460],{},"\u003CFramework>"," lines, a ",[26,463,464],{},"single"," build generates an ",[17,467,23],{}," package that can be installed on all declared forks. Check your compatibility beforehand using the ",[442,470,472],{"href":471},"\u002Ftools\u002Fcompatibility-checker","Compatibility Checker",".",[475,476,477],"style",{},"html pre.shiki code .sVbv2, html code.shiki .sVbv2{--shiki-default:#61AFEF}html pre.shiki code .subq3, html code.shiki .subq3{--shiki-default:#98C379}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sVyAn, html code.shiki .sVyAn{--shiki-default:#E06C75}html pre.shiki code .sn6KH, html code.shiki .sn6KH{--shiki-default:#ABB2BF}html pre.shiki code .sVC51, html code.shiki .sVC51{--shiki-default:#D19A66}html pre.shiki code .seHd6, html code.shiki .seHd6{--shiki-default:#C678DD}",{"title":41,"searchDepth":171,"depth":171,"links":479},[480,481,482,483,484],{"id":33,"depth":171,"text":34},{"id":66,"depth":171,"text":67},{"id":147,"depth":171,"text":148},{"id":429,"depth":171,"text":430},{"id":449,"depth":171,"text":450},"Automation","Automate building and testing OTOBO and Znuny packages without a full ticketing system installed — using the CPAN tool OPM::Maker (opmbuild) in GitHub Actions.",false,"md",{},60,"\u002Fdocs\u002Fci-cd-opmbuild",{"title":5,"description":486},"docs\u002Fci-cd-opmbuild","8DiJ4Nz-ztao1NdwVy48gdmjXdD5qsxEYbCyUQdBprY",1787733084152]