[{"data":1,"prerenderedAt":10526},["Reactive",2],{"posts":3},[4,1685,3515,4702,5624,6587,8052,9586],{"_path":5,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9,"description":8,"labels":10,"datetime":15,"date":16,"author":17,"coverImage":22,"category":23,"readingTime":26,"body":31,"_type":1680,"_id":1681,"_source":1682,"_file":1683,"_extension":1684},"/resources/tutorials/gitea-mcp-server","tutorials",false,"","Gitea MCP Server: A New Paradigm for AI-Driven Code Collaboration",[11,12,13,14],"gitea","mcp","LLM","integration","2025-04-01T04:54:24.000Z","2025-03-31",{"name":18,"href":19,"imageUrl":20,"role":21},"Lunny Xiao","https://gitea.com/lunny","https://gitea.com/lunny.png","author","/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/architecture.png",{"title":24,"href":25},"Integration","/resources/tutorials?category=integration",{"text":27,"minutes":28,"time":29,"words":30},"3 min read",2.365,141900,473,{"type":32,"children":33,"toc":1656},"root",[34,43,49,56,61,81,87,131,137,143,190,196,203,214,220,353,359,364,370,375,549,555,560,569,644,652,726,732,810,816,822,927,933,938,1434,1440,1446,1464,1470,1488,1494,1512,1518,1599,1605,1630,1636,1650],{"type":35,"tag":36,"props":37,"children":39},"element","h2",{"id":38},"introduction",[40],{"type":41,"value":42},"text","Introduction",{"type":35,"tag":44,"props":45,"children":46},"p",{},[47],{"type":41,"value":48},"Gitea MCP Server is a revolutionary tool that enables developers to interact with Gitea repositories using natural language through the implementation of the Model Context Protocol (MCP).",{"type":35,"tag":50,"props":51,"children":53},"h3",{"id":52},"what-is-mcp",[54],{"type":41,"value":55},"What is MCP?",{"type":35,"tag":44,"props":57,"children":58},{},[59],{"type":41,"value":60},"MCP (Model Context Protocol) is a groundbreaking open protocol that provides a unified standard for applications to interact with Large Language Models (LLMs). It's analogous to a USB-C interface for the AI world:",{"type":35,"tag":62,"props":63,"children":64},"ul",{},[65,71,76],{"type":35,"tag":66,"props":67,"children":68},"li",{},[69],{"type":41,"value":70},"Standardized communication interface",{"type":35,"tag":66,"props":72,"children":73},{},[74],{"type":41,"value":75},"Seamless integration with various data sources and tools",{"type":35,"tag":66,"props":77,"children":78},{},[79],{"type":41,"value":80},"Simplified AI application development workflow",{"type":35,"tag":50,"props":82,"children":84},{"id":83},"core-advantages",[85],{"type":41,"value":86},"Core Advantages",{"type":35,"tag":62,"props":88,"children":89},{},[90,101,111,121],{"type":35,"tag":66,"props":91,"children":92},{},[93,99],{"type":35,"tag":94,"props":95,"children":96},"strong",{},[97],{"type":41,"value":98},"Natural Language Interaction",{"type":41,"value":100},": Complete repository operations using everyday language",{"type":35,"tag":66,"props":102,"children":103},{},[104,109],{"type":35,"tag":94,"props":105,"children":106},{},[107],{"type":41,"value":108},"Intelligent Workflow",{"type":41,"value":110},": Automate repetitive tasks to enhance development efficiency",{"type":35,"tag":66,"props":112,"children":113},{},[114,119],{"type":35,"tag":94,"props":115,"children":116},{},[117],{"type":41,"value":118},"Seamless Integration",{"type":41,"value":120},": Perfect integration with existing Gitea environments",{"type":35,"tag":66,"props":122,"children":123},{},[124,129],{"type":35,"tag":94,"props":125,"children":126},{},[127],{"type":41,"value":128},"Open Standard",{"type":41,"value":130},": Based on MCP protocol, ensuring interoperability and extensibility",{"type":35,"tag":36,"props":132,"children":134},{"id":133},"quick-start",[135],{"type":41,"value":136},"Quick Start",{"type":35,"tag":50,"props":138,"children":140},{"id":139},"system-requirements",[141],{"type":41,"value":142},"System Requirements",{"type":35,"tag":62,"props":144,"children":145},{},[146,151,172],{"type":35,"tag":66,"props":147,"children":148},{},[149],{"type":41,"value":150},"Gitea instance with valid access token",{"type":35,"tag":66,"props":152,"children":153},{},[154,156],{"type":41,"value":155},"MCP protocol compatible client (e.g., Cursor, Claude)\n",{"type":35,"tag":62,"props":157,"children":158},{},[159],{"type":35,"tag":66,"props":160,"children":161},{},[162,164],{"type":41,"value":163},"Supported clients list: ",{"type":35,"tag":165,"props":166,"children":170},"a",{"href":167,"rel":168},"https://modelcontextprotocol.io/clients",[169],"external",[171],{"type":41,"value":167},{"type":35,"tag":66,"props":173,"children":174},{},[175,177],{"type":41,"value":176},"Runtime requirements:\n",{"type":35,"tag":62,"props":178,"children":179},{},[180,185],{"type":35,"tag":66,"props":181,"children":182},{},[183],{"type":41,"value":184},"Source compilation: Go 1.24+",{"type":35,"tag":66,"props":186,"children":187},{},[188],{"type":41,"value":189},"Make tool (optional)",{"type":35,"tag":50,"props":191,"children":193},{"id":192},"installation-methods",[194],{"type":41,"value":195},"Installation Methods",{"type":35,"tag":197,"props":198,"children":200},"h4",{"id":199},"_1-pre-compiled-version-recommended",[201],{"type":41,"value":202},"1. Pre-compiled Version (Recommended)",{"type":35,"tag":44,"props":204,"children":205},{},[206,208],{"type":41,"value":207},"Download the latest version from the official release page:\n",{"type":35,"tag":165,"props":209,"children":212},{"href":210,"rel":211},"https://gitea.com/gitea/gitea-mcp/releases",[169],[213],{"type":41,"value":210},{"type":35,"tag":197,"props":215,"children":217},{"id":216},"_2-source-compilation",[218],{"type":41,"value":219},"2. Source Compilation",{"type":35,"tag":221,"props":222,"children":226},"pre",{"className":223,"code":224,"language":225,"meta":8,"style":8},"language-bash shiki shiki-themes github-dark","# Clone repository\ngit clone https://gitea.com/gitea/gitea-mcp.git\n\n# Enter project directory and compile\ncd gitea-mcp\nmake build\n\n# Optional: Install to system path\nsudo cp gitea-mcp /usr/local/bin\n","bash",[227],{"type":35,"tag":228,"props":229,"children":230},"code",{"__ignoreMap":8},[231,243,264,274,283,298,312,320,329],{"type":35,"tag":232,"props":233,"children":236},"span",{"class":234,"line":235},"line",1,[237],{"type":35,"tag":232,"props":238,"children":240},{"style":239},"--shiki-default:#6A737D",[241],{"type":41,"value":242},"# Clone repository\n",{"type":35,"tag":232,"props":244,"children":246},{"class":234,"line":245},2,[247,253,259],{"type":35,"tag":232,"props":248,"children":250},{"style":249},"--shiki-default:#B392F0",[251],{"type":41,"value":252},"git",{"type":35,"tag":232,"props":254,"children":256},{"style":255},"--shiki-default:#9ECBFF",[257],{"type":41,"value":258}," clone",{"type":35,"tag":232,"props":260,"children":261},{"style":255},[262],{"type":41,"value":263}," https://gitea.com/gitea/gitea-mcp.git\n",{"type":35,"tag":232,"props":265,"children":267},{"class":234,"line":266},3,[268],{"type":35,"tag":232,"props":269,"children":271},{"emptyLinePlaceholder":270},true,[272],{"type":41,"value":273},"\n",{"type":35,"tag":232,"props":275,"children":277},{"class":234,"line":276},4,[278],{"type":35,"tag":232,"props":279,"children":280},{"style":239},[281],{"type":41,"value":282},"# Enter project directory and compile\n",{"type":35,"tag":232,"props":284,"children":286},{"class":234,"line":285},5,[287,293],{"type":35,"tag":232,"props":288,"children":290},{"style":289},"--shiki-default:#79B8FF",[291],{"type":41,"value":292},"cd",{"type":35,"tag":232,"props":294,"children":295},{"style":255},[296],{"type":41,"value":297}," gitea-mcp\n",{"type":35,"tag":232,"props":299,"children":301},{"class":234,"line":300},6,[302,307],{"type":35,"tag":232,"props":303,"children":304},{"style":249},[305],{"type":41,"value":306},"make",{"type":35,"tag":232,"props":308,"children":309},{"style":255},[310],{"type":41,"value":311}," build\n",{"type":35,"tag":232,"props":313,"children":315},{"class":234,"line":314},7,[316],{"type":35,"tag":232,"props":317,"children":318},{"emptyLinePlaceholder":270},[319],{"type":41,"value":273},{"type":35,"tag":232,"props":321,"children":323},{"class":234,"line":322},8,[324],{"type":35,"tag":232,"props":325,"children":326},{"style":239},[327],{"type":41,"value":328},"# Optional: Install to system path\n",{"type":35,"tag":232,"props":330,"children":332},{"class":234,"line":331},9,[333,338,343,348],{"type":35,"tag":232,"props":334,"children":335},{"style":249},[336],{"type":41,"value":337},"sudo",{"type":35,"tag":232,"props":339,"children":340},{"style":255},[341],{"type":41,"value":342}," cp",{"type":35,"tag":232,"props":344,"children":345},{"style":255},[346],{"type":41,"value":347}," gitea-mcp",{"type":35,"tag":232,"props":349,"children":350},{"style":255},[351],{"type":41,"value":352}," /usr/local/bin\n",{"type":35,"tag":50,"props":354,"children":356},{"id":355},"configuration-guide",[357],{"type":41,"value":358},"Configuration Guide",{"type":35,"tag":44,"props":360,"children":361},{},[362],{"type":41,"value":363},"Gitea MCP Server provides two operating modes to suit different usage scenarios:",{"type":35,"tag":197,"props":365,"children":367},{"id":366},"stdio-mode-recommended",[368],{"type":41,"value":369},"stdio Mode (Recommended)",{"type":35,"tag":44,"props":371,"children":372},{},[373],{"type":41,"value":374},"Advantages: Simple configuration, high stability",{"type":35,"tag":221,"props":376,"children":380},{"className":377,"code":378,"language":379,"meta":8,"style":8},"language-json shiki shiki-themes github-dark","{\n  \"mcpServers\": {\n    \"gitea\": {\n      \"command\": \"gitea-mcp\",\n      \"args\": [\n        \"-t\", \"stdio\",\n        \"--host\", \"https://gitea.com\",\n        \"--token\", \"\u003Cyour-access-token>\"\n      ]\n    }\n  }\n}\n","json",[381],{"type":35,"tag":228,"props":382,"children":383},{"__ignoreMap":8},[384,393,406,418,441,454,476,497,514,522,531,540],{"type":35,"tag":232,"props":385,"children":386},{"class":234,"line":235},[387],{"type":35,"tag":232,"props":388,"children":390},{"style":389},"--shiki-default:#E1E4E8",[391],{"type":41,"value":392},"{\n",{"type":35,"tag":232,"props":394,"children":395},{"class":234,"line":245},[396,401],{"type":35,"tag":232,"props":397,"children":398},{"style":289},[399],{"type":41,"value":400},"  \"mcpServers\"",{"type":35,"tag":232,"props":402,"children":403},{"style":389},[404],{"type":41,"value":405},": {\n",{"type":35,"tag":232,"props":407,"children":408},{"class":234,"line":266},[409,414],{"type":35,"tag":232,"props":410,"children":411},{"style":289},[412],{"type":41,"value":413},"    \"gitea\"",{"type":35,"tag":232,"props":415,"children":416},{"style":389},[417],{"type":41,"value":405},{"type":35,"tag":232,"props":419,"children":420},{"class":234,"line":276},[421,426,431,436],{"type":35,"tag":232,"props":422,"children":423},{"style":289},[424],{"type":41,"value":425},"      \"command\"",{"type":35,"tag":232,"props":427,"children":428},{"style":389},[429],{"type":41,"value":430},": ",{"type":35,"tag":232,"props":432,"children":433},{"style":255},[434],{"type":41,"value":435},"\"gitea-mcp\"",{"type":35,"tag":232,"props":437,"children":438},{"style":389},[439],{"type":41,"value":440},",\n",{"type":35,"tag":232,"props":442,"children":443},{"class":234,"line":285},[444,449],{"type":35,"tag":232,"props":445,"children":446},{"style":289},[447],{"type":41,"value":448},"      \"args\"",{"type":35,"tag":232,"props":450,"children":451},{"style":389},[452],{"type":41,"value":453},": [\n",{"type":35,"tag":232,"props":455,"children":456},{"class":234,"line":300},[457,462,467,472],{"type":35,"tag":232,"props":458,"children":459},{"style":255},[460],{"type":41,"value":461},"        \"-t\"",{"type":35,"tag":232,"props":463,"children":464},{"style":389},[465],{"type":41,"value":466},", ",{"type":35,"tag":232,"props":468,"children":469},{"style":255},[470],{"type":41,"value":471},"\"stdio\"",{"type":35,"tag":232,"props":473,"children":474},{"style":389},[475],{"type":41,"value":440},{"type":35,"tag":232,"props":477,"children":478},{"class":234,"line":314},[479,484,488,493],{"type":35,"tag":232,"props":480,"children":481},{"style":255},[482],{"type":41,"value":483},"        \"--host\"",{"type":35,"tag":232,"props":485,"children":486},{"style":389},[487],{"type":41,"value":466},{"type":35,"tag":232,"props":489,"children":490},{"style":255},[491],{"type":41,"value":492},"\"https://gitea.com\"",{"type":35,"tag":232,"props":494,"children":495},{"style":389},[496],{"type":41,"value":440},{"type":35,"tag":232,"props":498,"children":499},{"class":234,"line":322},[500,505,509],{"type":35,"tag":232,"props":501,"children":502},{"style":255},[503],{"type":41,"value":504},"        \"--token\"",{"type":35,"tag":232,"props":506,"children":507},{"style":389},[508],{"type":41,"value":466},{"type":35,"tag":232,"props":510,"children":511},{"style":255},[512],{"type":41,"value":513},"\"\u003Cyour-access-token>\"\n",{"type":35,"tag":232,"props":515,"children":516},{"class":234,"line":331},[517],{"type":35,"tag":232,"props":518,"children":519},{"style":389},[520],{"type":41,"value":521},"      ]\n",{"type":35,"tag":232,"props":523,"children":525},{"class":234,"line":524},10,[526],{"type":35,"tag":232,"props":527,"children":528},{"style":389},[529],{"type":41,"value":530},"    }\n",{"type":35,"tag":232,"props":532,"children":534},{"class":234,"line":533},11,[535],{"type":35,"tag":232,"props":536,"children":537},{"style":389},[538],{"type":41,"value":539},"  }\n",{"type":35,"tag":232,"props":541,"children":543},{"class":234,"line":542},12,[544],{"type":35,"tag":232,"props":545,"children":546},{"style":389},[547],{"type":41,"value":548},"}\n",{"type":35,"tag":197,"props":550,"children":552},{"id":551},"sse-server-sent-events-mode",[553],{"type":41,"value":554},"SSE (Server-Sent Events) Mode",{"type":35,"tag":44,"props":556,"children":557},{},[558],{"type":41,"value":559},"Advantages: Supports real-time event pushing, suitable for distributed deployment",{"type":35,"tag":561,"props":562,"children":563},"ol",{},[564],{"type":35,"tag":66,"props":565,"children":566},{},[567],{"type":41,"value":568},"Start the server:",{"type":35,"tag":221,"props":570,"children":572},{"className":223,"code":571,"language":225,"meta":8,"style":8},"gitea-mcp -t sse --host \u003Cyour-gitea-url> --token \u003Cyour-access-token>\n",[573],{"type":35,"tag":228,"props":574,"children":575},{"__ignoreMap":8},[576],{"type":35,"tag":232,"props":577,"children":578},{"class":234,"line":235},[579,584,589,594,599,605,610,615,620,625,629,634,639],{"type":35,"tag":232,"props":580,"children":581},{"style":249},[582],{"type":41,"value":583},"gitea-mcp",{"type":35,"tag":232,"props":585,"children":586},{"style":289},[587],{"type":41,"value":588}," -t",{"type":35,"tag":232,"props":590,"children":591},{"style":255},[592],{"type":41,"value":593}," sse",{"type":35,"tag":232,"props":595,"children":596},{"style":289},[597],{"type":41,"value":598}," --host",{"type":35,"tag":232,"props":600,"children":602},{"style":601},"--shiki-default:#F97583",[603],{"type":41,"value":604}," \u003C",{"type":35,"tag":232,"props":606,"children":607},{"style":255},[608],{"type":41,"value":609},"your-gitea-ur",{"type":35,"tag":232,"props":611,"children":612},{"style":389},[613],{"type":41,"value":614},"l",{"type":35,"tag":232,"props":616,"children":617},{"style":601},[618],{"type":41,"value":619},">",{"type":35,"tag":232,"props":621,"children":622},{"style":289},[623],{"type":41,"value":624}," --token",{"type":35,"tag":232,"props":626,"children":627},{"style":601},[628],{"type":41,"value":604},{"type":35,"tag":232,"props":630,"children":631},{"style":255},[632],{"type":41,"value":633},"your-access-toke",{"type":35,"tag":232,"props":635,"children":636},{"style":389},[637],{"type":41,"value":638},"n",{"type":35,"tag":232,"props":640,"children":641},{"style":601},[642],{"type":41,"value":643},">\n",{"type":35,"tag":561,"props":645,"children":646},{"start":245},[647],{"type":35,"tag":66,"props":648,"children":649},{},[650],{"type":41,"value":651},"Client configuration:",{"type":35,"tag":221,"props":653,"children":655},{"className":377,"code":654,"language":379,"meta":8,"style":8},"{\n  \"mcpServers\": {\n    \"gitea\": {\n      \"url\": \"http://localhost:8080/sse\"\n    }\n  }\n}\n",[656],{"type":35,"tag":228,"props":657,"children":658},{"__ignoreMap":8},[659,666,677,688,705,712,719],{"type":35,"tag":232,"props":660,"children":661},{"class":234,"line":235},[662],{"type":35,"tag":232,"props":663,"children":664},{"style":389},[665],{"type":41,"value":392},{"type":35,"tag":232,"props":667,"children":668},{"class":234,"line":245},[669,673],{"type":35,"tag":232,"props":670,"children":671},{"style":289},[672],{"type":41,"value":400},{"type":35,"tag":232,"props":674,"children":675},{"style":389},[676],{"type":41,"value":405},{"type":35,"tag":232,"props":678,"children":679},{"class":234,"line":266},[680,684],{"type":35,"tag":232,"props":681,"children":682},{"style":289},[683],{"type":41,"value":413},{"type":35,"tag":232,"props":685,"children":686},{"style":389},[687],{"type":41,"value":405},{"type":35,"tag":232,"props":689,"children":690},{"class":234,"line":276},[691,696,700],{"type":35,"tag":232,"props":692,"children":693},{"style":289},[694],{"type":41,"value":695},"      \"url\"",{"type":35,"tag":232,"props":697,"children":698},{"style":389},[699],{"type":41,"value":430},{"type":35,"tag":232,"props":701,"children":702},{"style":255},[703],{"type":41,"value":704},"\"http://localhost:8080/sse\"\n",{"type":35,"tag":232,"props":706,"children":707},{"class":234,"line":285},[708],{"type":35,"tag":232,"props":709,"children":710},{"style":389},[711],{"type":41,"value":530},{"type":35,"tag":232,"props":713,"children":714},{"class":234,"line":300},[715],{"type":35,"tag":232,"props":716,"children":717},{"style":389},[718],{"type":41,"value":539},{"type":35,"tag":232,"props":720,"children":721},{"class":234,"line":314},[722],{"type":35,"tag":232,"props":723,"children":724},{"style":389},[725],{"type":41,"value":548},{"type":35,"tag":50,"props":727,"children":729},{"id":728},"cursor-client-configuration-guide",[730],{"type":41,"value":731},"Cursor Client Configuration Guide",{"type":35,"tag":561,"props":733,"children":734},{},[735,746,755,768,777,797],{"type":35,"tag":66,"props":736,"children":737},{},[738,740],{"type":41,"value":739},"Open Cursor settings\n",{"type":35,"tag":741,"props":742,"children":745},"img",{"alt":743,"src":744},"Settings Entry","/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-1.png",[],{"type":35,"tag":66,"props":747,"children":748},{},[749,751],{"type":41,"value":750},"Navigate to MCP settings tab\n",{"type":35,"tag":741,"props":752,"children":754},{"alt":743,"src":753},"/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-2.png",[],{"type":35,"tag":66,"props":756,"children":757},{},[758,760,764],{"type":41,"value":759},"Add Gitea MCP Server configuration\n",{"type":35,"tag":741,"props":761,"children":763},{"alt":743,"src":762},"/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-3.png",[],{"type":35,"tag":741,"props":765,"children":767},{"alt":743,"src":766},"/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-4.png",[],{"type":35,"tag":66,"props":769,"children":770},{},[771,773],{"type":41,"value":772},"Enable service (shows green status when connected successfully)\n",{"type":35,"tag":741,"props":774,"children":776},{"alt":743,"src":775},"/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-5.png",[],{"type":35,"tag":66,"props":778,"children":779},{},[780,782,787,792],{"type":41,"value":781},"Verify configuration: Send test command ",{"type":35,"tag":228,"props":783,"children":784},{"className":8},[785],{"type":41,"value":786},"gitea mcp server version",{"type":35,"tag":741,"props":788,"children":791},{"alt":789,"src":790},"Command Test","/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-6.png",[],{"type":35,"tag":741,"props":793,"children":796},{"alt":794,"src":795},"Test Result","/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-7.png",[],{"type":35,"tag":66,"props":798,"children":799},{},[800,802,806],{"type":41,"value":801},"Examples to use the mcp server in cursor\n",{"type":35,"tag":741,"props":803,"children":805},{"alt":789,"src":804},"/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-8.png",[],{"type":35,"tag":741,"props":807,"children":809},{"alt":794,"src":808},"/img/tutorials/gitea-mcp-server-a-new-paradigm-for-ai-driven-code-collaboration/cursor-9.png",[],{"type":35,"tag":36,"props":811,"children":813},{"id":812},"features",[814],{"type":41,"value":815},"Features",{"type":35,"tag":50,"props":817,"children":819},{"id":818},"core-functions",[820],{"type":41,"value":821},"Core Functions",{"type":35,"tag":823,"props":824,"children":825},"table",{},[826,850],{"type":35,"tag":827,"props":828,"children":829},"thead",{},[830],{"type":35,"tag":831,"props":832,"children":833},"tr",{},[834,840,845],{"type":35,"tag":835,"props":836,"children":837},"th",{},[838],{"type":41,"value":839},"Category",{"type":35,"tag":835,"props":841,"children":842},{},[843],{"type":41,"value":844},"Function",{"type":35,"tag":835,"props":846,"children":847},{},[848],{"type":41,"value":849},"Description",{"type":35,"tag":851,"props":852,"children":853},"tbody",{},[854,873,891,909],{"type":35,"tag":831,"props":855,"children":856},{},[857,863,868],{"type":35,"tag":858,"props":859,"children":860},"td",{},[861],{"type":41,"value":862},"Repository Management",{"type":35,"tag":858,"props":864,"children":865},{},[866],{"type":41,"value":867},"Create/Fork/Query",{"type":35,"tag":858,"props":869,"children":870},{},[871],{"type":41,"value":872},"Complete repository lifecycle management",{"type":35,"tag":831,"props":874,"children":875},{},[876,881,886],{"type":35,"tag":858,"props":877,"children":878},{},[879],{"type":41,"value":880},"Code Management",{"type":35,"tag":858,"props":882,"children":883},{},[884],{"type":41,"value":885},"Branch/File Operations",{"type":35,"tag":858,"props":887,"children":888},{},[889],{"type":41,"value":890},"Flexible code version control",{"type":35,"tag":831,"props":892,"children":893},{},[894,899,904],{"type":35,"tag":858,"props":895,"children":896},{},[897],{"type":41,"value":898},"Collaboration Features",{"type":35,"tag":858,"props":900,"children":901},{},[902],{"type":41,"value":903},"Issue/PR Handling",{"type":35,"tag":858,"props":905,"children":906},{},[907],{"type":41,"value":908},"Efficient team collaboration tools",{"type":35,"tag":831,"props":910,"children":911},{},[912,917,922],{"type":35,"tag":858,"props":913,"children":914},{},[915],{"type":41,"value":916},"Search Capabilities",{"type":35,"tag":858,"props":918,"children":919},{},[920],{"type":41,"value":921},"Multi-dimensional Search",{"type":35,"tag":858,"props":923,"children":924},{},[925],{"type":41,"value":926},"Quick resource location",{"type":35,"tag":50,"props":928,"children":930},{"id":929},"api-toolkit",[931],{"type":41,"value":932},"API Toolkit",{"type":35,"tag":44,"props":934,"children":935},{},[936],{"type":41,"value":937},"Gitea MCP Server provides a rich set of API tools covering common code collaboration scenarios:",{"type":35,"tag":823,"props":939,"children":940},{},[941,961],{"type":35,"tag":827,"props":942,"children":943},{},[944],{"type":35,"tag":831,"props":945,"children":946},{},[947,952,957],{"type":35,"tag":835,"props":948,"children":949},{},[950],{"type":41,"value":951},"Tool Name",{"type":35,"tag":835,"props":953,"children":954},{},[955],{"type":41,"value":956},"Function Category",{"type":35,"tag":835,"props":958,"children":959},{},[960],{"type":41,"value":849},{"type":35,"tag":851,"props":962,"children":963},{},[964,985,1005,1025,1045,1066,1086,1106,1127,1148,1168,1188,1208,1229,1249,1269,1289,1310,1330,1350,1371,1392,1413],{"type":35,"tag":831,"props":965,"children":966},{},[967,975,980],{"type":35,"tag":858,"props":968,"children":969},{},[970],{"type":35,"tag":228,"props":971,"children":972},{"className":8},[973],{"type":41,"value":974},"get_my_user_info",{"type":35,"tag":858,"props":976,"children":977},{},[978],{"type":41,"value":979},"User Management",{"type":35,"tag":858,"props":981,"children":982},{},[983],{"type":41,"value":984},"Get authenticated user information",{"type":35,"tag":831,"props":986,"children":987},{},[988,996,1000],{"type":35,"tag":858,"props":989,"children":990},{},[991],{"type":35,"tag":228,"props":992,"children":993},{"className":8},[994],{"type":41,"value":995},"create_repo",{"type":35,"tag":858,"props":997,"children":998},{},[999],{"type":41,"value":862},{"type":35,"tag":858,"props":1001,"children":1002},{},[1003],{"type":41,"value":1004},"Create new code repository",{"type":35,"tag":831,"props":1006,"children":1007},{},[1008,1016,1020],{"type":35,"tag":858,"props":1009,"children":1010},{},[1011],{"type":35,"tag":228,"props":1012,"children":1013},{"className":8},[1014],{"type":41,"value":1015},"fork_repo",{"type":35,"tag":858,"props":1017,"children":1018},{},[1019],{"type":41,"value":862},{"type":35,"tag":858,"props":1021,"children":1022},{},[1023],{"type":41,"value":1024},"Fork existing repository",{"type":35,"tag":831,"props":1026,"children":1027},{},[1028,1036,1040],{"type":35,"tag":858,"props":1029,"children":1030},{},[1031],{"type":35,"tag":228,"props":1032,"children":1033},{"className":8},[1034],{"type":41,"value":1035},"list_my_repos",{"type":35,"tag":858,"props":1037,"children":1038},{},[1039],{"type":41,"value":862},{"type":35,"tag":858,"props":1041,"children":1042},{},[1043],{"type":41,"value":1044},"List all user repositories",{"type":35,"tag":831,"props":1046,"children":1047},{},[1048,1056,1061],{"type":35,"tag":858,"props":1049,"children":1050},{},[1051],{"type":35,"tag":228,"props":1052,"children":1053},{"className":8},[1054],{"type":41,"value":1055},"create_branch",{"type":35,"tag":858,"props":1057,"children":1058},{},[1059],{"type":41,"value":1060},"Branch Management",{"type":35,"tag":858,"props":1062,"children":1063},{},[1064],{"type":41,"value":1065},"Create new branch",{"type":35,"tag":831,"props":1067,"children":1068},{},[1069,1077,1081],{"type":35,"tag":858,"props":1070,"children":1071},{},[1072],{"type":35,"tag":228,"props":1073,"children":1074},{"className":8},[1075],{"type":41,"value":1076},"delete_branch",{"type":35,"tag":858,"props":1078,"children":1079},{},[1080],{"type":41,"value":1060},{"type":35,"tag":858,"props":1082,"children":1083},{},[1084],{"type":41,"value":1085},"Delete specified branch",{"type":35,"tag":831,"props":1087,"children":1088},{},[1089,1097,1101],{"type":35,"tag":858,"props":1090,"children":1091},{},[1092],{"type":35,"tag":228,"props":1093,"children":1094},{"className":8},[1095],{"type":41,"value":1096},"list_branches",{"type":35,"tag":858,"props":1098,"children":1099},{},[1100],{"type":41,"value":1060},{"type":35,"tag":858,"props":1102,"children":1103},{},[1104],{"type":41,"value":1105},"List all repository branches",{"type":35,"tag":831,"props":1107,"children":1108},{},[1109,1117,1122],{"type":35,"tag":858,"props":1110,"children":1111},{},[1112],{"type":35,"tag":228,"props":1113,"children":1114},{"className":8},[1115],{"type":41,"value":1116},"list_repo_commits",{"type":35,"tag":858,"props":1118,"children":1119},{},[1120],{"type":41,"value":1121},"Commit Management",{"type":35,"tag":858,"props":1123,"children":1124},{},[1125],{"type":41,"value":1126},"View repository commit history",{"type":35,"tag":831,"props":1128,"children":1129},{},[1130,1138,1143],{"type":35,"tag":858,"props":1131,"children":1132},{},[1133],{"type":35,"tag":228,"props":1134,"children":1135},{"className":8},[1136],{"type":41,"value":1137},"get_file_content",{"type":35,"tag":858,"props":1139,"children":1140},{},[1141],{"type":41,"value":1142},"File Operations",{"type":35,"tag":858,"props":1144,"children":1145},{},[1146],{"type":41,"value":1147},"Get file content and metadata",{"type":35,"tag":831,"props":1149,"children":1150},{},[1151,1159,1163],{"type":35,"tag":858,"props":1152,"children":1153},{},[1154],{"type":35,"tag":228,"props":1155,"children":1156},{"className":8},[1157],{"type":41,"value":1158},"create_file",{"type":35,"tag":858,"props":1160,"children":1161},{},[1162],{"type":41,"value":1142},{"type":35,"tag":858,"props":1164,"children":1165},{},[1166],{"type":41,"value":1167},"Create new file",{"type":35,"tag":831,"props":1169,"children":1170},{},[1171,1179,1183],{"type":35,"tag":858,"props":1172,"children":1173},{},[1174],{"type":35,"tag":228,"props":1175,"children":1176},{"className":8},[1177],{"type":41,"value":1178},"update_file",{"type":35,"tag":858,"props":1180,"children":1181},{},[1182],{"type":41,"value":1142},{"type":35,"tag":858,"props":1184,"children":1185},{},[1186],{"type":41,"value":1187},"Update existing file",{"type":35,"tag":831,"props":1189,"children":1190},{},[1191,1199,1203],{"type":35,"tag":858,"props":1192,"children":1193},{},[1194],{"type":35,"tag":228,"props":1195,"children":1196},{"className":8},[1197],{"type":41,"value":1198},"delete_file",{"type":35,"tag":858,"props":1200,"children":1201},{},[1202],{"type":41,"value":1142},{"type":35,"tag":858,"props":1204,"children":1205},{},[1206],{"type":41,"value":1207},"Delete specified file",{"type":35,"tag":831,"props":1209,"children":1210},{},[1211,1219,1224],{"type":35,"tag":858,"props":1212,"children":1213},{},[1214],{"type":35,"tag":228,"props":1215,"children":1216},{"className":8},[1217],{"type":41,"value":1218},"get_issue_by_index",{"type":35,"tag":858,"props":1220,"children":1221},{},[1222],{"type":41,"value":1223},"Issue Management",{"type":35,"tag":858,"props":1225,"children":1226},{},[1227],{"type":41,"value":1228},"Get specific issue details",{"type":35,"tag":831,"props":1230,"children":1231},{},[1232,1240,1244],{"type":35,"tag":858,"props":1233,"children":1234},{},[1235],{"type":35,"tag":228,"props":1236,"children":1237},{"className":8},[1238],{"type":41,"value":1239},"list_repo_issues",{"type":35,"tag":858,"props":1241,"children":1242},{},[1243],{"type":41,"value":1223},{"type":35,"tag":858,"props":1245,"children":1246},{},[1247],{"type":41,"value":1248},"List all repository issues",{"type":35,"tag":831,"props":1250,"children":1251},{},[1252,1260,1264],{"type":35,"tag":858,"props":1253,"children":1254},{},[1255],{"type":35,"tag":228,"props":1256,"children":1257},{"className":8},[1258],{"type":41,"value":1259},"create_issue",{"type":35,"tag":858,"props":1261,"children":1262},{},[1263],{"type":41,"value":1223},{"type":35,"tag":858,"props":1265,"children":1266},{},[1267],{"type":41,"value":1268},"Create new issue",{"type":35,"tag":831,"props":1270,"children":1271},{},[1272,1280,1284],{"type":35,"tag":858,"props":1273,"children":1274},{},[1275],{"type":35,"tag":228,"props":1276,"children":1277},{"className":8},[1278],{"type":41,"value":1279},"create_issue_comment",{"type":35,"tag":858,"props":1281,"children":1282},{},[1283],{"type":41,"value":1223},{"type":35,"tag":858,"props":1285,"children":1286},{},[1287],{"type":41,"value":1288},"Add issue comment",{"type":35,"tag":831,"props":1290,"children":1291},{},[1292,1300,1305],{"type":35,"tag":858,"props":1293,"children":1294},{},[1295],{"type":35,"tag":228,"props":1296,"children":1297},{"className":8},[1298],{"type":41,"value":1299},"get_pull_request_by_index",{"type":35,"tag":858,"props":1301,"children":1302},{},[1303],{"type":41,"value":1304},"PR Management",{"type":35,"tag":858,"props":1306,"children":1307},{},[1308],{"type":41,"value":1309},"Get specific PR details",{"type":35,"tag":831,"props":1311,"children":1312},{},[1313,1321,1325],{"type":35,"tag":858,"props":1314,"children":1315},{},[1316],{"type":35,"tag":228,"props":1317,"children":1318},{"className":8},[1319],{"type":41,"value":1320},"list_repo_pull_requests",{"type":35,"tag":858,"props":1322,"children":1323},{},[1324],{"type":41,"value":1304},{"type":35,"tag":858,"props":1326,"children":1327},{},[1328],{"type":41,"value":1329},"List all repository PRs",{"type":35,"tag":831,"props":1331,"children":1332},{},[1333,1341,1345],{"type":35,"tag":858,"props":1334,"children":1335},{},[1336],{"type":35,"tag":228,"props":1337,"children":1338},{"className":8},[1339],{"type":41,"value":1340},"create_pull_request",{"type":35,"tag":858,"props":1342,"children":1343},{},[1344],{"type":41,"value":1304},{"type":35,"tag":858,"props":1346,"children":1347},{},[1348],{"type":41,"value":1349},"Create new PR",{"type":35,"tag":831,"props":1351,"children":1352},{},[1353,1361,1366],{"type":35,"tag":858,"props":1354,"children":1355},{},[1356],{"type":35,"tag":228,"props":1357,"children":1358},{"className":8},[1359],{"type":41,"value":1360},"search_users",{"type":35,"tag":858,"props":1362,"children":1363},{},[1364],{"type":41,"value":1365},"User Search",{"type":35,"tag":858,"props":1367,"children":1368},{},[1369],{"type":41,"value":1370},"Search user accounts",{"type":35,"tag":831,"props":1372,"children":1373},{},[1374,1382,1387],{"type":35,"tag":858,"props":1375,"children":1376},{},[1377],{"type":35,"tag":228,"props":1378,"children":1379},{"className":8},[1380],{"type":41,"value":1381},"search_org_teams",{"type":35,"tag":858,"props":1383,"children":1384},{},[1385],{"type":41,"value":1386},"Organization Management",{"type":35,"tag":858,"props":1388,"children":1389},{},[1390],{"type":41,"value":1391},"Search organization teams",{"type":35,"tag":831,"props":1393,"children":1394},{},[1395,1403,1408],{"type":35,"tag":858,"props":1396,"children":1397},{},[1398],{"type":35,"tag":228,"props":1399,"children":1400},{"className":8},[1401],{"type":41,"value":1402},"search_repos",{"type":35,"tag":858,"props":1404,"children":1405},{},[1406],{"type":41,"value":1407},"Repository Search",{"type":35,"tag":858,"props":1409,"children":1410},{},[1411],{"type":41,"value":1412},"Search code repositories",{"type":35,"tag":831,"props":1414,"children":1415},{},[1416,1424,1429],{"type":35,"tag":858,"props":1417,"children":1418},{},[1419],{"type":35,"tag":228,"props":1420,"children":1421},{"className":8},[1422],{"type":41,"value":1423},"get_gitea_mcp_server_version",{"type":35,"tag":858,"props":1425,"children":1426},{},[1427],{"type":41,"value":1428},"Service Management",{"type":35,"tag":858,"props":1430,"children":1431},{},[1432],{"type":41,"value":1433},"Get server version information",{"type":35,"tag":36,"props":1435,"children":1437},{"id":1436},"best-practices",[1438],{"type":41,"value":1439},"Best Practices",{"type":35,"tag":50,"props":1441,"children":1443},{"id":1442},"_1-code-review-process",[1444],{"type":41,"value":1445},"1. Code Review Process",{"type":35,"tag":62,"props":1447,"children":1448},{},[1449,1454,1459],{"type":35,"tag":66,"props":1450,"children":1451},{},[1452],{"type":41,"value":1453},"Use natural language to describe changes",{"type":35,"tag":66,"props":1455,"children":1456},{},[1457],{"type":41,"value":1458},"Automatically generate change summaries",{"type":35,"tag":66,"props":1460,"children":1461},{},[1462],{"type":41,"value":1463},"Intelligent code review suggestions",{"type":35,"tag":50,"props":1465,"children":1467},{"id":1466},"_2-issue-management",[1468],{"type":41,"value":1469},"2. Issue Management",{"type":35,"tag":62,"props":1471,"children":1472},{},[1473,1478,1483],{"type":35,"tag":66,"props":1474,"children":1475},{},[1476],{"type":41,"value":1477},"Automatic classification and labeling",{"type":35,"tag":66,"props":1479,"children":1480},{},[1481],{"type":41,"value":1482},"Intelligent priority sorting",{"type":35,"tag":66,"props":1484,"children":1485},{},[1486],{"type":41,"value":1487},"Related issue recommendations",{"type":35,"tag":50,"props":1489,"children":1491},{"id":1490},"_3-documentation-maintenance",[1492],{"type":41,"value":1493},"3. Documentation Maintenance",{"type":35,"tag":62,"props":1495,"children":1496},{},[1497,1502,1507],{"type":35,"tag":66,"props":1498,"children":1499},{},[1500],{"type":41,"value":1501},"Real-time documentation updates",{"type":35,"tag":66,"props":1503,"children":1504},{},[1505],{"type":41,"value":1506},"Intelligent content organization",{"type":35,"tag":66,"props":1508,"children":1509},{},[1510],{"type":41,"value":1511},"Automatic formatting",{"type":35,"tag":36,"props":1513,"children":1515},{"id":1514},"frequently-asked-questions",[1516],{"type":41,"value":1517},"Frequently Asked Questions",{"type":35,"tag":561,"props":1519,"children":1520},{},[1521,1547,1573],{"type":35,"tag":66,"props":1522,"children":1523},{},[1524,1529],{"type":35,"tag":94,"props":1525,"children":1526},{},[1527],{"type":41,"value":1528},"How to obtain a Gitea access token?",{"type":35,"tag":62,"props":1530,"children":1531},{},[1532,1537,1542],{"type":35,"tag":66,"props":1533,"children":1534},{},[1535],{"type":41,"value":1536},"Log in to Gitea",{"type":35,"tag":66,"props":1538,"children":1539},{},[1540],{"type":41,"value":1541},"Go to Settings > Applications",{"type":35,"tag":66,"props":1543,"children":1544},{},[1545],{"type":41,"value":1546},"Generate new access token",{"type":35,"tag":66,"props":1548,"children":1549},{},[1550,1555],{"type":35,"tag":94,"props":1551,"children":1552},{},[1553],{"type":41,"value":1554},"Which clients are supported?",{"type":35,"tag":62,"props":1556,"children":1557},{},[1558,1563,1568],{"type":35,"tag":66,"props":1559,"children":1560},{},[1561],{"type":41,"value":1562},"Cursor (recommended)",{"type":35,"tag":66,"props":1564,"children":1565},{},[1566],{"type":41,"value":1567},"Claude",{"type":35,"tag":66,"props":1569,"children":1570},{},[1571],{"type":41,"value":1572},"Other MCP protocol-compatible clients",{"type":35,"tag":66,"props":1574,"children":1575},{},[1576,1581],{"type":35,"tag":94,"props":1577,"children":1578},{},[1579],{"type":41,"value":1580},"How to troubleshoot connection issues?",{"type":35,"tag":62,"props":1582,"children":1583},{},[1584,1589,1594],{"type":35,"tag":66,"props":1585,"children":1586},{},[1587],{"type":41,"value":1588},"Check network connection",{"type":35,"tag":66,"props":1590,"children":1591},{},[1592],{"type":41,"value":1593},"Verify access token",{"type":35,"tag":66,"props":1595,"children":1596},{},[1597],{"type":41,"value":1598},"Review service logs",{"type":35,"tag":36,"props":1600,"children":1602},{"id":1601},"community-support",[1603],{"type":41,"value":1604},"Community Support",{"type":35,"tag":62,"props":1606,"children":1607},{},[1608,1619],{"type":35,"tag":66,"props":1609,"children":1610},{},[1611,1613],{"type":41,"value":1612},"Issue Reporting: ",{"type":35,"tag":165,"props":1614,"children":1617},{"href":1615,"rel":1616},"https://gitea.com/gitea/gitea-mcp/issues",[169],[1618],{"type":41,"value":1615},{"type":35,"tag":66,"props":1620,"children":1621},{},[1622,1624],{"type":41,"value":1623},"Technical Discussions: ",{"type":35,"tag":165,"props":1625,"children":1628},{"href":1626,"rel":1627},"https://discord.gg/Mhujcj2M",[169],[1629],{"type":41,"value":1626},{"type":35,"tag":36,"props":1631,"children":1633},{"id":1632},"license",[1634],{"type":41,"value":1635},"License",{"type":35,"tag":44,"props":1637,"children":1638},{},[1639,1641,1648],{"type":41,"value":1640},"Gitea MCP Server is licensed under the MIT License. See the ",{"type":35,"tag":165,"props":1642,"children":1645},{"href":1643,"rel":1644},"https://gitea.com/gitea/gitea-mcp/src/branch/main/LICENSE",[169],[1646],{"type":41,"value":1647},"LICENSE",{"type":41,"value":1649}," file for details.",{"type":35,"tag":1651,"props":1652,"children":1653},"style",{},[1654],{"type":41,"value":1655},"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 .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);}",{"title":8,"searchDepth":245,"depth":245,"links":1657},[1658,1662,1668,1672,1677,1678,1679],{"id":38,"depth":245,"text":42,"children":1659},[1660,1661],{"id":52,"depth":266,"text":55},{"id":83,"depth":266,"text":86},{"id":133,"depth":245,"text":136,"children":1663},[1664,1665,1666,1667],{"id":139,"depth":266,"text":142},{"id":192,"depth":266,"text":195},{"id":355,"depth":266,"text":358},{"id":728,"depth":266,"text":731},{"id":812,"depth":245,"text":815,"children":1669},[1670,1671],{"id":818,"depth":266,"text":821},{"id":929,"depth":266,"text":932},{"id":1436,"depth":245,"text":1439,"children":1673},[1674,1675,1676],{"id":1442,"depth":266,"text":1445},{"id":1466,"depth":266,"text":1469},{"id":1490,"depth":266,"text":1493},{"id":1514,"depth":245,"text":1517},{"id":1601,"depth":245,"text":1604},{"id":1632,"depth":245,"text":1635},"markdown","content:resources:tutorials:8.gitea-mcp-server.md","content","resources/tutorials/8.gitea-mcp-server.md","md",{"_path":1686,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":1687,"description":1688,"labels":1689,"datetime":1691,"date":1692,"author":1693,"coverImage":1697,"category":1698,"readingTime":1699,"excerpt":1704,"body":1773,"_type":1680,"_id":3513,"_source":1682,"_file":3514,"_extension":1684},"/resources/tutorials/gitea-integrate-with-jira-issue-tracking-flow","Integrating Gitea with Jira Software Development Workflow","Original Post at https://blog.wu-boy.com/2025/03/gitea-integrate-with-jira-issue-tracking-flow-en/",[11,252,1690,14],"jira","2025-03-15T04:22:24.000Z","2025-03-15",{"name":1694,"href":1695,"imageUrl":1696,"role":21},"appleboy","https://github.com/appleboy","https://github.com/appleboy.png","/img/tutorials/gitea-integrate-with-jira-issue-tracking-flow/coverimage.png",{"title":24,"href":25},{"text":1700,"minutes":1701,"time":1702,"words":1703},"7 min read",6.1,366000,1220,{"type":32,"children":1705},[1706,1721,1753,1763],{"type":35,"tag":44,"props":1707,"children":1708},{},[1709],{"type":35,"tag":1710,"props":1711,"children":1712},"em",{},[1713,1715],{"type":41,"value":1714},"Original Post at ",{"type":35,"tag":165,"props":1716,"children":1719},{"href":1717,"rel":1718},"https://blog.wu-boy.com/2025/03/gitea-integrate-with-jira-issue-tracking-flow-en/",[169],[1720],{"type":41,"value":1717},{"type":35,"tag":44,"props":1722,"children":1723},{},[1724,1726,1733,1735,1742,1744,1751],{"type":41,"value":1725},"Before diving in, let's familiarize ourselves with ",{"type":35,"tag":165,"props":1727,"children":1730},{"href":1728,"rel":1729},"https://about.gitea.com/",[169],[1731],{"type":41,"value":1732},"Gitea",{"type":41,"value":1734}," and ",{"type":35,"tag":165,"props":1736,"children":1739},{"href":1737,"rel":1738},"https://www.atlassian.com/software/jira",[169],[1740],{"type":41,"value":1741},"Jira",{"type":41,"value":1743},". For better context, I recommend reading \"",{"type":35,"tag":165,"props":1745,"children":1748},{"href":1746,"rel":1747},"https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-en/",[169],[1749],{"type":41,"value":1750},"Git Software Development Guide: Key to Improving Team Collaboration",{"type":41,"value":1752},"\" first.",{"type":35,"tag":44,"props":1754,"children":1755},{},[1756,1761],{"type":35,"tag":165,"props":1757,"children":1759},{"href":1728,"rel":1758},[169],[1760],{"type":41,"value":1732},{"type":41,"value":1762}," is a lightweight self-hosted Git server written in Go, providing teams with an easily deployable code management solution. It supports multiple operating systems including Linux, Windows, and macOS, while offering comprehensive features for code review, issue tracking, and Wiki management—all essential tools for enhancing team collaboration.",{"type":35,"tag":44,"props":1764,"children":1765},{},[1766,1771],{"type":35,"tag":165,"props":1767,"children":1769},{"href":1737,"rel":1768},[169],[1770],{"type":41,"value":1741},{"type":41,"value":1772}," is Atlassian's professional project management and issue tracking system. Widely adopted by software development teams worldwide, Jira excels in issue tracking, supports agile methodologies (including Scrum and Kanban), and provides robust data analytics capabilities to optimize project management and team collaboration.",{"type":32,"children":1774,"toc":3502},[1775,1787,1809,1818,1827,1833,1845,1866,1871,1894,1902,1907,1913,1918,1991,1999,2004,2050,2055,2061,2075,2081,2420,2446,2452,2464,2826,2837,2845,2851,2869,3138,3146,3152,3163,3465,3472,3477,3483,3488,3493,3498],{"type":35,"tag":44,"props":1776,"children":1777},{},[1778],{"type":35,"tag":1710,"props":1779,"children":1780},{},[1781,1782],{"type":41,"value":1714},{"type":35,"tag":165,"props":1783,"children":1785},{"href":1717,"rel":1784},[169],[1786],{"type":41,"value":1717},{"type":35,"tag":44,"props":1788,"children":1789},{},[1790,1791,1796,1797,1802,1803,1808],{"type":41,"value":1725},{"type":35,"tag":165,"props":1792,"children":1794},{"href":1728,"rel":1793},[169],[1795],{"type":41,"value":1732},{"type":41,"value":1734},{"type":35,"tag":165,"props":1798,"children":1800},{"href":1737,"rel":1799},[169],[1801],{"type":41,"value":1741},{"type":41,"value":1743},{"type":35,"tag":165,"props":1804,"children":1806},{"href":1746,"rel":1805},[169],[1807],{"type":41,"value":1750},{"type":41,"value":1752},{"type":35,"tag":44,"props":1810,"children":1811},{},[1812,1817],{"type":35,"tag":165,"props":1813,"children":1815},{"href":1728,"rel":1814},[169],[1816],{"type":41,"value":1732},{"type":41,"value":1762},{"type":35,"tag":44,"props":1819,"children":1820},{},[1821,1826],{"type":35,"tag":165,"props":1822,"children":1824},{"href":1737,"rel":1823},[169],[1825],{"type":41,"value":1741},{"type":41,"value":1772},{"type":35,"tag":36,"props":1828,"children":1830},{"id":1829},"problem-description",[1831],{"type":41,"value":1832},"Problem Description",{"type":35,"tag":44,"props":1834,"children":1835},{},[1836,1838,1843],{"type":41,"value":1837},"In our department's development workflow, while Git serves as our version control system with ",{"type":35,"tag":165,"props":1839,"children":1841},{"href":1728,"rel":1840},[169],[1842],{"type":41,"value":1732},{"type":41,"value":1844}," as our Git server, and Jira handles our issue tracking, we faced a significant challenge: bridging the gap between code commits and Jira issues effectively.",{"type":35,"tag":44,"props":1846,"children":1847},{},[1848,1850,1855,1857,1864],{"type":41,"value":1849},"While robust integration solutions exist for Jira with services like Bitbucket, GitHub, and GitLab, options for self-hosted Git servers like ",{"type":35,"tag":165,"props":1851,"children":1853},{"href":1728,"rel":1852},[169],[1854],{"type":41,"value":1732},{"type":41,"value":1856}," are limited. This integration challenge has been a ",{"type":35,"tag":165,"props":1858,"children":1861},{"href":1859,"rel":1860},"https://github.com/go-gitea/gitea/issues/25852",[169],[1862],{"type":41,"value":1863},"notable discussion point in the Gitea community",{"type":41,"value":1865},".",{"type":35,"tag":44,"props":1867,"children":1868},{},[1869],{"type":41,"value":1870},"While our team discovered a Jira plugin for Git integration, its implementation approach was less than ideal. The plugin required Jira to periodically scan the Git server's commit history to establish associations between commits and Jira issues. Although this method achieved basic integration, it was inefficient and required the Jira server to have direct access to the Git server, including downloading source code to retrieve historical records. This setup posed security concerns, particularly in large enterprise environments like ours, where departments operate under strict data access policies, making this integration method unsuitable.",{"type":35,"tag":44,"props":1872,"children":1873},{},[1874,1876,1883,1885,1892],{"type":41,"value":1875},"To overcome these limitations, our team developed a custom Gitea-Jira integration solution that prioritizes both efficiency and security. We implemented a design where the Gitea service proactively establishes associations between commits and Jira issues, eliminating the need for Jira to access the Gitea server directly. This architecture not only significantly improves performance but also maintains data security. The implementation is straightforward, primarily leveraging ",{"type":35,"tag":165,"props":1877,"children":1880},{"href":1878,"rel":1879},"https://docs.gitea.com/usage/actions/overview",[169],[1881],{"type":41,"value":1882},"Gitea Action",{"type":41,"value":1884}," in combination with the ",{"type":35,"tag":165,"props":1886,"children":1889},{"href":1887,"rel":1888},"https://developer.atlassian.com/server/jira/platform/rest/v10004/",[169],[1890],{"type":41,"value":1891},"Jira API",{"type":41,"value":1893},". Here's an illustration of the integration:",{"type":35,"tag":44,"props":1895,"children":1896},{},[1897],{"type":35,"tag":741,"props":1898,"children":1901},{"alt":1899,"src":1900},"comment","/img/tutorials/gitea-integrate-with-jira-issue-tracking-flow/jira-git-comment.png",[],{"type":35,"tag":44,"props":1903,"children":1904},{},[1905],{"type":41,"value":1906},"By incorporating Jira issue numbers in commit logs, developers can seamlessly track related commit content within Jira issues, significantly enhancing the efficiency of code tracking and management processes.",{"type":35,"tag":36,"props":1908,"children":1910},{"id":1909},"design-process",[1911],{"type":41,"value":1912},"Design Process",{"type":35,"tag":44,"props":1914,"children":1915},{},[1916],{"type":41,"value":1917},"Before implementation, we established a clear mapping between our software development workflow and Jira states to ensure comprehensive progress tracking. Our workflow is structured around these essential states:",{"type":35,"tag":561,"props":1919,"children":1920},{},[1921,1931,1941,1951,1961,1971,1981],{"type":35,"tag":66,"props":1922,"children":1923},{},[1924,1929],{"type":35,"tag":94,"props":1925,"children":1926},{},[1927],{"type":41,"value":1928},"Backlog",{"type":41,"value":1930},": Pending issues awaiting prioritization",{"type":35,"tag":66,"props":1932,"children":1933},{},[1934,1939],{"type":35,"tag":94,"props":1935,"children":1936},{},[1937],{"type":41,"value":1938},"Open",{"type":41,"value":1940},": Issues ready for development",{"type":35,"tag":66,"props":1942,"children":1943},{},[1944,1949],{"type":35,"tag":94,"props":1945,"children":1946},{},[1947],{"type":41,"value":1948},"In Progress",{"type":41,"value":1950},": Issues actively being worked on",{"type":35,"tag":66,"props":1952,"children":1953},{},[1954,1959],{"type":35,"tag":94,"props":1955,"children":1956},{},[1957],{"type":41,"value":1958},"Code Review",{"type":41,"value":1960},": Code undergoing peer review",{"type":35,"tag":66,"props":1962,"children":1963},{},[1964,1969],{"type":35,"tag":94,"props":1965,"children":1966},{},[1967],{"type":41,"value":1968},"Under Test",{"type":41,"value":1970},": Issues in testing phase",{"type":35,"tag":66,"props":1972,"children":1973},{},[1974,1979],{"type":35,"tag":94,"props":1975,"children":1976},{},[1977],{"type":41,"value":1978},"Resolved",{"type":41,"value":1980},": Successfully completed issues",{"type":35,"tag":66,"props":1982,"children":1983},{},[1984,1989],{"type":35,"tag":94,"props":1985,"children":1986},{},[1987],{"type":41,"value":1988},"Closed",{"type":41,"value":1990},": Finalized and verified issues",{"type":35,"tag":44,"props":1992,"children":1993},{},[1994],{"type":35,"tag":741,"props":1995,"children":1998},{"alt":1996,"src":1997},"flow","/img/tutorials/gitea-integrate-with-jira-issue-tracking-flow/jira-software-flow.png",[],{"type":35,"tag":44,"props":2000,"children":2001},{},[2002],{"type":41,"value":2003},"This framework provides a foundational software development process that teams can customize based on their specific requirements. Each issue progresses through distinct states, allowing developers to take appropriate actions at each stage. This structured approach ensures efficient tracking and management of the development process. We've established the following key state transitions that align with our Git workflows:",{"type":35,"tag":561,"props":2005,"children":2006},{},[2007,2022,2036],{"type":35,"tag":66,"props":2008,"children":2009},{},[2010,2014,2016,2020],{"type":35,"tag":94,"props":2011,"children":2012},{},[2013],{"type":41,"value":1928},{"type":41,"value":2015}," → ",{"type":35,"tag":94,"props":2017,"children":2018},{},[2019],{"type":41,"value":1948},{"type":41,"value":2021},": Initiated when a new development branch is created",{"type":35,"tag":66,"props":2023,"children":2024},{},[2025,2029,2030,2034],{"type":35,"tag":94,"props":2026,"children":2027},{},[2028],{"type":41,"value":1948},{"type":41,"value":2015},{"type":35,"tag":94,"props":2031,"children":2032},{},[2033],{"type":41,"value":1958},{"type":41,"value":2035},": Triggered when code is submitted for review",{"type":35,"tag":66,"props":2037,"children":2038},{},[2039,2043,2044,2048],{"type":35,"tag":94,"props":2040,"children":2041},{},[2042],{"type":41,"value":1958},{"type":41,"value":2015},{"type":35,"tag":94,"props":2045,"children":2046},{},[2047],{"type":41,"value":1978},{"type":41,"value":2049},": Completed when code review is approved",{"type":35,"tag":44,"props":2051,"children":2052},{},[2053],{"type":41,"value":2054},"To maintain workflow efficiency, we require our development team to strictly adhere to these processes. Through automated Git commit integrations, Jira issue states are updated automatically, creating a streamlined and automated development pipeline.",{"type":35,"tag":36,"props":2056,"children":2058},{"id":2057},"integrating-jira-with-gitea-action",[2059],{"type":41,"value":2060},"Integrating Jira with Gitea Action",{"type":35,"tag":44,"props":2062,"children":2063},{},[2064,2066,2073],{"type":41,"value":2065},"We selected Gitea Action as our integration tool for its native functionality and comprehensive support for Git operations. It offers flexible integration capabilities while maintaining robust event handling. For detailed technical implementation, please refer to the ",{"type":35,"tag":165,"props":2067,"children":2070},{"href":2068,"rel":2069},"https://github.com/appleboy/jira-action",[169],[2071],{"type":41,"value":2072},"appleboy/jira-action",{"type":41,"value":2074}," project.",{"type":35,"tag":50,"props":2076,"children":2078},{"id":2077},"creating-new-branches",[2079],{"type":41,"value":2080},"Creating New Branches",{"type":35,"tag":221,"props":2082,"children":2086},{"className":2083,"code":2084,"language":2085,"meta":8,"style":8},"language-yaml shiki shiki-themes github-dark","name: jira integration\n\non:\n  create:\n    types:\n      - branch\n\njobs:\n  jira-branch:\n    runs-on: ubuntu-latest\n    if: github.event.ref_type == 'branch'\n    name: create new branch\n    steps:\n      - name: transition to in progress on branch event\n        uses: appleboy/jira-action@v0.2.0\n        with:\n          base_url: https://xxxxx.com\n          insecure: true\n          token: ${{ secrets.JIRA_TOKEN }}\n          ref: ${{ github.ref_name }}\n          transition: \"Start Progress\"\n          assignee: ${{ github.actor }}\n","yaml",[2087],{"type":35,"tag":228,"props":2088,"children":2089},{"__ignoreMap":8},[2090,2108,2115,2128,2140,2152,2165,2172,2184,2196,2213,2230,2247,2260,2281,2299,2312,2330,2348,2366,2384,2402],{"type":35,"tag":232,"props":2091,"children":2092},{"class":234,"line":235},[2093,2099,2103],{"type":35,"tag":232,"props":2094,"children":2096},{"style":2095},"--shiki-default:#85E89D",[2097],{"type":41,"value":2098},"name",{"type":35,"tag":232,"props":2100,"children":2101},{"style":389},[2102],{"type":41,"value":430},{"type":35,"tag":232,"props":2104,"children":2105},{"style":255},[2106],{"type":41,"value":2107},"jira integration\n",{"type":35,"tag":232,"props":2109,"children":2110},{"class":234,"line":245},[2111],{"type":35,"tag":232,"props":2112,"children":2113},{"emptyLinePlaceholder":270},[2114],{"type":41,"value":273},{"type":35,"tag":232,"props":2116,"children":2117},{"class":234,"line":266},[2118,2123],{"type":35,"tag":232,"props":2119,"children":2120},{"style":289},[2121],{"type":41,"value":2122},"on",{"type":35,"tag":232,"props":2124,"children":2125},{"style":389},[2126],{"type":41,"value":2127},":\n",{"type":35,"tag":232,"props":2129,"children":2130},{"class":234,"line":276},[2131,2136],{"type":35,"tag":232,"props":2132,"children":2133},{"style":2095},[2134],{"type":41,"value":2135},"  create",{"type":35,"tag":232,"props":2137,"children":2138},{"style":389},[2139],{"type":41,"value":2127},{"type":35,"tag":232,"props":2141,"children":2142},{"class":234,"line":285},[2143,2148],{"type":35,"tag":232,"props":2144,"children":2145},{"style":2095},[2146],{"type":41,"value":2147},"    types",{"type":35,"tag":232,"props":2149,"children":2150},{"style":389},[2151],{"type":41,"value":2127},{"type":35,"tag":232,"props":2153,"children":2154},{"class":234,"line":300},[2155,2160],{"type":35,"tag":232,"props":2156,"children":2157},{"style":389},[2158],{"type":41,"value":2159},"      - ",{"type":35,"tag":232,"props":2161,"children":2162},{"style":255},[2163],{"type":41,"value":2164},"branch\n",{"type":35,"tag":232,"props":2166,"children":2167},{"class":234,"line":314},[2168],{"type":35,"tag":232,"props":2169,"children":2170},{"emptyLinePlaceholder":270},[2171],{"type":41,"value":273},{"type":35,"tag":232,"props":2173,"children":2174},{"class":234,"line":322},[2175,2180],{"type":35,"tag":232,"props":2176,"children":2177},{"style":2095},[2178],{"type":41,"value":2179},"jobs",{"type":35,"tag":232,"props":2181,"children":2182},{"style":389},[2183],{"type":41,"value":2127},{"type":35,"tag":232,"props":2185,"children":2186},{"class":234,"line":331},[2187,2192],{"type":35,"tag":232,"props":2188,"children":2189},{"style":2095},[2190],{"type":41,"value":2191},"  jira-branch",{"type":35,"tag":232,"props":2193,"children":2194},{"style":389},[2195],{"type":41,"value":2127},{"type":35,"tag":232,"props":2197,"children":2198},{"class":234,"line":524},[2199,2204,2208],{"type":35,"tag":232,"props":2200,"children":2201},{"style":2095},[2202],{"type":41,"value":2203},"    runs-on",{"type":35,"tag":232,"props":2205,"children":2206},{"style":389},[2207],{"type":41,"value":430},{"type":35,"tag":232,"props":2209,"children":2210},{"style":255},[2211],{"type":41,"value":2212},"ubuntu-latest\n",{"type":35,"tag":232,"props":2214,"children":2215},{"class":234,"line":533},[2216,2221,2225],{"type":35,"tag":232,"props":2217,"children":2218},{"style":2095},[2219],{"type":41,"value":2220},"    if",{"type":35,"tag":232,"props":2222,"children":2223},{"style":389},[2224],{"type":41,"value":430},{"type":35,"tag":232,"props":2226,"children":2227},{"style":255},[2228],{"type":41,"value":2229},"github.event.ref_type == 'branch'\n",{"type":35,"tag":232,"props":2231,"children":2232},{"class":234,"line":542},[2233,2238,2242],{"type":35,"tag":232,"props":2234,"children":2235},{"style":2095},[2236],{"type":41,"value":2237},"    name",{"type":35,"tag":232,"props":2239,"children":2240},{"style":389},[2241],{"type":41,"value":430},{"type":35,"tag":232,"props":2243,"children":2244},{"style":255},[2245],{"type":41,"value":2246},"create new branch\n",{"type":35,"tag":232,"props":2248,"children":2250},{"class":234,"line":2249},13,[2251,2256],{"type":35,"tag":232,"props":2252,"children":2253},{"style":2095},[2254],{"type":41,"value":2255},"    steps",{"type":35,"tag":232,"props":2257,"children":2258},{"style":389},[2259],{"type":41,"value":2127},{"type":35,"tag":232,"props":2261,"children":2263},{"class":234,"line":2262},14,[2264,2268,2272,2276],{"type":35,"tag":232,"props":2265,"children":2266},{"style":389},[2267],{"type":41,"value":2159},{"type":35,"tag":232,"props":2269,"children":2270},{"style":2095},[2271],{"type":41,"value":2098},{"type":35,"tag":232,"props":2273,"children":2274},{"style":389},[2275],{"type":41,"value":430},{"type":35,"tag":232,"props":2277,"children":2278},{"style":255},[2279],{"type":41,"value":2280},"transition to in progress on branch event\n",{"type":35,"tag":232,"props":2282,"children":2284},{"class":234,"line":2283},15,[2285,2290,2294],{"type":35,"tag":232,"props":2286,"children":2287},{"style":2095},[2288],{"type":41,"value":2289},"        uses",{"type":35,"tag":232,"props":2291,"children":2292},{"style":389},[2293],{"type":41,"value":430},{"type":35,"tag":232,"props":2295,"children":2296},{"style":255},[2297],{"type":41,"value":2298},"appleboy/jira-action@v0.2.0\n",{"type":35,"tag":232,"props":2300,"children":2302},{"class":234,"line":2301},16,[2303,2308],{"type":35,"tag":232,"props":2304,"children":2305},{"style":2095},[2306],{"type":41,"value":2307},"        with",{"type":35,"tag":232,"props":2309,"children":2310},{"style":389},[2311],{"type":41,"value":2127},{"type":35,"tag":232,"props":2313,"children":2315},{"class":234,"line":2314},17,[2316,2321,2325],{"type":35,"tag":232,"props":2317,"children":2318},{"style":2095},[2319],{"type":41,"value":2320},"          base_url",{"type":35,"tag":232,"props":2322,"children":2323},{"style":389},[2324],{"type":41,"value":430},{"type":35,"tag":232,"props":2326,"children":2327},{"style":255},[2328],{"type":41,"value":2329},"https://xxxxx.com\n",{"type":35,"tag":232,"props":2331,"children":2333},{"class":234,"line":2332},18,[2334,2339,2343],{"type":35,"tag":232,"props":2335,"children":2336},{"style":2095},[2337],{"type":41,"value":2338},"          insecure",{"type":35,"tag":232,"props":2340,"children":2341},{"style":389},[2342],{"type":41,"value":430},{"type":35,"tag":232,"props":2344,"children":2345},{"style":289},[2346],{"type":41,"value":2347},"true\n",{"type":35,"tag":232,"props":2349,"children":2351},{"class":234,"line":2350},19,[2352,2357,2361],{"type":35,"tag":232,"props":2353,"children":2354},{"style":2095},[2355],{"type":41,"value":2356},"          token",{"type":35,"tag":232,"props":2358,"children":2359},{"style":389},[2360],{"type":41,"value":430},{"type":35,"tag":232,"props":2362,"children":2363},{"style":255},[2364],{"type":41,"value":2365},"${{ secrets.JIRA_TOKEN }}\n",{"type":35,"tag":232,"props":2367,"children":2369},{"class":234,"line":2368},20,[2370,2375,2379],{"type":35,"tag":232,"props":2371,"children":2372},{"style":2095},[2373],{"type":41,"value":2374},"          ref",{"type":35,"tag":232,"props":2376,"children":2377},{"style":389},[2378],{"type":41,"value":430},{"type":35,"tag":232,"props":2380,"children":2381},{"style":255},[2382],{"type":41,"value":2383},"${{ github.ref_name }}\n",{"type":35,"tag":232,"props":2385,"children":2387},{"class":234,"line":2386},21,[2388,2393,2397],{"type":35,"tag":232,"props":2389,"children":2390},{"style":2095},[2391],{"type":41,"value":2392},"          transition",{"type":35,"tag":232,"props":2394,"children":2395},{"style":389},[2396],{"type":41,"value":430},{"type":35,"tag":232,"props":2398,"children":2399},{"style":255},[2400],{"type":41,"value":2401},"\"Start Progress\"\n",{"type":35,"tag":232,"props":2403,"children":2405},{"class":234,"line":2404},22,[2406,2411,2415],{"type":35,"tag":232,"props":2407,"children":2408},{"style":2095},[2409],{"type":41,"value":2410},"          assignee",{"type":35,"tag":232,"props":2412,"children":2413},{"style":389},[2414],{"type":41,"value":430},{"type":35,"tag":232,"props":2416,"children":2417},{"style":255},[2418],{"type":41,"value":2419},"${{ github.actor }}\n",{"type":35,"tag":44,"props":2421,"children":2422},{},[2423,2425,2430,2432,2437,2439,2444],{"type":41,"value":2424},"This YAML configuration automatically integrates Gitea Action with Jira. Upon branch creation, the system updates the corresponding Jira issue status to \"In Progress\" and assigns it to the branch creator. Within the configuration, the ",{"type":35,"tag":228,"props":2426,"children":2427},{"className":8},[2428],{"type":41,"value":2429},"ref",{"type":41,"value":2431}," parameter captures the new branch name, the ",{"type":35,"tag":228,"props":2433,"children":2434},{"className":8},[2435],{"type":41,"value":2436},"transition",{"type":41,"value":2438}," field defines the target Jira state, and the ",{"type":35,"tag":228,"props":2440,"children":2441},{"className":8},[2442],{"type":41,"value":2443},"assignee",{"type":41,"value":2445}," parameter determines the issue owner.",{"type":35,"tag":50,"props":2447,"children":2449},{"id":2448},"committing-code",[2450],{"type":41,"value":2451},"Committing Code",{"type":35,"tag":44,"props":2453,"children":2454},{},[2455,2457,2462],{"type":41,"value":2456},"To maintain traceability, developers must include the relevant Jira issue number (e.g., ",{"type":35,"tag":228,"props":2458,"children":2459},{"className":8},[2460],{"type":41,"value":2461},"GAIS-123",{"type":41,"value":2463},") in their commit messages. This practice enables the system to automatically create and maintain associations between code commits and their corresponding Jira issues.",{"type":35,"tag":221,"props":2465,"children":2467},{"className":2083,"code":2466,"language":2085,"meta":8,"style":8},"name: jira integration\n\non:\n  push:\n    branches:\n      - \"*\"\n\njobs:\n  jira-push-event:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push'\n    name: transition to in progress on push event\n    steps:\n      - name: transition to in progress on push event\n        uses: appleboy/jira-action@v0.2.0\n        with:\n          base_url: https://xxxxx.com\n          insecure: true\n          token: ${{ secrets.JIRA_TOKEN }}\n          ref: ${{ github.event.head_commit.message }}\n          transition: \"Start Progress\"\n          assignee: ${{ github.event.head_commit.author.username }}\n          comment: |\n            🧑‍💻 [~${{ github.event.pusher.username }}] push code to repository\n\n            See the detailed information from [commit link|${{ github.event.head_commit.url }}].\n\n            ${{ github.event.head_commit.message }}\n",[2468],{"type":35,"tag":228,"props":2469,"children":2470},{"__ignoreMap":8},[2471,2486,2493,2504,2516,2528,2540,2547,2558,2570,2585,2601,2617,2628,2647,2662,2673,2688,2703,2718,2734,2749,2765,2783,2792,2800,2809,2817],{"type":35,"tag":232,"props":2472,"children":2473},{"class":234,"line":235},[2474,2478,2482],{"type":35,"tag":232,"props":2475,"children":2476},{"style":2095},[2477],{"type":41,"value":2098},{"type":35,"tag":232,"props":2479,"children":2480},{"style":389},[2481],{"type":41,"value":430},{"type":35,"tag":232,"props":2483,"children":2484},{"style":255},[2485],{"type":41,"value":2107},{"type":35,"tag":232,"props":2487,"children":2488},{"class":234,"line":245},[2489],{"type":35,"tag":232,"props":2490,"children":2491},{"emptyLinePlaceholder":270},[2492],{"type":41,"value":273},{"type":35,"tag":232,"props":2494,"children":2495},{"class":234,"line":266},[2496,2500],{"type":35,"tag":232,"props":2497,"children":2498},{"style":289},[2499],{"type":41,"value":2122},{"type":35,"tag":232,"props":2501,"children":2502},{"style":389},[2503],{"type":41,"value":2127},{"type":35,"tag":232,"props":2505,"children":2506},{"class":234,"line":276},[2507,2512],{"type":35,"tag":232,"props":2508,"children":2509},{"style":2095},[2510],{"type":41,"value":2511},"  push",{"type":35,"tag":232,"props":2513,"children":2514},{"style":389},[2515],{"type":41,"value":2127},{"type":35,"tag":232,"props":2517,"children":2518},{"class":234,"line":285},[2519,2524],{"type":35,"tag":232,"props":2520,"children":2521},{"style":2095},[2522],{"type":41,"value":2523},"    branches",{"type":35,"tag":232,"props":2525,"children":2526},{"style":389},[2527],{"type":41,"value":2127},{"type":35,"tag":232,"props":2529,"children":2530},{"class":234,"line":300},[2531,2535],{"type":35,"tag":232,"props":2532,"children":2533},{"style":389},[2534],{"type":41,"value":2159},{"type":35,"tag":232,"props":2536,"children":2537},{"style":255},[2538],{"type":41,"value":2539},"\"*\"\n",{"type":35,"tag":232,"props":2541,"children":2542},{"class":234,"line":314},[2543],{"type":35,"tag":232,"props":2544,"children":2545},{"emptyLinePlaceholder":270},[2546],{"type":41,"value":273},{"type":35,"tag":232,"props":2548,"children":2549},{"class":234,"line":322},[2550,2554],{"type":35,"tag":232,"props":2551,"children":2552},{"style":2095},[2553],{"type":41,"value":2179},{"type":35,"tag":232,"props":2555,"children":2556},{"style":389},[2557],{"type":41,"value":2127},{"type":35,"tag":232,"props":2559,"children":2560},{"class":234,"line":331},[2561,2566],{"type":35,"tag":232,"props":2562,"children":2563},{"style":2095},[2564],{"type":41,"value":2565},"  jira-push-event",{"type":35,"tag":232,"props":2567,"children":2568},{"style":389},[2569],{"type":41,"value":2127},{"type":35,"tag":232,"props":2571,"children":2572},{"class":234,"line":524},[2573,2577,2581],{"type":35,"tag":232,"props":2574,"children":2575},{"style":2095},[2576],{"type":41,"value":2203},{"type":35,"tag":232,"props":2578,"children":2579},{"style":389},[2580],{"type":41,"value":430},{"type":35,"tag":232,"props":2582,"children":2583},{"style":255},[2584],{"type":41,"value":2212},{"type":35,"tag":232,"props":2586,"children":2587},{"class":234,"line":533},[2588,2592,2596],{"type":35,"tag":232,"props":2589,"children":2590},{"style":2095},[2591],{"type":41,"value":2220},{"type":35,"tag":232,"props":2593,"children":2594},{"style":389},[2595],{"type":41,"value":430},{"type":35,"tag":232,"props":2597,"children":2598},{"style":255},[2599],{"type":41,"value":2600},"github.event_name == 'push'\n",{"type":35,"tag":232,"props":2602,"children":2603},{"class":234,"line":542},[2604,2608,2612],{"type":35,"tag":232,"props":2605,"children":2606},{"style":2095},[2607],{"type":41,"value":2237},{"type":35,"tag":232,"props":2609,"children":2610},{"style":389},[2611],{"type":41,"value":430},{"type":35,"tag":232,"props":2613,"children":2614},{"style":255},[2615],{"type":41,"value":2616},"transition to in progress on push event\n",{"type":35,"tag":232,"props":2618,"children":2619},{"class":234,"line":2249},[2620,2624],{"type":35,"tag":232,"props":2621,"children":2622},{"style":2095},[2623],{"type":41,"value":2255},{"type":35,"tag":232,"props":2625,"children":2626},{"style":389},[2627],{"type":41,"value":2127},{"type":35,"tag":232,"props":2629,"children":2630},{"class":234,"line":2262},[2631,2635,2639,2643],{"type":35,"tag":232,"props":2632,"children":2633},{"style":389},[2634],{"type":41,"value":2159},{"type":35,"tag":232,"props":2636,"children":2637},{"style":2095},[2638],{"type":41,"value":2098},{"type":35,"tag":232,"props":2640,"children":2641},{"style":389},[2642],{"type":41,"value":430},{"type":35,"tag":232,"props":2644,"children":2645},{"style":255},[2646],{"type":41,"value":2616},{"type":35,"tag":232,"props":2648,"children":2649},{"class":234,"line":2283},[2650,2654,2658],{"type":35,"tag":232,"props":2651,"children":2652},{"style":2095},[2653],{"type":41,"value":2289},{"type":35,"tag":232,"props":2655,"children":2656},{"style":389},[2657],{"type":41,"value":430},{"type":35,"tag":232,"props":2659,"children":2660},{"style":255},[2661],{"type":41,"value":2298},{"type":35,"tag":232,"props":2663,"children":2664},{"class":234,"line":2301},[2665,2669],{"type":35,"tag":232,"props":2666,"children":2667},{"style":2095},[2668],{"type":41,"value":2307},{"type":35,"tag":232,"props":2670,"children":2671},{"style":389},[2672],{"type":41,"value":2127},{"type":35,"tag":232,"props":2674,"children":2675},{"class":234,"line":2314},[2676,2680,2684],{"type":35,"tag":232,"props":2677,"children":2678},{"style":2095},[2679],{"type":41,"value":2320},{"type":35,"tag":232,"props":2681,"children":2682},{"style":389},[2683],{"type":41,"value":430},{"type":35,"tag":232,"props":2685,"children":2686},{"style":255},[2687],{"type":41,"value":2329},{"type":35,"tag":232,"props":2689,"children":2690},{"class":234,"line":2332},[2691,2695,2699],{"type":35,"tag":232,"props":2692,"children":2693},{"style":2095},[2694],{"type":41,"value":2338},{"type":35,"tag":232,"props":2696,"children":2697},{"style":389},[2698],{"type":41,"value":430},{"type":35,"tag":232,"props":2700,"children":2701},{"style":289},[2702],{"type":41,"value":2347},{"type":35,"tag":232,"props":2704,"children":2705},{"class":234,"line":2350},[2706,2710,2714],{"type":35,"tag":232,"props":2707,"children":2708},{"style":2095},[2709],{"type":41,"value":2356},{"type":35,"tag":232,"props":2711,"children":2712},{"style":389},[2713],{"type":41,"value":430},{"type":35,"tag":232,"props":2715,"children":2716},{"style":255},[2717],{"type":41,"value":2365},{"type":35,"tag":232,"props":2719,"children":2720},{"class":234,"line":2368},[2721,2725,2729],{"type":35,"tag":232,"props":2722,"children":2723},{"style":2095},[2724],{"type":41,"value":2374},{"type":35,"tag":232,"props":2726,"children":2727},{"style":389},[2728],{"type":41,"value":430},{"type":35,"tag":232,"props":2730,"children":2731},{"style":255},[2732],{"type":41,"value":2733},"${{ github.event.head_commit.message }}\n",{"type":35,"tag":232,"props":2735,"children":2736},{"class":234,"line":2386},[2737,2741,2745],{"type":35,"tag":232,"props":2738,"children":2739},{"style":2095},[2740],{"type":41,"value":2392},{"type":35,"tag":232,"props":2742,"children":2743},{"style":389},[2744],{"type":41,"value":430},{"type":35,"tag":232,"props":2746,"children":2747},{"style":255},[2748],{"type":41,"value":2401},{"type":35,"tag":232,"props":2750,"children":2751},{"class":234,"line":2404},[2752,2756,2760],{"type":35,"tag":232,"props":2753,"children":2754},{"style":2095},[2755],{"type":41,"value":2410},{"type":35,"tag":232,"props":2757,"children":2758},{"style":389},[2759],{"type":41,"value":430},{"type":35,"tag":232,"props":2761,"children":2762},{"style":255},[2763],{"type":41,"value":2764},"${{ github.event.head_commit.author.username }}\n",{"type":35,"tag":232,"props":2766,"children":2768},{"class":234,"line":2767},23,[2769,2774,2778],{"type":35,"tag":232,"props":2770,"children":2771},{"style":2095},[2772],{"type":41,"value":2773},"          comment",{"type":35,"tag":232,"props":2775,"children":2776},{"style":389},[2777],{"type":41,"value":430},{"type":35,"tag":232,"props":2779,"children":2780},{"style":601},[2781],{"type":41,"value":2782},"|\n",{"type":35,"tag":232,"props":2784,"children":2786},{"class":234,"line":2785},24,[2787],{"type":35,"tag":232,"props":2788,"children":2789},{"style":255},[2790],{"type":41,"value":2791},"            🧑‍💻 [~${{ github.event.pusher.username }}] push code to repository\n",{"type":35,"tag":232,"props":2793,"children":2795},{"class":234,"line":2794},25,[2796],{"type":35,"tag":232,"props":2797,"children":2798},{"emptyLinePlaceholder":270},[2799],{"type":41,"value":273},{"type":35,"tag":232,"props":2801,"children":2803},{"class":234,"line":2802},26,[2804],{"type":35,"tag":232,"props":2805,"children":2806},{"style":255},[2807],{"type":41,"value":2808},"            See the detailed information from [commit link|${{ github.event.head_commit.url }}].\n",{"type":35,"tag":232,"props":2810,"children":2812},{"class":234,"line":2811},27,[2813],{"type":35,"tag":232,"props":2814,"children":2815},{"emptyLinePlaceholder":270},[2816],{"type":41,"value":273},{"type":35,"tag":232,"props":2818,"children":2820},{"class":234,"line":2819},28,[2821],{"type":35,"tag":232,"props":2822,"children":2823},{"style":255},[2824],{"type":41,"value":2825},"            ${{ github.event.head_commit.message }}\n",{"type":35,"tag":44,"props":2827,"children":2828},{},[2829,2831,2835],{"type":41,"value":2830},"When a Push Event is received, Action automatically extracts the Jira issue number from the commit message, updates the corresponding Jira issue status to ",{"type":35,"tag":228,"props":2832,"children":2833},{"className":8},[2834],{"type":41,"value":1948},{"type":41,"value":2836},", and assigns it to the committing developer. Furthermore, Action adds a detailed comment to the Jira issue containing the commit information.",{"type":35,"tag":44,"props":2838,"children":2839},{},[2840],{"type":35,"tag":741,"props":2841,"children":2844},{"alt":2842,"src":2843},"push event","/img/tutorials/gitea-integrate-with-jira-issue-tracking-flow/gitea-push-event.png",[],{"type":35,"tag":50,"props":2846,"children":2848},{"id":2847},"submitting-code-for-review",[2849],{"type":41,"value":2850},"Submitting Code for Review",{"type":35,"tag":44,"props":2852,"children":2853},{},[2854,2856,2861,2862,2867],{"type":41,"value":2855},"The system actively monitors Pull Request status changes (",{"type":35,"tag":228,"props":2857,"children":2858},{"className":8},[2859],{"type":41,"value":2860},"opened",{"type":41,"value":1734},{"type":35,"tag":228,"props":2863,"children":2864},{"className":8},[2865],{"type":41,"value":2866},"closed",{"type":41,"value":2868},") and automatically transitions the associated Jira issue to the \"Code Review\" state.",{"type":35,"tag":221,"props":2870,"children":2872},{"className":2083,"code":2871,"language":2085,"meta":8,"style":8},"on:\n  pull_request_target:\n    types: [opened, closed]\n\njobs:\n  open-pull-request:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request_target' && github.event.action == 'opened'\n    name: transition to in review when pull request is created\n    steps:\n      - name: transition to in review when pull request is created\n        uses: appleboy/jira-action@v0.2.0\n        with:\n          base_url: https://xxxxx.com\n          insecure: true\n          token: ${{ secrets.JIRA_TOKEN }}\n          ref: ${{ github.event.pull_request.title }}\n          transition: \"Finish Coding\"\n",[2873],{"type":35,"tag":228,"props":2874,"children":2875},{"__ignoreMap":8},[2876,2887,2899,2928,2935,2946,2958,2973,2989,3005,3016,3035,3050,3061,3076,3091,3106,3122],{"type":35,"tag":232,"props":2877,"children":2878},{"class":234,"line":235},[2879,2883],{"type":35,"tag":232,"props":2880,"children":2881},{"style":289},[2882],{"type":41,"value":2122},{"type":35,"tag":232,"props":2884,"children":2885},{"style":389},[2886],{"type":41,"value":2127},{"type":35,"tag":232,"props":2888,"children":2889},{"class":234,"line":245},[2890,2895],{"type":35,"tag":232,"props":2891,"children":2892},{"style":2095},[2893],{"type":41,"value":2894},"  pull_request_target",{"type":35,"tag":232,"props":2896,"children":2897},{"style":389},[2898],{"type":41,"value":2127},{"type":35,"tag":232,"props":2900,"children":2901},{"class":234,"line":266},[2902,2906,2911,2915,2919,2923],{"type":35,"tag":232,"props":2903,"children":2904},{"style":2095},[2905],{"type":41,"value":2147},{"type":35,"tag":232,"props":2907,"children":2908},{"style":389},[2909],{"type":41,"value":2910},": [",{"type":35,"tag":232,"props":2912,"children":2913},{"style":255},[2914],{"type":41,"value":2860},{"type":35,"tag":232,"props":2916,"children":2917},{"style":389},[2918],{"type":41,"value":466},{"type":35,"tag":232,"props":2920,"children":2921},{"style":255},[2922],{"type":41,"value":2866},{"type":35,"tag":232,"props":2924,"children":2925},{"style":389},[2926],{"type":41,"value":2927},"]\n",{"type":35,"tag":232,"props":2929,"children":2930},{"class":234,"line":276},[2931],{"type":35,"tag":232,"props":2932,"children":2933},{"emptyLinePlaceholder":270},[2934],{"type":41,"value":273},{"type":35,"tag":232,"props":2936,"children":2937},{"class":234,"line":285},[2938,2942],{"type":35,"tag":232,"props":2939,"children":2940},{"style":2095},[2941],{"type":41,"value":2179},{"type":35,"tag":232,"props":2943,"children":2944},{"style":389},[2945],{"type":41,"value":2127},{"type":35,"tag":232,"props":2947,"children":2948},{"class":234,"line":300},[2949,2954],{"type":35,"tag":232,"props":2950,"children":2951},{"style":2095},[2952],{"type":41,"value":2953},"  open-pull-request",{"type":35,"tag":232,"props":2955,"children":2956},{"style":389},[2957],{"type":41,"value":2127},{"type":35,"tag":232,"props":2959,"children":2960},{"class":234,"line":314},[2961,2965,2969],{"type":35,"tag":232,"props":2962,"children":2963},{"style":2095},[2964],{"type":41,"value":2203},{"type":35,"tag":232,"props":2966,"children":2967},{"style":389},[2968],{"type":41,"value":430},{"type":35,"tag":232,"props":2970,"children":2971},{"style":255},[2972],{"type":41,"value":2212},{"type":35,"tag":232,"props":2974,"children":2975},{"class":234,"line":322},[2976,2980,2984],{"type":35,"tag":232,"props":2977,"children":2978},{"style":2095},[2979],{"type":41,"value":2220},{"type":35,"tag":232,"props":2981,"children":2982},{"style":389},[2983],{"type":41,"value":430},{"type":35,"tag":232,"props":2985,"children":2986},{"style":255},[2987],{"type":41,"value":2988},"github.event_name == 'pull_request_target' && github.event.action == 'opened'\n",{"type":35,"tag":232,"props":2990,"children":2991},{"class":234,"line":331},[2992,2996,3000],{"type":35,"tag":232,"props":2993,"children":2994},{"style":2095},[2995],{"type":41,"value":2237},{"type":35,"tag":232,"props":2997,"children":2998},{"style":389},[2999],{"type":41,"value":430},{"type":35,"tag":232,"props":3001,"children":3002},{"style":255},[3003],{"type":41,"value":3004},"transition to in review when pull request is created\n",{"type":35,"tag":232,"props":3006,"children":3007},{"class":234,"line":524},[3008,3012],{"type":35,"tag":232,"props":3009,"children":3010},{"style":2095},[3011],{"type":41,"value":2255},{"type":35,"tag":232,"props":3013,"children":3014},{"style":389},[3015],{"type":41,"value":2127},{"type":35,"tag":232,"props":3017,"children":3018},{"class":234,"line":533},[3019,3023,3027,3031],{"type":35,"tag":232,"props":3020,"children":3021},{"style":389},[3022],{"type":41,"value":2159},{"type":35,"tag":232,"props":3024,"children":3025},{"style":2095},[3026],{"type":41,"value":2098},{"type":35,"tag":232,"props":3028,"children":3029},{"style":389},[3030],{"type":41,"value":430},{"type":35,"tag":232,"props":3032,"children":3033},{"style":255},[3034],{"type":41,"value":3004},{"type":35,"tag":232,"props":3036,"children":3037},{"class":234,"line":542},[3038,3042,3046],{"type":35,"tag":232,"props":3039,"children":3040},{"style":2095},[3041],{"type":41,"value":2289},{"type":35,"tag":232,"props":3043,"children":3044},{"style":389},[3045],{"type":41,"value":430},{"type":35,"tag":232,"props":3047,"children":3048},{"style":255},[3049],{"type":41,"value":2298},{"type":35,"tag":232,"props":3051,"children":3052},{"class":234,"line":2249},[3053,3057],{"type":35,"tag":232,"props":3054,"children":3055},{"style":2095},[3056],{"type":41,"value":2307},{"type":35,"tag":232,"props":3058,"children":3059},{"style":389},[3060],{"type":41,"value":2127},{"type":35,"tag":232,"props":3062,"children":3063},{"class":234,"line":2262},[3064,3068,3072],{"type":35,"tag":232,"props":3065,"children":3066},{"style":2095},[3067],{"type":41,"value":2320},{"type":35,"tag":232,"props":3069,"children":3070},{"style":389},[3071],{"type":41,"value":430},{"type":35,"tag":232,"props":3073,"children":3074},{"style":255},[3075],{"type":41,"value":2329},{"type":35,"tag":232,"props":3077,"children":3078},{"class":234,"line":2283},[3079,3083,3087],{"type":35,"tag":232,"props":3080,"children":3081},{"style":2095},[3082],{"type":41,"value":2338},{"type":35,"tag":232,"props":3084,"children":3085},{"style":389},[3086],{"type":41,"value":430},{"type":35,"tag":232,"props":3088,"children":3089},{"style":289},[3090],{"type":41,"value":2347},{"type":35,"tag":232,"props":3092,"children":3093},{"class":234,"line":2301},[3094,3098,3102],{"type":35,"tag":232,"props":3095,"children":3096},{"style":2095},[3097],{"type":41,"value":2356},{"type":35,"tag":232,"props":3099,"children":3100},{"style":389},[3101],{"type":41,"value":430},{"type":35,"tag":232,"props":3103,"children":3104},{"style":255},[3105],{"type":41,"value":2365},{"type":35,"tag":232,"props":3107,"children":3108},{"class":234,"line":2314},[3109,3113,3117],{"type":35,"tag":232,"props":3110,"children":3111},{"style":2095},[3112],{"type":41,"value":2374},{"type":35,"tag":232,"props":3114,"children":3115},{"style":389},[3116],{"type":41,"value":430},{"type":35,"tag":232,"props":3118,"children":3119},{"style":255},[3120],{"type":41,"value":3121},"${{ github.event.pull_request.title }}\n",{"type":35,"tag":232,"props":3123,"children":3124},{"class":234,"line":2332},[3125,3129,3133],{"type":35,"tag":232,"props":3126,"children":3127},{"style":2095},[3128],{"type":41,"value":2392},{"type":35,"tag":232,"props":3130,"children":3131},{"style":389},[3132],{"type":41,"value":430},{"type":35,"tag":232,"props":3134,"children":3135},{"style":255},[3136],{"type":41,"value":3137},"\"Finish Coding\"\n",{"type":35,"tag":44,"props":3139,"children":3140},{},[3141],{"type":35,"tag":741,"props":3142,"children":3145},{"alt":3143,"src":3144},"pull request","/img/tutorials/gitea-integrate-with-jira-issue-tracking-flow/gitea-pull-request-event.png",[],{"type":35,"tag":50,"props":3147,"children":3149},{"id":3148},"code-review-completion",[3150],{"type":41,"value":3151},"Code Review Completion",{"type":35,"tag":44,"props":3153,"children":3154},{},[3155,3157,3161],{"type":41,"value":3156},"The system continuously monitors Pull Request status changes and automatically transitions the corresponding Jira issue to ",{"type":35,"tag":228,"props":3158,"children":3159},{"className":8},[3160],{"type":41,"value":1978},{"type":41,"value":3162}," when it detects a Pull Request has been closed. This automated workflow ensures immediate synchronization between code review completion and issue tracking.",{"type":35,"tag":221,"props":3164,"children":3166},{"className":2083,"code":3165,"language":2085,"meta":8,"style":8},"name: jira integration\n\non:\n  pull_request:\n    types:\n      - closed\n\njobs:\n  jira-merge-request:\n    runs-on: ubuntu-latest\n    if: ${{ github.event.pull_request.merged }}\n    name: transition to Merge and Deploy\n    steps:\n      - name: transition to in review\n        uses: appleboy/jira-action@v0.2.0\n        with:\n          base_url: https://xxxxx.com\n          insecure: true\n          token: ${{ secrets.JIRA_TOKEN }}\n          ref: ${{ github.event.pull_request.title }}\n          transition: \"Merge and Deploy\"\n          resolution: \"Fixed\"\n",[3167],{"type":35,"tag":228,"props":3168,"children":3169},{"__ignoreMap":8},[3170,3185,3192,3203,3215,3226,3238,3245,3256,3268,3283,3299,3315,3326,3346,3361,3372,3387,3402,3417,3432,3448],{"type":35,"tag":232,"props":3171,"children":3172},{"class":234,"line":235},[3173,3177,3181],{"type":35,"tag":232,"props":3174,"children":3175},{"style":2095},[3176],{"type":41,"value":2098},{"type":35,"tag":232,"props":3178,"children":3179},{"style":389},[3180],{"type":41,"value":430},{"type":35,"tag":232,"props":3182,"children":3183},{"style":255},[3184],{"type":41,"value":2107},{"type":35,"tag":232,"props":3186,"children":3187},{"class":234,"line":245},[3188],{"type":35,"tag":232,"props":3189,"children":3190},{"emptyLinePlaceholder":270},[3191],{"type":41,"value":273},{"type":35,"tag":232,"props":3193,"children":3194},{"class":234,"line":266},[3195,3199],{"type":35,"tag":232,"props":3196,"children":3197},{"style":289},[3198],{"type":41,"value":2122},{"type":35,"tag":232,"props":3200,"children":3201},{"style":389},[3202],{"type":41,"value":2127},{"type":35,"tag":232,"props":3204,"children":3205},{"class":234,"line":276},[3206,3211],{"type":35,"tag":232,"props":3207,"children":3208},{"style":2095},[3209],{"type":41,"value":3210},"  pull_request",{"type":35,"tag":232,"props":3212,"children":3213},{"style":389},[3214],{"type":41,"value":2127},{"type":35,"tag":232,"props":3216,"children":3217},{"class":234,"line":285},[3218,3222],{"type":35,"tag":232,"props":3219,"children":3220},{"style":2095},[3221],{"type":41,"value":2147},{"type":35,"tag":232,"props":3223,"children":3224},{"style":389},[3225],{"type":41,"value":2127},{"type":35,"tag":232,"props":3227,"children":3228},{"class":234,"line":300},[3229,3233],{"type":35,"tag":232,"props":3230,"children":3231},{"style":389},[3232],{"type":41,"value":2159},{"type":35,"tag":232,"props":3234,"children":3235},{"style":255},[3236],{"type":41,"value":3237},"closed\n",{"type":35,"tag":232,"props":3239,"children":3240},{"class":234,"line":314},[3241],{"type":35,"tag":232,"props":3242,"children":3243},{"emptyLinePlaceholder":270},[3244],{"type":41,"value":273},{"type":35,"tag":232,"props":3246,"children":3247},{"class":234,"line":322},[3248,3252],{"type":35,"tag":232,"props":3249,"children":3250},{"style":2095},[3251],{"type":41,"value":2179},{"type":35,"tag":232,"props":3253,"children":3254},{"style":389},[3255],{"type":41,"value":2127},{"type":35,"tag":232,"props":3257,"children":3258},{"class":234,"line":331},[3259,3264],{"type":35,"tag":232,"props":3260,"children":3261},{"style":2095},[3262],{"type":41,"value":3263},"  jira-merge-request",{"type":35,"tag":232,"props":3265,"children":3266},{"style":389},[3267],{"type":41,"value":2127},{"type":35,"tag":232,"props":3269,"children":3270},{"class":234,"line":524},[3271,3275,3279],{"type":35,"tag":232,"props":3272,"children":3273},{"style":2095},[3274],{"type":41,"value":2203},{"type":35,"tag":232,"props":3276,"children":3277},{"style":389},[3278],{"type":41,"value":430},{"type":35,"tag":232,"props":3280,"children":3281},{"style":255},[3282],{"type":41,"value":2212},{"type":35,"tag":232,"props":3284,"children":3285},{"class":234,"line":533},[3286,3290,3294],{"type":35,"tag":232,"props":3287,"children":3288},{"style":2095},[3289],{"type":41,"value":2220},{"type":35,"tag":232,"props":3291,"children":3292},{"style":389},[3293],{"type":41,"value":430},{"type":35,"tag":232,"props":3295,"children":3296},{"style":255},[3297],{"type":41,"value":3298},"${{ github.event.pull_request.merged }}\n",{"type":35,"tag":232,"props":3300,"children":3301},{"class":234,"line":542},[3302,3306,3310],{"type":35,"tag":232,"props":3303,"children":3304},{"style":2095},[3305],{"type":41,"value":2237},{"type":35,"tag":232,"props":3307,"children":3308},{"style":389},[3309],{"type":41,"value":430},{"type":35,"tag":232,"props":3311,"children":3312},{"style":255},[3313],{"type":41,"value":3314},"transition to Merge and Deploy\n",{"type":35,"tag":232,"props":3316,"children":3317},{"class":234,"line":2249},[3318,3322],{"type":35,"tag":232,"props":3319,"children":3320},{"style":2095},[3321],{"type":41,"value":2255},{"type":35,"tag":232,"props":3323,"children":3324},{"style":389},[3325],{"type":41,"value":2127},{"type":35,"tag":232,"props":3327,"children":3328},{"class":234,"line":2262},[3329,3333,3337,3341],{"type":35,"tag":232,"props":3330,"children":3331},{"style":389},[3332],{"type":41,"value":2159},{"type":35,"tag":232,"props":3334,"children":3335},{"style":2095},[3336],{"type":41,"value":2098},{"type":35,"tag":232,"props":3338,"children":3339},{"style":389},[3340],{"type":41,"value":430},{"type":35,"tag":232,"props":3342,"children":3343},{"style":255},[3344],{"type":41,"value":3345},"transition to in review\n",{"type":35,"tag":232,"props":3347,"children":3348},{"class":234,"line":2283},[3349,3353,3357],{"type":35,"tag":232,"props":3350,"children":3351},{"style":2095},[3352],{"type":41,"value":2289},{"type":35,"tag":232,"props":3354,"children":3355},{"style":389},[3356],{"type":41,"value":430},{"type":35,"tag":232,"props":3358,"children":3359},{"style":255},[3360],{"type":41,"value":2298},{"type":35,"tag":232,"props":3362,"children":3363},{"class":234,"line":2301},[3364,3368],{"type":35,"tag":232,"props":3365,"children":3366},{"style":2095},[3367],{"type":41,"value":2307},{"type":35,"tag":232,"props":3369,"children":3370},{"style":389},[3371],{"type":41,"value":2127},{"type":35,"tag":232,"props":3373,"children":3374},{"class":234,"line":2314},[3375,3379,3383],{"type":35,"tag":232,"props":3376,"children":3377},{"style":2095},[3378],{"type":41,"value":2320},{"type":35,"tag":232,"props":3380,"children":3381},{"style":389},[3382],{"type":41,"value":430},{"type":35,"tag":232,"props":3384,"children":3385},{"style":255},[3386],{"type":41,"value":2329},{"type":35,"tag":232,"props":3388,"children":3389},{"class":234,"line":2332},[3390,3394,3398],{"type":35,"tag":232,"props":3391,"children":3392},{"style":2095},[3393],{"type":41,"value":2338},{"type":35,"tag":232,"props":3395,"children":3396},{"style":389},[3397],{"type":41,"value":430},{"type":35,"tag":232,"props":3399,"children":3400},{"style":289},[3401],{"type":41,"value":2347},{"type":35,"tag":232,"props":3403,"children":3404},{"class":234,"line":2350},[3405,3409,3413],{"type":35,"tag":232,"props":3406,"children":3407},{"style":2095},[3408],{"type":41,"value":2356},{"type":35,"tag":232,"props":3410,"children":3411},{"style":389},[3412],{"type":41,"value":430},{"type":35,"tag":232,"props":3414,"children":3415},{"style":255},[3416],{"type":41,"value":2365},{"type":35,"tag":232,"props":3418,"children":3419},{"class":234,"line":2368},[3420,3424,3428],{"type":35,"tag":232,"props":3421,"children":3422},{"style":2095},[3423],{"type":41,"value":2374},{"type":35,"tag":232,"props":3425,"children":3426},{"style":389},[3427],{"type":41,"value":430},{"type":35,"tag":232,"props":3429,"children":3430},{"style":255},[3431],{"type":41,"value":3121},{"type":35,"tag":232,"props":3433,"children":3434},{"class":234,"line":2386},[3435,3439,3443],{"type":35,"tag":232,"props":3436,"children":3437},{"style":2095},[3438],{"type":41,"value":2392},{"type":35,"tag":232,"props":3440,"children":3441},{"style":389},[3442],{"type":41,"value":430},{"type":35,"tag":232,"props":3444,"children":3445},{"style":255},[3446],{"type":41,"value":3447},"\"Merge and Deploy\"\n",{"type":35,"tag":232,"props":3449,"children":3450},{"class":234,"line":2404},[3451,3456,3460],{"type":35,"tag":232,"props":3452,"children":3453},{"style":2095},[3454],{"type":41,"value":3455},"          resolution",{"type":35,"tag":232,"props":3457,"children":3458},{"style":389},[3459],{"type":41,"value":430},{"type":35,"tag":232,"props":3461,"children":3462},{"style":255},[3463],{"type":41,"value":3464},"\"Fixed\"\n",{"type":35,"tag":44,"props":3466,"children":3467},{},[3468],{"type":35,"tag":741,"props":3469,"children":3471},{"alt":3143,"src":3470},"/img/tutorials/gitea-integrate-with-jira-issue-tracking-flow/gitea-merged-pr.png",[],{"type":35,"tag":44,"props":3473,"children":3474},{},[3475],{"type":41,"value":3476},"Beyond these state transitions, the system can be customized to meet specific needs, such as automatically sending email notifications when code reviews are approved or triggering test environment deployments after code merging. These automated processes enhance tracking and management of the development workflow. Gitea Action's greatest strength lies in its versatility in handling various events, making it an exceptionally flexible integration solution.",{"type":35,"tag":36,"props":3478,"children":3480},{"id":3479},"conclusion",[3481],{"type":41,"value":3482},"Conclusion",{"type":35,"tag":44,"props":3484,"children":3485},{},[3486],{"type":41,"value":3487},"Our integration implementation has successfully bridged Gitea and Jira, creating a seamless workflow that enhances both efficiency and security. Developers simply need to reference Jira issue numbers in their commit messages, and the system automatically handles all necessary associations.",{"type":35,"tag":44,"props":3489,"children":3490},{},[3491],{"type":41,"value":3492},"In our current project, a team of 20 developers has effectively managed nearly 5,000 issues over two years, processing an average of ten new issues daily. Such volume would be challenging to manage without our automated solution.",{"type":35,"tag":44,"props":3494,"children":3495},{},[3496],{"type":41,"value":3497},"This integration has not only streamlined our issue management but also optimized our entire development process. By eliminating manual Jira status updates, we've significantly improved efficiency while reducing human error. The success of this integration demonstrates the essential role of automation tools in effectively managing large-scale software development projects.",{"type":35,"tag":1651,"props":3499,"children":3500},{},[3501],{"type":41,"value":1655},{"title":8,"searchDepth":245,"depth":245,"links":3503},[3504,3505,3506,3512],{"id":1829,"depth":245,"text":1832},{"id":1909,"depth":245,"text":1912},{"id":2057,"depth":245,"text":2060,"children":3507},[3508,3509,3510,3511],{"id":2077,"depth":266,"text":2080},{"id":2448,"depth":266,"text":2451},{"id":2847,"depth":266,"text":2850},{"id":3148,"depth":266,"text":3151},{"id":3479,"depth":245,"text":3482},"content:resources:tutorials:7.gitea-integrate-with-jira-issue-tracking-flow.md","resources/tutorials/7.gitea-integrate-with-jira-issue-tracking-flow.md",{"_path":3516,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":3517,"description":3518,"labels":3519,"datetime":3522,"date":3523,"author":3524,"coverImage":3525,"category":3526,"readingTime":3529,"excerpt":3534,"body":3602,"_type":1680,"_id":4700,"_source":1682,"_file":4701,"_extension":1684},"/resources/tutorials/git-software-development-guidelines","Git Software Development Guidelines: Improving Team Collaboration","Original Post at https://blog.wu-boy.com/2025/01/git-software-development-guide-key-to-improving-team-collaboration-en/",[11,252,3520,3521],"development","collabration","2025-01-04T02:04:38.000Z","2025-01-04",{"name":1694,"href":1695,"imageUrl":1696,"role":21},"/img/tutorials/git-software-development-guidelines/coverimage.png",{"title":3527,"href":3528},"Case Study","/resources/tutorials?category=case%20study",{"text":3530,"minutes":3531,"time":3532,"words":3533},"6 min read",5.24,314400,1048,{"type":32,"children":3535},[3536,3548,3552,3573,3578,3584,3589,3597],{"type":35,"tag":44,"props":3537,"children":3538},{},[3539],{"type":35,"tag":1710,"props":3540,"children":3541},{},[3542,3543],{"type":41,"value":1714},{"type":35,"tag":165,"props":3544,"children":3546},{"href":1746,"rel":3545},[169],[3547],{"type":41,"value":1746},{"type":35,"tag":36,"props":3549,"children":3550},{"id":38},[3551],{"type":41,"value":42},{"type":35,"tag":44,"props":3553,"children":3554},{},[3555,3562,3564,3571],{"type":35,"tag":165,"props":3556,"children":3559},{"href":3557,"rel":3558},"https://en.wikipedia.org/wiki/Git",[169],[3560],{"type":41,"value":3561},"Git",{"type":41,"value":3563}," is a distributed version control system developed by ",{"type":35,"tag":165,"props":3565,"children":3568},{"href":3566,"rel":3567},"https://en.wikipedia.org/wiki/Linus_Torvalds",[169],[3569],{"type":41,"value":3570},"Linus Torvalds",{"type":41,"value":3572}," for managing the source code of the Linux kernel. Git is designed for speed, data integrity, support for non-linear development (multiple branches), and strong branch management, making it widely used in software development. To effectively use Git, it is important to not only be familiar with its basic operations but also to master its workflow for better collaborative development. This article introduces some Git software development guidelines to help teams improve collaboration efficiency.",{"type":35,"tag":44,"props":3574,"children":3575},{},[3576],{"type":41,"value":3577},"Due to the complexity of team development, using Git can become more challenging. To enhance team collaboration efficiency, we need to establish a set of Git software development guidelines to standardize team members' operations and ensure the stability and maintainability of the codebase. Adhering to certain principles can accelerate the development process, reduce errors, and improve code quality.",{"type":35,"tag":36,"props":3579,"children":3581},{"id":3580},"git-software-development-workflow",[3582],{"type":41,"value":3583},"Git Software Development Workflow",{"type":35,"tag":44,"props":3585,"children":3586},{},[3587],{"type":41,"value":3588},"Below is a simple Git software development workflow diagram, illustrating how team members collaborate in development:",{"type":35,"tag":44,"props":3590,"children":3591},{},[3592],{"type":35,"tag":741,"props":3593,"children":3596},{"alt":3594,"src":3595},"logo","/img/tutorials/git-software-development-guidelines/git-flow.png",[],{"type":35,"tag":44,"props":3598,"children":3599},{},[3600],{"type":41,"value":3601},"The above workflow may not be suitable for all teams, but it can serve as a reference and be adjusted according to actual situations. Next, we will introduce some Git software development guidelines to help teams improve collaboration efficiency.",{"type":32,"children":3603,"toc":4684},[3604,3616,3620,3635,3639,3643,3647,3653,3657,3663,3668,3676,3735,3756,3783,3788,3839,3852,3859,3864,3871,3877,3882,3923,3928,3941,3946,3973,3979,3985,3999,4049,4055,4081,4086,4097,4219,4240,4247,4253,4286,4293,4299,4340,4347,4353,4397,4404,4410,4421,4449,4455,4469,4510,4516,4521,4675,4680],{"type":35,"tag":44,"props":3605,"children":3606},{},[3607],{"type":35,"tag":1710,"props":3608,"children":3609},{},[3610,3611],{"type":41,"value":1714},{"type":35,"tag":165,"props":3612,"children":3614},{"href":1746,"rel":3613},[169],[3615],{"type":41,"value":1746},{"type":35,"tag":36,"props":3617,"children":3618},{"id":38},[3619],{"type":41,"value":42},{"type":35,"tag":44,"props":3621,"children":3622},{},[3623,3628,3629,3634],{"type":35,"tag":165,"props":3624,"children":3626},{"href":3557,"rel":3625},[169],[3627],{"type":41,"value":3561},{"type":41,"value":3563},{"type":35,"tag":165,"props":3630,"children":3632},{"href":3566,"rel":3631},[169],[3633],{"type":41,"value":3570},{"type":41,"value":3572},{"type":35,"tag":44,"props":3636,"children":3637},{},[3638],{"type":41,"value":3577},{"type":35,"tag":36,"props":3640,"children":3641},{"id":3580},[3642],{"type":41,"value":3583},{"type":35,"tag":44,"props":3644,"children":3645},{},[3646],{"type":41,"value":3588},{"type":35,"tag":44,"props":3648,"children":3649},{},[3650],{"type":35,"tag":741,"props":3651,"children":3652},{"alt":3594,"src":3595},[],{"type":35,"tag":44,"props":3654,"children":3655},{},[3656],{"type":41,"value":3601},{"type":35,"tag":36,"props":3658,"children":3660},{"id":3659},"_01-git-setup",[3661],{"type":41,"value":3662},"01. Git Setup",{"type":35,"tag":44,"props":3664,"children":3665},{},[3666],{"type":41,"value":3667},"Before starting to use Git for software development, we need to perform some preliminary setup to ensure that all team members can use Git correctly. These preliminary tasks include:",{"type":35,"tag":62,"props":3669,"children":3670},{},[3671],{"type":35,"tag":66,"props":3672,"children":3673},{},[3674],{"type":41,"value":3675},"First, set up your Git user name and email.",{"type":35,"tag":221,"props":3677,"children":3679},{"className":223,"code":3678,"language":225,"meta":8,"style":8},"git config --global user.name \"Bo-Yi Wu\"\ngit config --global user.email \"bo-yi.wu@example.com\"\n",[3680],{"type":35,"tag":228,"props":3681,"children":3682},{"__ignoreMap":8},[3683,3710],{"type":35,"tag":232,"props":3684,"children":3685},{"class":234,"line":235},[3686,3690,3695,3700,3705],{"type":35,"tag":232,"props":3687,"children":3688},{"style":249},[3689],{"type":41,"value":252},{"type":35,"tag":232,"props":3691,"children":3692},{"style":255},[3693],{"type":41,"value":3694}," config",{"type":35,"tag":232,"props":3696,"children":3697},{"style":289},[3698],{"type":41,"value":3699}," --global",{"type":35,"tag":232,"props":3701,"children":3702},{"style":255},[3703],{"type":41,"value":3704}," user.name",{"type":35,"tag":232,"props":3706,"children":3707},{"style":255},[3708],{"type":41,"value":3709}," \"Bo-Yi Wu\"\n",{"type":35,"tag":232,"props":3711,"children":3712},{"class":234,"line":245},[3713,3717,3721,3725,3730],{"type":35,"tag":232,"props":3714,"children":3715},{"style":249},[3716],{"type":41,"value":252},{"type":35,"tag":232,"props":3718,"children":3719},{"style":255},[3720],{"type":41,"value":3694},{"type":35,"tag":232,"props":3722,"children":3723},{"style":289},[3724],{"type":41,"value":3699},{"type":35,"tag":232,"props":3726,"children":3727},{"style":255},[3728],{"type":41,"value":3729}," user.email",{"type":35,"tag":232,"props":3731,"children":3732},{"style":255},[3733],{"type":41,"value":3734}," \"bo-yi.wu@example.com\"\n",{"type":35,"tag":62,"props":3736,"children":3737},{},[3738,3751],{"type":35,"tag":66,"props":3739,"children":3740},{},[3741,3743,3750],{"type":41,"value":3742},"Set up Git Commit Signature Verification by following the instructions in this article: ",{"type":35,"tag":165,"props":3744,"children":3747},{"href":3745,"rel":3746},"https://blog.wu-boy.com/2023/10/git-commit-signature-verification/",[169],[3748],{"type":41,"value":3749},"Quick Setup for Git Commit Signature Verification",{"type":41,"value":1865},{"type":35,"tag":66,"props":3752,"children":3753},{},[3754],{"type":41,"value":3755},"Verify that the above settings are correctly configured.",{"type":35,"tag":221,"props":3757,"children":3759},{"className":223,"code":3758,"language":225,"meta":8,"style":8},"git config --global --list\n",[3760],{"type":35,"tag":228,"props":3761,"children":3762},{"__ignoreMap":8},[3763],{"type":35,"tag":232,"props":3764,"children":3765},{"class":234,"line":235},[3766,3770,3774,3778],{"type":35,"tag":232,"props":3767,"children":3768},{"style":249},[3769],{"type":41,"value":252},{"type":35,"tag":232,"props":3771,"children":3772},{"style":255},[3773],{"type":41,"value":3694},{"type":35,"tag":232,"props":3775,"children":3776},{"style":289},[3777],{"type":41,"value":3699},{"type":35,"tag":232,"props":3779,"children":3780},{"style":289},[3781],{"type":41,"value":3782}," --list\n",{"type":35,"tag":44,"props":3784,"children":3785},{},[3786],{"type":41,"value":3787},"You should see the following settings:",{"type":35,"tag":221,"props":3789,"children":3791},{"className":223,"code":3790,"language":225,"meta":8,"style":8},"user.name=Bo-Yi Wu\nuser.email=bo-yi.wu@example.com\nuser.signingkey=/Users/xxxxxxx/.ssh/id_rsa.pub\n",[3792],{"type":35,"tag":228,"props":3793,"children":3794},{"__ignoreMap":8},[3795,3813,3826],{"type":35,"tag":232,"props":3796,"children":3797},{"class":234,"line":235},[3798,3803,3808],{"type":35,"tag":232,"props":3799,"children":3800},{"style":249},[3801],{"type":41,"value":3802},"user.name",{"type":35,"tag":232,"props":3804,"children":3805},{"style":389},[3806],{"type":41,"value":3807},"=Bo-Yi ",{"type":35,"tag":232,"props":3809,"children":3810},{"style":255},[3811],{"type":41,"value":3812},"Wu\n",{"type":35,"tag":232,"props":3814,"children":3815},{"class":234,"line":245},[3816,3821],{"type":35,"tag":232,"props":3817,"children":3818},{"style":249},[3819],{"type":41,"value":3820},"user.email",{"type":35,"tag":232,"props":3822,"children":3823},{"style":389},[3824],{"type":41,"value":3825},"=bo-yi.wu@example.com\n",{"type":35,"tag":232,"props":3827,"children":3828},{"class":234,"line":266},[3829,3834],{"type":35,"tag":232,"props":3830,"children":3831},{"style":249},[3832],{"type":41,"value":3833},"user.signingkey",{"type":35,"tag":232,"props":3835,"children":3836},{"style":389},[3837],{"type":41,"value":3838},"=/Users/xxxxxxx/.ssh/id_rsa.pub\n",{"type":35,"tag":44,"props":3840,"children":3841},{},[3842,3844,3850],{"type":41,"value":3843},"Since our team uses ",{"type":35,"tag":165,"props":3845,"children":3848},{"href":3846,"rel":3847},"https://gitea.com/",[169],[3849],{"type":41,"value":1732},{"type":41,"value":3851}," as the Git server, you can see a green badge on your personal settings page.",{"type":35,"tag":44,"props":3853,"children":3854},{},[3855],{"type":35,"tag":741,"props":3856,"children":3858},{"alt":3594,"src":3857},"/img/tutorials/git-software-development-guidelines/gitea-signature-verification.png",[],{"type":35,"tag":44,"props":3860,"children":3861},{},[3862],{"type":41,"value":3863},"Next, you can test whether the commit is correctly signed. Normally, you should see the following screen (with your commit showing a green box), which confirms that the commit was made by you.",{"type":35,"tag":44,"props":3865,"children":3866},{},[3867],{"type":35,"tag":741,"props":3868,"children":3870},{"alt":3594,"src":3869},"/img/tutorials/git-software-development-guidelines/gitea-commit-signature.png",[],{"type":35,"tag":36,"props":3872,"children":3874},{"id":3873},"_02-guidelines-for-creating-a-new-repository",[3875],{"type":41,"value":3876},"02. Guidelines for Creating a New Repository",{"type":35,"tag":44,"props":3878,"children":3879},{},[3880],{"type":41,"value":3881},"When creating a new repository, certain guidelines should be followed to ensure consistency and maintainability. Here are some key points:",{"type":35,"tag":62,"props":3883,"children":3884},{},[3885,3890,3902,3912],{"type":35,"tag":66,"props":3886,"children":3887},{},[3888],{"type":41,"value":3889},"The repository name should be descriptive and clearly convey its purpose.",{"type":35,"tag":66,"props":3891,"children":3892},{},[3893,3895,3900],{"type":41,"value":3894},"The ",{"type":35,"tag":228,"props":3896,"children":3897},{"className":8},[3898],{"type":41,"value":3899},"README.md",{"type":41,"value":3901}," file should include a project description, installation instructions, and usage guidelines.",{"type":35,"tag":66,"props":3903,"children":3904},{},[3905,3906,3910],{"type":41,"value":3894},{"type":35,"tag":228,"props":3907,"children":3908},{"className":8},[3909],{"type":41,"value":1647},{"type":41,"value":3911}," file should contain the project's licensing information to ensure legal compliance.",{"type":35,"tag":66,"props":3913,"children":3914},{},[3915,3916,3921],{"type":41,"value":3894},{"type":35,"tag":228,"props":3917,"children":3918},{"className":8},[3919],{"type":41,"value":3920},".gitignore",{"type":41,"value":3922}," file should list files and directories to be ignored, preventing unnecessary files from being committed to the repository.",{"type":35,"tag":44,"props":3924,"children":3925},{},[3926],{"type":41,"value":3927},"In addition to these guidelines, adjustments can be made based on actual needs to maintain consistency and maintainability. Here are two common mistakes to avoid:",{"type":35,"tag":62,"props":3929,"children":3930},{},[3931,3936],{"type":35,"tag":66,"props":3932,"children":3933},{},[3934],{"type":41,"value":3935},"Do not commit large binary files to the repository, as this can increase the repository size and affect performance.",{"type":35,"tag":66,"props":3937,"children":3938},{},[3939],{"type":41,"value":3940},"Do not commit sensitive information to the repository, as this can lead to information leaks and security risks.",{"type":35,"tag":44,"props":3942,"children":3943},{},[3944],{"type":41,"value":3945},"Furthermore, since the company's Git server hosts repositories for multiple teams (with a total of 10,000 employees), please follow these rules to avoid unnecessary disputes:",{"type":35,"tag":62,"props":3947,"children":3948},{},[3949,3961],{"type":35,"tag":66,"props":3950,"children":3951},{},[3952,3954,3959],{"type":41,"value":3953},"Do not create repositories under ",{"type":35,"tag":94,"props":3955,"children":3956},{},[3957],{"type":41,"value":3958},"personal accounts",{"type":41,"value":3960}," for team collaboration.",{"type":35,"tag":66,"props":3962,"children":3963},{},[3964,3966,3971],{"type":41,"value":3965},"All repositories should be created as ",{"type":35,"tag":94,"props":3967,"children":3968},{},[3969],{"type":41,"value":3970},"Private",{"type":41,"value":3972},". Do not make the code public. If you need to make it public, please discuss it with the department heads first.",{"type":35,"tag":36,"props":3974,"children":3976},{"id":3975},"_03-software-development-workflow-guidelines",[3977],{"type":41,"value":3978},"03. Software Development Workflow Guidelines",{"type":35,"tag":50,"props":3980,"children":3982},{"id":3981},"_31-branch-management",[3983],{"type":41,"value":3984},"3.1. Branch Management",{"type":35,"tag":44,"props":3986,"children":3987},{},[3988,3990,3997],{"type":41,"value":3989},"Please adopt the GitHub Flow as a guideline to reduce team communication costs. For detailed reasons, you can refer to '",{"type":35,"tag":165,"props":3991,"children":3994},{"href":3992,"rel":3993},"https://blog.wu-boy.com/2017/12/github-flow-vs-git-flow/",[169],[3995],{"type":41,"value":3996},"When to Use GitHub Flow and Git Flow",{"type":41,"value":3998},"'. When creating a branch, please link it to a Jira issue. For example, to address issue GAIS-3210, you can create a branch using the following command:",{"type":35,"tag":221,"props":4000,"children":4002},{"className":223,"code":4001,"language":225,"meta":8,"style":8},"git checkout -b GAIS-3210\ngit push origin GAIS-3210\n",[4003],{"type":35,"tag":228,"props":4004,"children":4005},{"__ignoreMap":8},[4006,4028],{"type":35,"tag":232,"props":4007,"children":4008},{"class":234,"line":235},[4009,4013,4018,4023],{"type":35,"tag":232,"props":4010,"children":4011},{"style":249},[4012],{"type":41,"value":252},{"type":35,"tag":232,"props":4014,"children":4015},{"style":255},[4016],{"type":41,"value":4017}," checkout",{"type":35,"tag":232,"props":4019,"children":4020},{"style":289},[4021],{"type":41,"value":4022}," -b",{"type":35,"tag":232,"props":4024,"children":4025},{"style":255},[4026],{"type":41,"value":4027}," GAIS-3210\n",{"type":35,"tag":232,"props":4029,"children":4030},{"class":234,"line":245},[4031,4035,4040,4045],{"type":35,"tag":232,"props":4032,"children":4033},{"style":249},[4034],{"type":41,"value":252},{"type":35,"tag":232,"props":4036,"children":4037},{"style":255},[4038],{"type":41,"value":4039}," push",{"type":35,"tag":232,"props":4041,"children":4042},{"style":255},[4043],{"type":41,"value":4044}," origin",{"type":35,"tag":232,"props":4046,"children":4047},{"style":255},[4048],{"type":41,"value":4027},{"type":35,"tag":50,"props":4050,"children":4052},{"id":4051},"_32-commit-message-guidelines",[4053],{"type":41,"value":4054},"3.2 Commit Message Guidelines",{"type":35,"tag":62,"props":4056,"children":4057},{},[4058,4071],{"type":35,"tag":66,"props":4059,"children":4060},{},[4061,4063,4070],{"type":41,"value":4062},"Clear and concise: Commit messages should be brief and clearly describe the changes made. Please refer to ",{"type":35,"tag":165,"props":4064,"children":4067},{"href":4065,"rel":4066},"https://www.conventionalcommits.org/",[169],[4068],{"type":41,"value":4069},"Conventional Commits",{"type":41,"value":1865},{"type":35,"tag":66,"props":4072,"children":4073},{},[4074,4076],{"type":41,"value":4075},"Format: Use a standard format, for example: ",{"type":35,"tag":228,"props":4077,"children":4078},{"className":8},[4079],{"type":41,"value":4080},"refactor(GAIS-2892): improve HTTP response handling and concurrency control",{"type":35,"tag":44,"props":4082,"children":4083},{},[4084],{"type":41,"value":4085},"The types can be feat (feature), fix (bug fix), docs (documentation), style (formatting), refactor (refactoring), test (testing), chore (maintenance), etc.",{"type":35,"tag":44,"props":4087,"children":4088},{},[4089,4090,4095],{"type":41,"value":3894},{"type":35,"tag":228,"props":4091,"children":4092},{"className":8},[4093],{"type":41,"value":4094},"GAIS-2892",{"type":41,"value":4096}," corresponds to the Jira issue number. The Gitea system can integrate with Jira issue numbers.",{"type":35,"tag":221,"props":4098,"children":4100},{"className":223,"code":4099,"language":225,"meta":8,"style":8},"feat(ui): Add `Button` component\n^    ^    ^\n|    |    |__ Subject\n|    |_______ Scope\n|____________ Type\n",[4101],{"type":35,"tag":228,"props":4102,"children":4103},{"__ignoreMap":8},[4104,4136,4154,4181,4202],{"type":35,"tag":232,"props":4105,"children":4106},{"class":234,"line":235},[4107,4112,4117,4122,4127,4131],{"type":35,"tag":232,"props":4108,"children":4109},{"style":249},[4110],{"type":41,"value":4111},"feat(ui",{"type":35,"tag":232,"props":4113,"children":4114},{"style":389},[4115],{"type":41,"value":4116},"): Add ",{"type":35,"tag":232,"props":4118,"children":4119},{"style":255},[4120],{"type":41,"value":4121},"`",{"type":35,"tag":232,"props":4123,"children":4124},{"style":249},[4125],{"type":41,"value":4126},"Button",{"type":35,"tag":232,"props":4128,"children":4129},{"style":255},[4130],{"type":41,"value":4121},{"type":35,"tag":232,"props":4132,"children":4133},{"style":249},[4134],{"type":41,"value":4135}," component\n",{"type":35,"tag":232,"props":4137,"children":4138},{"class":234,"line":245},[4139,4144,4149],{"type":35,"tag":232,"props":4140,"children":4141},{"style":249},[4142],{"type":41,"value":4143},"^",{"type":35,"tag":232,"props":4145,"children":4146},{"style":255},[4147],{"type":41,"value":4148},"    ^",{"type":35,"tag":232,"props":4150,"children":4151},{"style":255},[4152],{"type":41,"value":4153},"    ^\n",{"type":35,"tag":232,"props":4155,"children":4156},{"class":234,"line":266},[4157,4162,4167,4171,4176],{"type":35,"tag":232,"props":4158,"children":4159},{"style":601},[4160],{"type":41,"value":4161},"|",{"type":35,"tag":232,"props":4163,"children":4164},{"style":601},[4165],{"type":41,"value":4166},"    |",{"type":35,"tag":232,"props":4168,"children":4169},{"style":601},[4170],{"type":41,"value":4166},{"type":35,"tag":232,"props":4172,"children":4173},{"style":249},[4174],{"type":41,"value":4175},"__",{"type":35,"tag":232,"props":4177,"children":4178},{"style":255},[4179],{"type":41,"value":4180}," Subject\n",{"type":35,"tag":232,"props":4182,"children":4183},{"class":234,"line":276},[4184,4188,4192,4197],{"type":35,"tag":232,"props":4185,"children":4186},{"style":601},[4187],{"type":41,"value":4161},{"type":35,"tag":232,"props":4189,"children":4190},{"style":601},[4191],{"type":41,"value":4166},{"type":35,"tag":232,"props":4193,"children":4194},{"style":249},[4195],{"type":41,"value":4196},"_______",{"type":35,"tag":232,"props":4198,"children":4199},{"style":255},[4200],{"type":41,"value":4201}," Scope\n",{"type":35,"tag":232,"props":4203,"children":4204},{"class":234,"line":285},[4205,4209,4214],{"type":35,"tag":232,"props":4206,"children":4207},{"style":601},[4208],{"type":41,"value":4161},{"type":35,"tag":232,"props":4210,"children":4211},{"style":249},[4212],{"type":41,"value":4213},"____________",{"type":35,"tag":232,"props":4215,"children":4216},{"style":255},[4217],{"type":41,"value":4218}," Type\n",{"type":35,"tag":44,"props":4220,"children":4221},{},[4222,4224,4229,4231,4238],{"type":41,"value":4223},"Introduce ",{"type":35,"tag":165,"props":4225,"children":4227},{"href":1878,"rel":4226},[169],[4228],{"type":41,"value":1882},{"type":41,"value":4230}," with ",{"type":35,"tag":165,"props":4232,"children":4235},{"href":4233,"rel":4234},"https://github.com/marketplace/actions/semantic-pull-request",[169],[4236],{"type":41,"value":4237},"semantic-pull-request",{"type":41,"value":4239}," for automated checks.",{"type":35,"tag":44,"props":4241,"children":4242},{},[4243],{"type":35,"tag":741,"props":4244,"children":4246},{"alt":3594,"src":4245},"/img/tutorials/git-software-development-guidelines/gitea-semantic-pull-request.png",[],{"type":35,"tag":50,"props":4248,"children":4250},{"id":4249},"_33-code-review",[4251],{"type":41,"value":4252},"3.3. Code Review",{"type":35,"tag":62,"props":4254,"children":4255},{},[4256,4269,4274],{"type":35,"tag":66,"props":4257,"children":4258},{},[4259,4261,4268],{"type":41,"value":4260},"Pull Requests: All changes should be made through PRs and require ",{"type":35,"tag":4262,"props":4263,"children":4265},"font",{"color":4264},"red",[4266],{"type":41,"value":4267},"at least one team member's review and approval",{"type":41,"value":1865},{"type":35,"tag":66,"props":4270,"children":4271},{},[4272],{"type":41,"value":4273},"Automated Testing: Ensure all automated tests pass before merging. The team uses Gitea Action for automated testing.",{"type":35,"tag":66,"props":4275,"children":4276},{},[4277,4279,4284],{"type":41,"value":4278},"Use ",{"type":35,"tag":4262,"props":4280,"children":4281},{"color":4264},[4282],{"type":41,"value":4283},"Squash Commit",{"type":41,"value":4285}," for merging: This keeps the history clean and avoids unnecessary merge commits.",{"type":35,"tag":44,"props":4287,"children":4288},{},[4289],{"type":35,"tag":741,"props":4290,"children":4292},{"alt":3594,"src":4291},"/img/tutorials/git-software-development-guidelines/gitea-squash-commit.png",[],{"type":35,"tag":50,"props":4294,"children":4296},{"id":4295},"_34-version-release",[4297],{"type":41,"value":4298},"3.4. Version Release",{"type":35,"tag":62,"props":4300,"children":4301},{},[4302,4307,4321,4326],{"type":35,"tag":66,"props":4303,"children":4304},{},[4305],{"type":41,"value":4306},"Tags: Use tags to mark important version points, such as v1.0.0.",{"type":35,"tag":66,"props":4308,"children":4309},{},[4310,4312,4319],{"type":41,"value":4311},"Semantic Versioning (",{"type":35,"tag":165,"props":4313,"children":4316},{"href":4314,"rel":4315},"https://semver.org/",[169],[4317],{"type":41,"value":4318},"Semantic Versioning",{"type":41,"value":4320},"): Follow semantic versioning rules, with the format MAJOR.MINOR.PATCH.",{"type":35,"tag":66,"props":4322,"children":4323},{},[4324],{"type":41,"value":4325},"Integrate Gitea Action with push and tag for automated deployment to staging and production environments.",{"type":35,"tag":66,"props":4327,"children":4328},{},[4329,4331,4338],{"type":41,"value":4330},"Use the ",{"type":35,"tag":165,"props":4332,"children":4335},{"href":4333,"rel":4334},"https://goreleaser.com/",[169],[4336],{"type":41,"value":4337},"goreleaser",{"type":41,"value":4339}," tool to quickly generate release notes.",{"type":35,"tag":44,"props":4341,"children":4342},{},[4343],{"type":35,"tag":741,"props":4344,"children":4346},{"alt":3594,"src":4345},"/img/tutorials/git-software-development-guidelines/gitea-release-note.png",[],{"type":35,"tag":50,"props":4348,"children":4350},{"id":4349},"_35-security",[4351],{"type":41,"value":4352},"3.5. Security",{"type":35,"tag":62,"props":4354,"children":4355},{},[4356,4392],{"type":35,"tag":66,"props":4357,"children":4358},{},[4359,4361],{"type":41,"value":4360},"During software development, do not include personal sensitive information in the git repository.\n",{"type":35,"tag":62,"props":4362,"children":4363},{},[4364,4375],{"type":35,"tag":66,"props":4365,"children":4366},{},[4367,4368,4373],{"type":41,"value":4278},{"type":35,"tag":228,"props":4369,"children":4370},{"className":8},[4371],{"type":41,"value":4372},".env",{"type":41,"value":4374}," files to store sensitive information.",{"type":35,"tag":66,"props":4376,"children":4377},{},[4378,4380,4384,4386,4390],{"type":41,"value":4379},"Add ",{"type":35,"tag":228,"props":4381,"children":4382},{"className":8},[4383],{"type":41,"value":4372},{"type":41,"value":4385}," files to the ",{"type":35,"tag":228,"props":4387,"children":4388},{"className":8},[4389],{"type":41,"value":3920},{"type":41,"value":4391}," list.",{"type":35,"tag":66,"props":4393,"children":4394},{},[4395],{"type":41,"value":4396},"For deployment-related sensitive information, configure it directly in Gitea Secrets.",{"type":35,"tag":44,"props":4398,"children":4399},{},[4400],{"type":35,"tag":741,"props":4401,"children":4403},{"alt":3594,"src":4402},"/img/tutorials/git-software-development-guidelines/gitea-secret.png",[],{"type":35,"tag":50,"props":4405,"children":4407},{"id":4406},"_36-documentation",[4408],{"type":41,"value":4409},"3.6 Documentation",{"type":35,"tag":44,"props":4411,"children":4412},{},[4413,4415,4419],{"type":41,"value":4414},"It is common to encounter difficulties in running services in your own environment. Developers should write detailed ",{"type":35,"tag":228,"props":4416,"children":4417},{"className":8},[4418],{"type":41,"value":3899},{"type":41,"value":4420}," files to guide future colleagues. The documentation should include:",{"type":35,"tag":62,"props":4422,"children":4423},{},[4424,4429,4434,4439,4444],{"type":35,"tag":66,"props":4425,"children":4426},{},[4427],{"type":41,"value":4428},"Installation instructions",{"type":35,"tag":66,"props":4430,"children":4431},{},[4432],{"type":41,"value":4433},"Execution instructions",{"type":35,"tag":66,"props":4435,"children":4436},{},[4437],{"type":41,"value":4438},"Testing instructions",{"type":35,"tag":66,"props":4440,"children":4441},{},[4442],{"type":41,"value":4443},"Deployment instructions",{"type":35,"tag":66,"props":4445,"children":4446},{},[4447],{"type":41,"value":4448},"Usage instructions",{"type":35,"tag":50,"props":4450,"children":4452},{"id":4451},"_37-code-standards",[4453],{"type":41,"value":4454},"3.7 Code Standards",{"type":35,"tag":44,"props":4456,"children":4457},{},[4458,4460,4467],{"type":41,"value":4459},"Consistency: Follow the team's agreed-upon ",{"type":35,"tag":165,"props":4461,"children":4464},{"href":4462,"rel":4463},"https://google.github.io/styleguide/",[169],[4465],{"type":41,"value":4466},"code style guide",{"type":41,"value":4468}," to maintain code consistency. Below is the code style guide for developing Go language projects:",{"type":35,"tag":62,"props":4470,"children":4471},{},[4472,4485,4498],{"type":35,"tag":66,"props":4473,"children":4474},{},[4475,4476,4483],{"type":41,"value":4330},{"type":35,"tag":165,"props":4477,"children":4480},{"href":4478,"rel":4479},"https://golangci-lint.run/",[169],[4481],{"type":41,"value":4482},"golangci-lint",{"type":41,"value":4484}," tool to check code standards.",{"type":35,"tag":66,"props":4486,"children":4487},{},[4488,4489,4496],{"type":41,"value":4330},{"type":35,"tag":165,"props":4490,"children":4493},{"href":4491,"rel":4492},"https://golang.org/cmd/gofmt/",[169],[4494],{"type":41,"value":4495},"gofmt",{"type":41,"value":4497}," tool to format code.",{"type":35,"tag":66,"props":4499,"children":4500},{},[4501,4502,4509],{"type":41,"value":4330},{"type":35,"tag":165,"props":4503,"children":4506},{"href":4504,"rel":4505},"https://pkg.go.dev/golang.org/x/tools/cmd/vet",[169],[4507],{"type":41,"value":4508},"go vet",{"type":41,"value":4484},{"type":35,"tag":36,"props":4511,"children":4513},{"id":4512},"summary",[4514],{"type":41,"value":4515},"Summary",{"type":35,"tag":44,"props":4517,"children":4518},{},[4519],{"type":41,"value":4520},"This document provides some Git software development guidelines aimed at improving team collaboration efficiency. The main points include:",{"type":35,"tag":561,"props":4522,"children":4523},{},[4524,4534,4583],{"type":35,"tag":66,"props":4525,"children":4526},{},[4527,4532],{"type":35,"tag":94,"props":4528,"children":4529},{},[4530],{"type":41,"value":4531},"Preliminary Setup",{"type":41,"value":4533},": Ensure team members correctly set up Git user name, email, and commit signature verification.",{"type":35,"tag":66,"props":4535,"children":4536},{},[4537,4542,4543],{"type":35,"tag":94,"props":4538,"children":4539},{},[4540],{"type":41,"value":4541},"Guidelines for Creating a New Repository",{"type":41,"value":2127},{"type":35,"tag":62,"props":4544,"children":4545},{},[4546,4551,4573,4578],{"type":35,"tag":66,"props":4547,"children":4548},{},[4549],{"type":41,"value":4550},"Use descriptive names.",{"type":35,"tag":66,"props":4552,"children":4553},{},[4554,4556,4560,4561,4565,4567,4571],{"type":41,"value":4555},"Include ",{"type":35,"tag":228,"props":4557,"children":4558},{"className":8},[4559],{"type":41,"value":3899},{"type":41,"value":466},{"type":35,"tag":228,"props":4562,"children":4563},{"className":8},[4564],{"type":41,"value":1647},{"type":41,"value":4566},", and ",{"type":35,"tag":228,"props":4568,"children":4569},{"className":8},[4570],{"type":41,"value":3920},{"type":41,"value":4572}," files.",{"type":35,"tag":66,"props":4574,"children":4575},{},[4576],{"type":41,"value":4577},"Avoid committing large binary files and sensitive information.",{"type":35,"tag":66,"props":4579,"children":4580},{},[4581],{"type":41,"value":4582},"Follow internal rules for creating private repositories.",{"type":35,"tag":66,"props":4584,"children":4585},{},[4586,4591,4592],{"type":35,"tag":94,"props":4587,"children":4588},{},[4589],{"type":41,"value":4590},"Software Development Workflow Guidelines",{"type":41,"value":2127},{"type":35,"tag":62,"props":4593,"children":4594},{},[4595,4604,4614,4623,4633,4649,4665],{"type":35,"tag":66,"props":4596,"children":4597},{},[4598,4602],{"type":35,"tag":94,"props":4599,"children":4600},{},[4601],{"type":41,"value":1060},{"type":41,"value":4603},": Adopt GitHub Flow and link branches to Jira issues.",{"type":35,"tag":66,"props":4605,"children":4606},{},[4607,4612],{"type":35,"tag":94,"props":4608,"children":4609},{},[4610],{"type":41,"value":4611},"Commit Message Guidelines",{"type":41,"value":4613},": Use the Conventional Commits format.",{"type":35,"tag":66,"props":4615,"children":4616},{},[4617,4621],{"type":35,"tag":94,"props":4618,"children":4619},{},[4620],{"type":41,"value":1958},{"type":41,"value":4622},": Make changes through PRs and use automated testing.",{"type":35,"tag":66,"props":4624,"children":4625},{},[4626,4631],{"type":35,"tag":94,"props":4627,"children":4628},{},[4629],{"type":41,"value":4630},"Version Release",{"type":41,"value":4632},": Use tags and semantic versioning, and integrate automated deployment.",{"type":35,"tag":66,"props":4634,"children":4635},{},[4636,4641,4643,4647],{"type":35,"tag":94,"props":4637,"children":4638},{},[4639],{"type":41,"value":4640},"Security",{"type":41,"value":4642},": Use ",{"type":35,"tag":228,"props":4644,"children":4645},{"className":8},[4646],{"type":41,"value":4372},{"type":41,"value":4648}," files and Gitea Secrets for sensitive information.",{"type":35,"tag":66,"props":4650,"children":4651},{},[4652,4657,4659,4663],{"type":35,"tag":94,"props":4653,"children":4654},{},[4655],{"type":41,"value":4656},"Documentation",{"type":41,"value":4658},": Write detailed ",{"type":35,"tag":228,"props":4660,"children":4661},{"className":8},[4662],{"type":41,"value":3899},{"type":41,"value":4664}," files with installation, execution, testing, deployment, and usage instructions.",{"type":35,"tag":66,"props":4666,"children":4667},{},[4668,4673],{"type":35,"tag":94,"props":4669,"children":4670},{},[4671],{"type":41,"value":4672},"Code Standards",{"type":41,"value":4674},": Follow the code style guide and use tools to check and format code.",{"type":35,"tag":44,"props":4676,"children":4677},{},[4678],{"type":41,"value":4679},"These guidelines aim to help teams improve collaboration efficiency. They are intended as a reference and should be adjusted based on the team's actual situation. We hope these guidelines help you use Git more effectively and improve team collaboration.",{"type":35,"tag":1651,"props":4681,"children":4682},{},[4683],{"type":41,"value":1655},{"title":8,"searchDepth":245,"depth":245,"links":4685},[4686,4687,4688,4689,4690,4699],{"id":38,"depth":245,"text":42},{"id":3580,"depth":245,"text":3583},{"id":3659,"depth":245,"text":3662},{"id":3873,"depth":245,"text":3876},{"id":3975,"depth":245,"text":3978,"children":4691},[4692,4693,4694,4695,4696,4697,4698],{"id":3981,"depth":266,"text":3984},{"id":4051,"depth":266,"text":4054},{"id":4249,"depth":266,"text":4252},{"id":4295,"depth":266,"text":4298},{"id":4349,"depth":266,"text":4352},{"id":4406,"depth":266,"text":4409},{"id":4451,"depth":266,"text":4454},{"id":4512,"depth":245,"text":4515},"content:resources:tutorials:6.git-software-development-guidelines.md","resources/tutorials/6.git-software-development-guidelines.md",{"_path":4703,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":4704,"description":8,"labels":4705,"category":4709,"author":4712,"coverImage":4716,"datetime":4717,"date":4718,"readingTime":4719,"body":4724,"_type":1680,"_id":5622,"_source":1682,"_file":5623,"_extension":1684},"/resources/tutorials/game-development-on-gitea-cloud","Using Gitea Cloud for game development",[11,4706,4707,4708],"cloud","game-development","lfs",{"title":4710,"href":4711},"Cloud","/resources/tutorials?category=cloud",{"name":4713,"href":4714,"imageUrl":4715,"role":21},"Matthäus Niedoba","https://anchorpoint.app","https://github.com/MatNiedoba.png","/img/tutorials/gitea-game-development/Untitled.png","2024-06-16 12:00:00","2024-06-16",{"text":4720,"minutes":4721,"time":4722,"words":4723},"10 min read",9.755,585300,1951,{"type":32,"children":4725,"toc":5596},[4726,4731,4737,4782,4788,4793,4799,4804,4810,4815,4821,4826,4832,4837,4843,4848,4853,4860,4864,4869,4877,4881,4887,4901,4907,4912,4920,4933,4941,4946,4954,4958,4966,4970,4978,4982,4990,4994,5002,5006,5012,5017,5025,5030,5038,5042,5050,5054,5062,5066,5072,5086,5094,5098,5106,5110,5118,5122,5130,5134,5142,5146,5154,5158,5170,5176,5181,5189,5194,5202,5207,5215,5220,5228,5236,5241,5249,5257,5261,5267,5272,5280,5284,5290,5302,5317,5323,5328,5336,5341,5349,5354,5362,5367,5375,5381,5386,5394,5398,5406,5410,5418,5422,5430,5434,5442,5446,5454,5458,5466,5470,5476,5481,5487,5492,5500,5505,5513,5517,5525,5529,5537,5541,5547,5552,5560,5565,5573,5578,5582,5587,5592],{"type":35,"tag":44,"props":4727,"children":4728},{},[4729],{"type":41,"value":4730},"In this article, we will cover Git features such as LFS and sparse checkout, as well as how to properly configure Unreal Engine so that multiple users can work on the same layer at the same time. We will also set up a Gitea Cloud instance for our Git server.",{"type":35,"tag":36,"props":4732,"children":4734},{"id":4733},"prerequisites",[4735],{"type":41,"value":4736},"Prerequisites",{"type":35,"tag":62,"props":4738,"children":4739},{},[4740,4754,4768],{"type":35,"tag":66,"props":4741,"children":4742},{},[4743,4745,4752],{"type":41,"value":4744},"A ",{"type":35,"tag":165,"props":4746,"children":4749},{"href":4747,"rel":4748},"https://cloud.gitea.com",[169],[4750],{"type":41,"value":4751},"Gitea Cloud",{"type":41,"value":4753}," instance. We will show you how to set it up.",{"type":35,"tag":66,"props":4755,"children":4756},{},[4757,4759,4766],{"type":41,"value":4758},"You need ",{"type":35,"tag":165,"props":4760,"children":4763},{"href":4761,"rel":4762},"https://www.unrealengine.com/en-US",[169],[4764],{"type":41,"value":4765},"Unreal Engine",{"type":41,"value":4767}," and a proper content example, which you can get from Epic Games Store",{"type":35,"tag":66,"props":4769,"children":4770},{},[4771,4773,4780],{"type":41,"value":4772},"A Git client or the Git command line. We will use ",{"type":35,"tag":165,"props":4774,"children":4777},{"href":4775,"rel":4776},"https://www.anchorpoint.app/",[169],[4778],{"type":41,"value":4779},"Anchorpoint",{"type":41,"value":4781}," in this tutorial, which is optimized for game development",{"type":35,"tag":36,"props":4783,"children":4785},{"id":4784},"the-differences-between-game-and-software-development",[4786],{"type":41,"value":4787},"The differences between game and software development",{"type":35,"tag":44,"props":4789,"children":4790},{},[4791],{"type":41,"value":4792},"Although the workflows are very similar to software development, game development has two additional challenges that software development does not.",{"type":35,"tag":50,"props":4794,"children":4796},{"id":4795},"heavy-binary-files",[4797],{"type":41,"value":4798},"Heavy binary files",{"type":35,"tag":44,"props":4800,"children":4801},{},[4802],{"type":41,"value":4803},"Textures, 3D models, audio, etc. are all binary files that cannot be properly diffed and merged. To overcome these problems, we need to use the Git LFS to store binaries and use file locking to prevent merge conflicts.",{"type":35,"tag":50,"props":4805,"children":4807},{"id":4806},"it-involves-artists",[4808],{"type":41,"value":4809},"It involves artists",{"type":35,"tag":44,"props":4811,"children":4812},{},[4813],{"type":41,"value":4814},"It involves non-technical people who may not be familiar with Git at all. We need to keep things as simple as possible.",{"type":35,"tag":50,"props":4816,"children":4818},{"id":4817},"git-lfs",[4819],{"type":41,"value":4820},"Git LFS",{"type":35,"tag":44,"props":4822,"children":4823},{},[4824],{"type":41,"value":4825},"Git Large File Storage (LFS) is an extension that stores binary files in a dedicated space (usually in an object store). In the Git repository itself, it stores a small pointer file pointing to the original file. Most Git GUIs support Git LFS with a little configuration up front.",{"type":35,"tag":50,"props":4827,"children":4829},{"id":4828},"a-gui",[4830],{"type":41,"value":4831},"A GUI",{"type":35,"tag":44,"props":4833,"children":4834},{},[4835],{"type":41,"value":4836},"The Git command line may not be the most comfortable interface for non-technical people. A GUI will provide a visual interface offering an alternative for them. In this article, we will use Anchorpoint, which is optimized for artists and therefore comes with a simpler UI and file locking.",{"type":35,"tag":36,"props":4838,"children":4840},{"id":4839},"setting-up-your-unreal-engine-project",[4841],{"type":41,"value":4842},"Setting up your Unreal Engine project",{"type":35,"tag":44,"props":4844,"children":4845},{},[4846],{"type":41,"value":4847},"Unreal Engine comes with a built-in git plugin, but we don't recommend using it. The problem is that it performs a \"git add\" command after every backup of a file, which slows down development due to it doing a scan on every file in your project. There is a better version of the Git plugin called \"Project Borealis\" if you want to use it in Unreal Engine.",{"type":35,"tag":44,"props":4849,"children":4850},{},[4851],{"type":41,"value":4852},"We will also use a feature called World Partition. As mentioned above, you need to lock files to prevent conflicts. If we want to work on an open world game, only one person can work on the level file because it's locked. This definitely slows down the development process. World Partition splits the level file into small files, so there is no need to lock the whole level. Multiple people can work on the same level, and our commit size is smaller because these subfiles are much smaller than the whole level file.",{"type":35,"tag":44,"props":4854,"children":4855},{},[4856],{"type":35,"tag":741,"props":4857,"children":4859},{"alt":4858,"src":4716},"Your project in Unreal Engine",[],{"type":35,"tag":44,"props":4861,"children":4862},{},[4863],{"type":41,"value":4858},{"type":35,"tag":44,"props":4865,"children":4866},{},[4867],{"type":41,"value":4868},"A game development project consists not only of the game engine, but also the art files created in Blender, Photoshop, Substance Designer, or any other content creation application. We want to put them into our Git repository as well, to have everything in one place. This works well for a small team where access control is not an issue. If your team is larger, it might make sense to put the art files in a different Git repository so that you can control who has access to the Unreal Engine project and who has access to the art files.",{"type":35,"tag":44,"props":4870,"children":4871},{},[4872],{"type":35,"tag":741,"props":4873,"children":4876},{"alt":4874,"src":4875},"The project structure that includes the assets, created in a DCC such as Blender","/img/tutorials/gitea-game-development/Untitled%201.png",[],{"type":35,"tag":44,"props":4878,"children":4879},{},[4880],{"type":41,"value":4874},{"type":35,"tag":36,"props":4882,"children":4884},{"id":4883},"setting-up-our-gitea-instance",[4885],{"type":41,"value":4886},"Setting up our Gitea instance",{"type":35,"tag":44,"props":4888,"children":4889},{},[4890,4892,4899],{"type":41,"value":4891},"We will be using a ",{"type":35,"tag":165,"props":4893,"children":4896},{"href":4894,"rel":4895},"https://cloud.gitea.com/",[169],[4897],{"type":41,"value":4898},"Gitea Cloud instance",{"type":41,"value":4900},". This is a managed offering of the open-source Gitea project from CommitGo. It includes support, backups, managed CI/CD runners, and everything else you would have to do if you set up a Gitea server yourself. A Gitea Cloud instance runs on its own dedicated infrastructure, so we don't have to worry about speed issues when network demand is high, or any noisy neighbours. This tutorial will still work if you wish to setup and manage an instance yourself.",{"type":35,"tag":50,"props":4902,"children":4904},{"id":4903},"additional-note-about-the-gitea-cloud-trial",[4905],{"type":41,"value":4906},"Additional note about the Gitea Cloud trial",{"type":35,"tag":44,"props":4908,"children":4909},{},[4910],{"type":41,"value":4911},"For instances with less than 20 users a Gitea Cloud instance comes with a 30 day trial, so you'll have plenty of time to try it out. However, the trial does not include the additional storage add-on, which you'll need for significant Git LFS usage. If you don't want to commit to a paid plan yet, you can start your trial without the storage add-on, and you'll still get 10GB per user for free anyway. You can always buy more storage later.",{"type":35,"tag":44,"props":4913,"children":4914},{},[4915],{"type":35,"tag":741,"props":4916,"children":4919},{"alt":4917,"src":4918},"Go to cloud.gitea.com and create a new Gitea Cloud account","/img/tutorials/gitea-game-development/1.webp",[],{"type":35,"tag":44,"props":4921,"children":4922},{},[4923,4925,4931],{"type":41,"value":4924},"Go to ",{"type":35,"tag":165,"props":4926,"children":4928},{"href":4894,"rel":4927},[169],[4929],{"type":41,"value":4930},"cloud.gitea.com",{"type":41,"value":4932}," and create a new Gitea Cloud account",{"type":35,"tag":44,"props":4934,"children":4935},{},[4936],{"type":35,"tag":741,"props":4937,"children":4940},{"alt":4938,"src":4939},"Create a new instance ","/img/tutorials/gitea-game-development/2.webp",[],{"type":35,"tag":44,"props":4942,"children":4943},{},[4944],{"type":41,"value":4945},"Create a new instance",{"type":35,"tag":44,"props":4947,"children":4948},{},[4949],{"type":35,"tag":741,"props":4950,"children":4953},{"alt":4951,"src":4952},"Pick a cloud provider of your preference and a region that is closest to you","/img/tutorials/gitea-game-development/3.webp",[],{"type":35,"tag":44,"props":4955,"children":4956},{},[4957],{"type":41,"value":4951},{"type":35,"tag":44,"props":4959,"children":4960},{},[4961],{"type":35,"tag":741,"props":4962,"children":4965},{"alt":4963,"src":4964},"Enter the name of your studio and create an account for the main admin of the cloud instance","/img/tutorials/gitea-game-development/4.webp",[],{"type":35,"tag":44,"props":4967,"children":4968},{},[4969],{"type":41,"value":4963},{"type":35,"tag":44,"props":4971,"children":4972},{},[4973],{"type":35,"tag":741,"props":4974,"children":4977},{"alt":4975,"src":4976},"Normally, the default maintenance timeframe is fine. This is where the server may be unavailable for a short time due to updates. Pick something that is not during your working hours when a lot of pushes and pulls might happen.","/img/tutorials/gitea-game-development/5.webp",[],{"type":35,"tag":44,"props":4979,"children":4980},{},[4981],{"type":41,"value":4975},{"type":35,"tag":44,"props":4983,"children":4984},{},[4985],{"type":35,"tag":741,"props":4986,"children":4989},{"alt":4987,"src":4988},"Add your users and additional \"Object Storage\". This is the storage that will be used for our Git LFS data. Note that this is not only the size of your project, but also the project history. Gitea does not charge for traffic (which includes all your pulls/downloads from the server). When you reach a certain threshold, your speed will be slightly reduced until the next month. The next step is to add payment information to get your instance running.","/img/tutorials/gitea-game-development/6.webp",[],{"type":35,"tag":44,"props":4991,"children":4992},{},[4993],{"type":41,"value":4987},{"type":35,"tag":44,"props":4995,"children":4996},{},[4997],{"type":35,"tag":741,"props":4998,"children":5001},{"alt":4999,"src":5000},"Your Gitea instance should be running. Access it by clicking on the endpoint domain.","/img/tutorials/gitea-game-development/7.webp",[],{"type":35,"tag":44,"props":5003,"children":5004},{},[5005],{"type":41,"value":4999},{"type":35,"tag":36,"props":5007,"children":5009},{"id":5008},"creating-a-repository-in-gitea",[5010],{"type":41,"value":5011},"Creating a repository in Gitea",{"type":35,"tag":44,"props":5013,"children":5014},{},[5015],{"type":41,"value":5016},"Once we have a running instance, we want to create our Git repository and add a team member. If you are familiar with Gitea, you can skip to the next section.",{"type":35,"tag":44,"props":5018,"children":5019},{},[5020],{"type":35,"tag":741,"props":5021,"children":5024},{"alt":5022,"src":5023},"Sign in and use the same credentials that you have used to setup your instance","/img/tutorials/gitea-game-development/8.webp",[],{"type":35,"tag":44,"props":5026,"children":5027},{},[5028],{"type":41,"value":5029},"Sign in with credentials that you provided during the instance setup",{"type":35,"tag":44,"props":5031,"children":5032},{},[5033],{"type":35,"tag":741,"props":5034,"children":5037},{"alt":5035,"src":5036},"Create a new Git repository","/img/tutorials/gitea-game-development/9.webp",[],{"type":35,"tag":44,"props":5039,"children":5040},{},[5041],{"type":41,"value":5035},{"type":35,"tag":44,"props":5043,"children":5044},{},[5045],{"type":35,"tag":741,"props":5046,"children":5049},{"alt":5047,"src":5048},"Enter a meaningful repository name. Make it private. Especially if you're using paid assets from an asset store, you don't want them available for unrestricted download on the Internet.","/img/tutorials/gitea-game-development/10.webp",[],{"type":35,"tag":44,"props":5051,"children":5052},{},[5053],{"type":41,"value":5047},{"type":35,"tag":44,"props":5055,"children":5056},{},[5057],{"type":35,"tag":741,"props":5058,"children":5061},{"alt":5059,"src":5060},"Copy the repository link to clipboard. You will use it later in your Git client","/img/tutorials/gitea-game-development/11.webp",[],{"type":35,"tag":44,"props":5063,"children":5064},{},[5065],{"type":41,"value":5059},{"type":35,"tag":36,"props":5067,"children":5069},{"id":5068},"pushing-files-to-your-instance-with-anchorpoint",[5070],{"type":41,"value":5071},"Pushing files to your instance with Anchorpoint",{"type":35,"tag":44,"props":5073,"children":5074},{},[5075,5077,5084],{"type":41,"value":5076},"You can also use the Git command line or another Git client. Once you have ",{"type":35,"tag":165,"props":5078,"children":5081},{"href":5079,"rel":5080},"https://www.anchorpoint.app/download",[169],[5082],{"type":41,"value":5083},"downloaded",{"type":41,"value":5085}," and installed Anchorpoint, it will start a trial version with access to all features. A free version is also available.",{"type":35,"tag":44,"props":5087,"children":5088},{},[5089],{"type":35,"tag":741,"props":5090,"children":5093},{"alt":5091,"src":5092},"Scroll to the projects section and click on “New Project”","/img/tutorials/gitea-game-development/12.webp",[],{"type":35,"tag":44,"props":5095,"children":5096},{},[5097],{"type":41,"value":5091},{"type":35,"tag":44,"props":5099,"children":5100},{},[5101],{"type":35,"tag":741,"props":5102,"children":5105},{"alt":5103,"src":5104},"Browse to your Unreal Engine project and under \"Remote Settings\" select \"Connect existing repository via https\". Anchorpoint will then try to authenticate with Gitea. Click on \"Login to Git\".","/img/tutorials/gitea-game-development/13.webp",[],{"type":35,"tag":44,"props":5107,"children":5108},{},[5109],{"type":41,"value":5103},{"type":35,"tag":44,"props":5111,"children":5112},{},[5113],{"type":35,"tag":741,"props":5114,"children":5117},{"alt":5115,"src":5116},"The \"Login to Git\" button will redirect you to your Gitea instance and ask for authorization. Click \"Authorize Application\".","/img/tutorials/gitea-game-development/14.webp",[],{"type":35,"tag":44,"props":5119,"children":5120},{},[5121],{"type":41,"value":5115},{"type":35,"tag":44,"props":5123,"children":5124},{},[5125],{"type":35,"tag":741,"props":5126,"children":5129},{"alt":5127,"src":5128},"Once the authorization is complete, go back to Anchorpoint. Select a .gitignore for Unreal Engine and proceed to the next step. In the next step you will be asked to enter a project name, which is up to you. You can also skip inviting members at this point and just create the project.","/img/tutorials/gitea-game-development/15.webp",[],{"type":35,"tag":44,"props":5131,"children":5132},{},[5133],{"type":41,"value":5127},{"type":35,"tag":44,"props":5135,"children":5136},{},[5137],{"type":35,"tag":741,"props":5138,"children":5141},{"alt":5139,"src":5140},"Click on \"Timeline\" and then on \"Changed Files\". Write an appropriate message and \"sync\" all your files with Gitea. \"Sync in Anchorpoint is basically a combination of git add, commit, and push. Before adding files to Git, Anchorpoint checks all files for binaries and automatically tracks them as Git LFS.","/img/tutorials/gitea-game-development/16.webp",[],{"type":35,"tag":44,"props":5143,"children":5144},{},[5145],{"type":41,"value":5139},{"type":35,"tag":44,"props":5147,"children":5148},{},[5149],{"type":35,"tag":741,"props":5150,"children":5153},{"alt":5151,"src":5152},"Technically, Anchorpoint will first do a git lfs push before pushing the git commit. In case of a failure, you can restart the push and it will just start pushing the remaining files to the server.","/img/tutorials/gitea-game-development/17.webp",[],{"type":35,"tag":44,"props":5155,"children":5156},{},[5157],{"type":41,"value":5151},{"type":35,"tag":44,"props":5159,"children":5160},{},[5161,5163],{"type":41,"value":5162},"When you are using the command line, you have to do these things manually. Git LFS needs to be installed already. You can also use this ",{"type":35,"tag":165,"props":5164,"children":5167},{"href":5165,"rel":5166},"https://www.anchorpoint.app/blog/how-to-set-up-a-gitignore-file-for-unreal-engine",[169],[5168],{"type":41,"value":5169},".gitignore config for Unreal Engine.",{"type":35,"tag":36,"props":5171,"children":5173},{"id":5172},"using-git-lfs-from-the-command-line",[5174],{"type":41,"value":5175},"Using Git LFS from the command line",{"type":35,"tag":44,"props":5177,"children":5178},{},[5179],{"type":41,"value":5180},"Make sure to add all file types that you are using in this project.",{"type":35,"tag":221,"props":5182,"children":5184},{"code":5183},"git lfs track \"*.uasset”\n",[5185],{"type":35,"tag":228,"props":5186,"children":5187},{"__ignoreMap":8},[5188],{"type":41,"value":5183},{"type":35,"tag":44,"props":5190,"children":5191},{},[5192],{"type":41,"value":5193},"Stage your files",{"type":35,"tag":221,"props":5195,"children":5197},{"code":5196},"git add .\n",[5198],{"type":35,"tag":228,"props":5199,"children":5200},{"__ignoreMap":8},[5201],{"type":41,"value":5196},{"type":35,"tag":44,"props":5203,"children":5204},{},[5205],{"type":41,"value":5206},"Make a commit with the message \"Initial commit\"",{"type":35,"tag":221,"props":5208,"children":5210},{"code":5209},"git commit -m \"Initial commit\"\n",[5211],{"type":35,"tag":228,"props":5212,"children":5213},{"__ignoreMap":8},[5214],{"type":41,"value":5209},{"type":35,"tag":44,"props":5216,"children":5217},{},[5218],{"type":41,"value":5219},"Create the remote branch (you only have to do this once)",{"type":35,"tag":221,"props":5221,"children":5223},{"code":5222},"git branch -M main\n",[5224],{"type":35,"tag":228,"props":5225,"children":5226},{"__ignoreMap":8},[5227],{"type":41,"value":5222},{"type":35,"tag":221,"props":5229,"children":5231},{"code":5230},"git remote add origin REPOSITORYURL\n",[5232],{"type":35,"tag":228,"props":5233,"children":5234},{"__ignoreMap":8},[5235],{"type":41,"value":5230},{"type":35,"tag":44,"props":5237,"children":5238},{},[5239],{"type":41,"value":5240},"Push the files to Gitea",{"type":35,"tag":221,"props":5242,"children":5244},{"code":5243},"git push -u origin main\n",[5245],{"type":35,"tag":228,"props":5246,"children":5247},{"__ignoreMap":8},[5248],{"type":41,"value":5243},{"type":35,"tag":44,"props":5250,"children":5251},{},[5252],{"type":35,"tag":741,"props":5253,"children":5256},{"alt":5254,"src":5255},"Once our files are pushed, they should be on Gitea. Refresh the repository page to see them.","/img/tutorials/gitea-game-development/18.webp",[],{"type":35,"tag":44,"props":5258,"children":5259},{},[5260],{"type":41,"value":5254},{"type":35,"tag":36,"props":5262,"children":5264},{"id":5263},"working-in-unreal-engine",[5265],{"type":41,"value":5266},"Working in Unreal Engine",{"type":35,"tag":44,"props":5268,"children":5269},{},[5270],{"type":41,"value":5271},"When you modify files in Unreal Engine, you need to make sure that no one else is working on them to prevent conflicts. This is where file locking comes in. Anchorpoint locks files for others immediately after you change them. It uses its own file locking system that works in real time.",{"type":35,"tag":44,"props":5273,"children":5274},{},[5275],{"type":35,"tag":741,"props":5276,"children":5279},{"alt":5277,"src":5278},"You will see that Anchorpoint has detected the file change. Changed files are automatically locked for other members.","/img/tutorials/gitea-game-development/19.webp",[],{"type":35,"tag":44,"props":5281,"children":5282},{},[5283],{"type":41,"value":5277},{"type":35,"tag":50,"props":5285,"children":5287},{"id":5286},"git-lfs-file-locking",[5288],{"type":41,"value":5289},"Git LFS file locking",{"type":35,"tag":44,"props":5291,"children":5292},{},[5293,5295,5300],{"type":41,"value":5294},"If you want to use the command line, you can still use the native Git LFS file locking. Keep in mind that the file is locked on the other side only after executing a Git fetch command. First of all, you need to set up your .gitattributes file and add the ",{"type":35,"tag":228,"props":5296,"children":5297},{"className":8},[5298],{"type":41,"value":5299},"--lockable",{"type":41,"value":5301}," flag to the end of each file. For example:",{"type":35,"tag":221,"props":5303,"children":5306},{"code":5304,"language":41,"meta":8,"className":5305,"style":8},".uasset filter=lfs diff=lfs merge=lfs -text --lockable\n","language-text shiki shiki-themes github-dark",[5307],{"type":35,"tag":228,"props":5308,"children":5309},{"__ignoreMap":8},[5310],{"type":35,"tag":232,"props":5311,"children":5312},{"class":234,"line":235},[5313],{"type":35,"tag":232,"props":5314,"children":5315},{},[5316],{"type":41,"value":5304},{"type":35,"tag":50,"props":5318,"children":5320},{"id":5319},"locking-and-unlocking-files",[5321],{"type":41,"value":5322},"Locking and Unlocking Files",{"type":35,"tag":44,"props":5324,"children":5325},{},[5326],{"type":41,"value":5327},"To lock a file from the command line, use the following command:",{"type":35,"tag":221,"props":5329,"children":5331},{"code":5330},"git lfs lock \u003Cfilename>\n",[5332],{"type":35,"tag":228,"props":5333,"children":5334},{"__ignoreMap":8},[5335],{"type":41,"value":5330},{"type":35,"tag":44,"props":5337,"children":5338},{},[5339],{"type":41,"value":5340},"To unlock a file, use:",{"type":35,"tag":221,"props":5342,"children":5344},{"code":5343},"git lfs unlock \u003Cfilename>\n",[5345],{"type":35,"tag":228,"props":5346,"children":5347},{"__ignoreMap":8},[5348],{"type":41,"value":5343},{"type":35,"tag":44,"props":5350,"children":5351},{},[5352],{"type":41,"value":5353},"To see all files that are locked, use:",{"type":35,"tag":221,"props":5355,"children":5357},{"code":5356},"git lfs locks\n",[5358],{"type":35,"tag":228,"props":5359,"children":5360},{"__ignoreMap":8},[5361],{"type":41,"value":5356},{"type":35,"tag":44,"props":5363,"children":5364},{},[5365],{"type":41,"value":5366},"To unlock files from other people who have forgotten to unlock them, use:",{"type":35,"tag":221,"props":5368,"children":5370},{"code":5369},"git lfs unlock \u003Cfilename> --force\n",[5371],{"type":35,"tag":228,"props":5372,"children":5373},{"__ignoreMap":8},[5374],{"type":41,"value":5369},{"type":35,"tag":36,"props":5376,"children":5378},{"id":5377},"adding-members-to-your-project",[5379],{"type":41,"value":5380},"Adding members to your project",{"type":35,"tag":44,"props":5382,"children":5383},{},[5384],{"type":41,"value":5385},"We need to add members to our Gitea server as well as to Anchorpoint via email. This process only needs to be done once. Later we can quickly assign them to the repository/project.",{"type":35,"tag":44,"props":5387,"children":5388},{},[5389],{"type":35,"tag":741,"props":5390,"children":5393},{"alt":5391,"src":5392},"On Gitea, go to your profile picture and from the menu pick “Site Administration”","/img/tutorials/gitea-game-development/20.webp",[],{"type":35,"tag":44,"props":5395,"children":5396},{},[5397],{"type":41,"value":5391},{"type":35,"tag":44,"props":5399,"children":5400},{},[5401],{"type":35,"tag":741,"props":5402,"children":5405},{"alt":5403,"src":5404},"Click on User Accounts and pick “Create User Account”","/img/tutorials/gitea-game-development/21.webp",[],{"type":35,"tag":44,"props":5407,"children":5408},{},[5409],{"type":41,"value":5403},{"type":35,"tag":44,"props":5411,"children":5412},{},[5413],{"type":35,"tag":741,"props":5414,"children":5417},{"alt":5415,"src":5416},"Add a new user, using the email address and a username, that will be required for the login. Now, you have added your user to your site.","/img/tutorials/gitea-game-development/22.webp",[],{"type":35,"tag":44,"props":5419,"children":5420},{},[5421],{"type":41,"value":5415},{"type":35,"tag":44,"props":5423,"children":5424},{},[5425],{"type":35,"tag":741,"props":5426,"children":5429},{"alt":5427,"src":5428},"The user needs to be assigned to the repository. Go to your repository and click on “Settings”.","/img/tutorials/gitea-game-development/23.webp",[],{"type":35,"tag":44,"props":5431,"children":5432},{},[5433],{"type":41,"value":5427},{"type":35,"tag":44,"props":5435,"children":5436},{},[5437],{"type":35,"tag":741,"props":5438,"children":5441},{"alt":5439,"src":5440},"Under Collaborators, pick “Add Collaborator” and pick your newly created user","/img/tutorials/gitea-game-development/24.webp",[],{"type":35,"tag":44,"props":5443,"children":5444},{},[5445],{"type":41,"value":5439},{"type":35,"tag":44,"props":5447,"children":5448},{},[5449],{"type":35,"tag":741,"props":5450,"children":5453},{"alt":5451,"src":5452},"In Anchorpoint, go to “Project Settings” and pick “Members”","/img/tutorials/gitea-game-development/25.webp",[],{"type":35,"tag":44,"props":5455,"children":5456},{},[5457],{"type":41,"value":5451},{"type":35,"tag":44,"props":5459,"children":5460},{},[5461],{"type":35,"tag":741,"props":5462,"children":5465},{"alt":5463,"src":5464},"Click on Assign Members and add your user with the same email that you used in Gitea.","/img/tutorials/gitea-game-development/26.webp",[],{"type":35,"tag":44,"props":5467,"children":5468},{},[5469],{"type":41,"value":5463},{"type":35,"tag":36,"props":5471,"children":5473},{"id":5472},"participating-as-another-member",[5474],{"type":41,"value":5475},"Participating as another member",{"type":35,"tag":44,"props":5477,"children":5478},{},[5479],{"type":41,"value":5480},"If your member is added to Gitea and Anchorpoint, she can clone the Git repository. If your team member only wants to work on the Unreal Engine project and not the art files, she can use Git sparse checkout to download only the Engine folder. Sparse checkout allows you to work with huge TB repositories.",{"type":35,"tag":50,"props":5482,"children":5484},{"id":5483},"join-the-git-repository-and-pick-the-folders-you-want-to-download-in-anchorpoint",[5485],{"type":41,"value":5486},"Join the Git repository and pick the folders you want to download in Anchorpoint",{"type":35,"tag":44,"props":5488,"children":5489},{},[5490],{"type":41,"value":5491},"When other members open Anchorpoint, they are invited to your workspace. Then they need to click on your project name and press the big blue \"Join Git repository\" button.",{"type":35,"tag":44,"props":5493,"children":5494},{},[5495],{"type":35,"tag":741,"props":5496,"children":5499},{"alt":5497,"src":5498},"When you are invited to join an Anchorpoint project as another member, you will be asked to join the Git repository. ","/img/tutorials/gitea-game-development/27.webp",[],{"type":35,"tag":44,"props":5501,"children":5502},{},[5503],{"type":41,"value":5504},"When you are invited to join an Anchorpoint project as another member, you will be asked to join the Git repository.",{"type":35,"tag":44,"props":5506,"children":5507},{},[5508],{"type":35,"tag":741,"props":5509,"children":5512},{"alt":5510,"src":5511},"The first step is to login to Git like we did when we created the repository","/img/tutorials/gitea-game-development/28.webp",[],{"type":35,"tag":44,"props":5514,"children":5515},{},[5516],{"type":41,"value":5510},{"type":35,"tag":44,"props":5518,"children":5519},{},[5520],{"type":35,"tag":741,"props":5521,"children":5524},{"alt":5522,"src":5523},"Disable the “Download Everything” checkbox to selectively pick what you want to work on","/img/tutorials/gitea-game-development/29.webp",[],{"type":35,"tag":44,"props":5526,"children":5527},{},[5528],{"type":41,"value":5522},{"type":35,"tag":44,"props":5530,"children":5531},{},[5532],{"type":35,"tag":741,"props":5533,"children":5536},{"alt":5534,"src":5535},"Pick the “Engine” folder and click on “Download Engine” if you would like to only work on the Unreal Engine project and not on the art assets.","/img/tutorials/gitea-game-development/30.webp",[],{"type":35,"tag":44,"props":5538,"children":5539},{},[5540],{"type":41,"value":5534},{"type":35,"tag":50,"props":5542,"children":5544},{"id":5543},"sparse-checkout-using-git-command-line",[5545],{"type":41,"value":5546},"Sparse Checkout using Git command line",{"type":35,"tag":44,"props":5548,"children":5549},{},[5550],{"type":41,"value":5551},"In the command line, you have to use these commands. To checkout the repository without downloading any content of a subfolder, use:",{"type":35,"tag":221,"props":5553,"children":5555},{"code":5554},"git clone REPOSITORYURL --sparse\n",[5556],{"type":35,"tag":228,"props":5557,"children":5558},{"__ignoreMap":8},[5559],{"type":41,"value":5554},{"type":35,"tag":44,"props":5561,"children":5562},{},[5563],{"type":41,"value":5564},"To download the \"engine\" folder only, use:",{"type":35,"tag":221,"props":5566,"children":5568},{"code":5567},"git sparse-checkout add Engine\n",[5569],{"type":35,"tag":228,"props":5570,"children":5571},{"__ignoreMap":8},[5572],{"type":41,"value":5567},{"type":35,"tag":44,"props":5574,"children":5575},{},[5576],{"type":41,"value":5577},"This will download the “Engine” folder, including all its subfolders.",{"type":35,"tag":36,"props":5579,"children":5580},{"id":3479},[5581],{"type":41,"value":3482},{"type":35,"tag":44,"props":5583,"children":5584},{},[5585],{"type":41,"value":5586},"Thanks to the monorepo movement, new features like sparse checkout in Git make it more scalable, and with Git LFS it can be used in game development. Especially for indie and AA development, it is a good choice because you benefit from the huge Git ecosystem.",{"type":35,"tag":44,"props":5588,"children":5589},{},[5590],{"type":41,"value":5591},"We hope you enjoyed this article and that it helped you understand how to set up a Gitea Cloud instance for your next Unreal Engine, Unity or Godot project.",{"type":35,"tag":1651,"props":5593,"children":5594},{},[5595],{"type":41,"value":1655},{"title":8,"searchDepth":245,"depth":245,"links":5597},[5598,5599,5605,5606,5609,5610,5611,5612,5616,5617,5621],{"id":4733,"depth":245,"text":4736},{"id":4784,"depth":245,"text":4787,"children":5600},[5601,5602,5603,5604],{"id":4795,"depth":266,"text":4798},{"id":4806,"depth":266,"text":4809},{"id":4817,"depth":266,"text":4820},{"id":4828,"depth":266,"text":4831},{"id":4839,"depth":245,"text":4842},{"id":4883,"depth":245,"text":4886,"children":5607},[5608],{"id":4903,"depth":266,"text":4906},{"id":5008,"depth":245,"text":5011},{"id":5068,"depth":245,"text":5071},{"id":5172,"depth":245,"text":5175},{"id":5263,"depth":245,"text":5266,"children":5613},[5614,5615],{"id":5286,"depth":266,"text":5289},{"id":5319,"depth":266,"text":5322},{"id":5377,"depth":245,"text":5380},{"id":5472,"depth":245,"text":5475,"children":5618},[5619,5620],{"id":5483,"depth":266,"text":5486},{"id":5543,"depth":266,"text":5546},{"id":3479,"depth":245,"text":3482},"content:resources:tutorials:5.game-development-on-gitea-cloud.md","resources/tutorials/5.game-development-on-gitea-cloud.md",{"_path":5625,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":5626,"description":5627,"labels":5628,"category":5631,"author":5633,"coverImage":5634,"datetime":5635,"date":5636,"readingTime":5637,"body":5641,"_type":1680,"_id":6585,"_source":1682,"_file":6586,"_extension":1684},"/resources/tutorials/gitea-integrate-sonarqube","Integrating Gitea with Sonarqube for Enhanced Code Quality: A Step-by-Step Guide","It's very important to upgrade your open source dependencies",[11,5629,5630],"actions","sonarqube",{"title":4640,"href":5632},"/resources/tutorials?category=security",{"name":18,"href":19,"imageUrl":20,"role":21},"/img/tutorials/gitea-integrate-sonarqube/sonarqube-screenshot.png","2024-01-29 12:00:00","2024-01-29",{"text":27,"minutes":5638,"time":5639,"words":5640},2.135,128100,427,{"type":32,"children":5642,"toc":6580},[5643,5648,5653,5657,5670,5675,5681,5693,6112,6117,6139,6152,6158,6171,6176,6519,6543,6552,6557,6565,6570,6576],{"type":35,"tag":44,"props":5644,"children":5645},{},[5646],{"type":41,"value":5647},"Sonarqube is a static code analysis tool with a B/S architecture that helps identify code defects, quickly locate potential or obvious errors in code, improve code quality, and enhance development speed. It supports code quality management and detection for over twenty programming languages, including Java, C, C++, JavaScript, etc., through plugin integration.",{"type":35,"tag":44,"props":5649,"children":5650},{},[5651],{"type":41,"value":5652},"This blog post will guide you on how to integrate Gitea with Sonarqube using Gitea Actions.",{"type":35,"tag":36,"props":5654,"children":5655},{"id":4733},[5656],{"type":41,"value":4736},{"type":35,"tag":44,"props":5658,"children":5659},{},[5660,5662,5669],{"type":41,"value":5661},"Firstly, ensure that you have installed Gitea version 1.19 or above, have enabled Actions support, and have at least one available runner. For information on installing Gitea, refer to the official documentation ",{"type":35,"tag":165,"props":5663,"children":5666},{"href":5664,"rel":5665},"https://docs.gitea.com/installation/database-prep",[169],[5667],{"type":41,"value":5668},"Install Gitea",{"type":41,"value":1865},{"type":35,"tag":44,"props":5671,"children":5672},{},[5673],{"type":41,"value":5674},"Secondly, you need to have a successfully installed Sonarqube. If Sonarqube is not installed yet, you can follow the quick installation method outlined below.",{"type":35,"tag":36,"props":5676,"children":5678},{"id":5677},"sonarqube-docker-compose-installation",[5679],{"type":41,"value":5680},"Sonarqube Docker Compose Installation",{"type":35,"tag":44,"props":5682,"children":5683},{},[5684,5686,5691],{"type":41,"value":5685},"Make sure Docker and Docker Compose are installed. Then, create a folder and a file named ",{"type":35,"tag":228,"props":5687,"children":5688},{"className":8},[5689],{"type":41,"value":5690},"compose.yml",{"type":41,"value":5692}," with the following content.",{"type":35,"tag":221,"props":5694,"children":5696},{"className":2083,"code":5695,"language":2085,"meta":8,"style":8},"version: \"3\"\n\nservices:\n  sonarqube:\n    image: sonarqube:community\n    depends_on:\n      - db\n    environment:\n      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar\n      SONAR_JDBC_USERNAME: sonar\n      SONAR_JDBC_PASSWORD: sonar\n    volumes:\n      - sonarqube_data:/opt/sonarqube/data\n      - sonarqube_extensions:/opt/sonarqube/extensions\n      - sonarqube_logs:/opt/sonarqube/logs\n    ports:\n      - \"9000:9000\"\n  db:\n    image: postgres:12\n    environment:\n      POSTGRES_USER: sonar\n      POSTGRES_PASSWORD: sonar\n    volumes:\n      - postgresql:/var/lib/postgresql\n      - postgresql_data:/var/lib/postgresql/data\n\nvolumes:\n  sonarqube_data:\n  sonarqube_extensions:\n  sonarqube_logs:\n  postgresql:\n  postgresql_data:\n\n",[5697],{"type":35,"tag":228,"props":5698,"children":5699},{"__ignoreMap":8},[5700,5717,5724,5736,5748,5765,5777,5789,5801,5818,5835,5851,5863,5875,5887,5899,5911,5923,5935,5951,5962,5978,5994,6005,6017,6029,6036,6048,6060,6073,6086,6099],{"type":35,"tag":232,"props":5701,"children":5702},{"class":234,"line":235},[5703,5708,5712],{"type":35,"tag":232,"props":5704,"children":5705},{"style":2095},[5706],{"type":41,"value":5707},"version",{"type":35,"tag":232,"props":5709,"children":5710},{"style":389},[5711],{"type":41,"value":430},{"type":35,"tag":232,"props":5713,"children":5714},{"style":255},[5715],{"type":41,"value":5716},"\"3\"\n",{"type":35,"tag":232,"props":5718,"children":5719},{"class":234,"line":245},[5720],{"type":35,"tag":232,"props":5721,"children":5722},{"emptyLinePlaceholder":270},[5723],{"type":41,"value":273},{"type":35,"tag":232,"props":5725,"children":5726},{"class":234,"line":266},[5727,5732],{"type":35,"tag":232,"props":5728,"children":5729},{"style":2095},[5730],{"type":41,"value":5731},"services",{"type":35,"tag":232,"props":5733,"children":5734},{"style":389},[5735],{"type":41,"value":2127},{"type":35,"tag":232,"props":5737,"children":5738},{"class":234,"line":276},[5739,5744],{"type":35,"tag":232,"props":5740,"children":5741},{"style":2095},[5742],{"type":41,"value":5743},"  sonarqube",{"type":35,"tag":232,"props":5745,"children":5746},{"style":389},[5747],{"type":41,"value":2127},{"type":35,"tag":232,"props":5749,"children":5750},{"class":234,"line":285},[5751,5756,5760],{"type":35,"tag":232,"props":5752,"children":5753},{"style":2095},[5754],{"type":41,"value":5755},"    image",{"type":35,"tag":232,"props":5757,"children":5758},{"style":389},[5759],{"type":41,"value":430},{"type":35,"tag":232,"props":5761,"children":5762},{"style":255},[5763],{"type":41,"value":5764},"sonarqube:community\n",{"type":35,"tag":232,"props":5766,"children":5767},{"class":234,"line":300},[5768,5773],{"type":35,"tag":232,"props":5769,"children":5770},{"style":2095},[5771],{"type":41,"value":5772},"    depends_on",{"type":35,"tag":232,"props":5774,"children":5775},{"style":389},[5776],{"type":41,"value":2127},{"type":35,"tag":232,"props":5778,"children":5779},{"class":234,"line":314},[5780,5784],{"type":35,"tag":232,"props":5781,"children":5782},{"style":389},[5783],{"type":41,"value":2159},{"type":35,"tag":232,"props":5785,"children":5786},{"style":255},[5787],{"type":41,"value":5788},"db\n",{"type":35,"tag":232,"props":5790,"children":5791},{"class":234,"line":322},[5792,5797],{"type":35,"tag":232,"props":5793,"children":5794},{"style":2095},[5795],{"type":41,"value":5796},"    environment",{"type":35,"tag":232,"props":5798,"children":5799},{"style":389},[5800],{"type":41,"value":2127},{"type":35,"tag":232,"props":5802,"children":5803},{"class":234,"line":331},[5804,5809,5813],{"type":35,"tag":232,"props":5805,"children":5806},{"style":2095},[5807],{"type":41,"value":5808},"      SONAR_JDBC_URL",{"type":35,"tag":232,"props":5810,"children":5811},{"style":389},[5812],{"type":41,"value":430},{"type":35,"tag":232,"props":5814,"children":5815},{"style":255},[5816],{"type":41,"value":5817},"jdbc:postgresql://db:5432/sonar\n",{"type":35,"tag":232,"props":5819,"children":5820},{"class":234,"line":524},[5821,5826,5830],{"type":35,"tag":232,"props":5822,"children":5823},{"style":2095},[5824],{"type":41,"value":5825},"      SONAR_JDBC_USERNAME",{"type":35,"tag":232,"props":5827,"children":5828},{"style":389},[5829],{"type":41,"value":430},{"type":35,"tag":232,"props":5831,"children":5832},{"style":255},[5833],{"type":41,"value":5834},"sonar\n",{"type":35,"tag":232,"props":5836,"children":5837},{"class":234,"line":533},[5838,5843,5847],{"type":35,"tag":232,"props":5839,"children":5840},{"style":2095},[5841],{"type":41,"value":5842},"      SONAR_JDBC_PASSWORD",{"type":35,"tag":232,"props":5844,"children":5845},{"style":389},[5846],{"type":41,"value":430},{"type":35,"tag":232,"props":5848,"children":5849},{"style":255},[5850],{"type":41,"value":5834},{"type":35,"tag":232,"props":5852,"children":5853},{"class":234,"line":542},[5854,5859],{"type":35,"tag":232,"props":5855,"children":5856},{"style":2095},[5857],{"type":41,"value":5858},"    volumes",{"type":35,"tag":232,"props":5860,"children":5861},{"style":389},[5862],{"type":41,"value":2127},{"type":35,"tag":232,"props":5864,"children":5865},{"class":234,"line":2249},[5866,5870],{"type":35,"tag":232,"props":5867,"children":5868},{"style":389},[5869],{"type":41,"value":2159},{"type":35,"tag":232,"props":5871,"children":5872},{"style":255},[5873],{"type":41,"value":5874},"sonarqube_data:/opt/sonarqube/data\n",{"type":35,"tag":232,"props":5876,"children":5877},{"class":234,"line":2262},[5878,5882],{"type":35,"tag":232,"props":5879,"children":5880},{"style":389},[5881],{"type":41,"value":2159},{"type":35,"tag":232,"props":5883,"children":5884},{"style":255},[5885],{"type":41,"value":5886},"sonarqube_extensions:/opt/sonarqube/extensions\n",{"type":35,"tag":232,"props":5888,"children":5889},{"class":234,"line":2283},[5890,5894],{"type":35,"tag":232,"props":5891,"children":5892},{"style":389},[5893],{"type":41,"value":2159},{"type":35,"tag":232,"props":5895,"children":5896},{"style":255},[5897],{"type":41,"value":5898},"sonarqube_logs:/opt/sonarqube/logs\n",{"type":35,"tag":232,"props":5900,"children":5901},{"class":234,"line":2301},[5902,5907],{"type":35,"tag":232,"props":5903,"children":5904},{"style":2095},[5905],{"type":41,"value":5906},"    ports",{"type":35,"tag":232,"props":5908,"children":5909},{"style":389},[5910],{"type":41,"value":2127},{"type":35,"tag":232,"props":5912,"children":5913},{"class":234,"line":2314},[5914,5918],{"type":35,"tag":232,"props":5915,"children":5916},{"style":389},[5917],{"type":41,"value":2159},{"type":35,"tag":232,"props":5919,"children":5920},{"style":255},[5921],{"type":41,"value":5922},"\"9000:9000\"\n",{"type":35,"tag":232,"props":5924,"children":5925},{"class":234,"line":2332},[5926,5931],{"type":35,"tag":232,"props":5927,"children":5928},{"style":2095},[5929],{"type":41,"value":5930},"  db",{"type":35,"tag":232,"props":5932,"children":5933},{"style":389},[5934],{"type":41,"value":2127},{"type":35,"tag":232,"props":5936,"children":5937},{"class":234,"line":2350},[5938,5942,5946],{"type":35,"tag":232,"props":5939,"children":5940},{"style":2095},[5941],{"type":41,"value":5755},{"type":35,"tag":232,"props":5943,"children":5944},{"style":389},[5945],{"type":41,"value":430},{"type":35,"tag":232,"props":5947,"children":5948},{"style":255},[5949],{"type":41,"value":5950},"postgres:12\n",{"type":35,"tag":232,"props":5952,"children":5953},{"class":234,"line":2368},[5954,5958],{"type":35,"tag":232,"props":5955,"children":5956},{"style":2095},[5957],{"type":41,"value":5796},{"type":35,"tag":232,"props":5959,"children":5960},{"style":389},[5961],{"type":41,"value":2127},{"type":35,"tag":232,"props":5963,"children":5964},{"class":234,"line":2386},[5965,5970,5974],{"type":35,"tag":232,"props":5966,"children":5967},{"style":2095},[5968],{"type":41,"value":5969},"      POSTGRES_USER",{"type":35,"tag":232,"props":5971,"children":5972},{"style":389},[5973],{"type":41,"value":430},{"type":35,"tag":232,"props":5975,"children":5976},{"style":255},[5977],{"type":41,"value":5834},{"type":35,"tag":232,"props":5979,"children":5980},{"class":234,"line":2404},[5981,5986,5990],{"type":35,"tag":232,"props":5982,"children":5983},{"style":2095},[5984],{"type":41,"value":5985},"      POSTGRES_PASSWORD",{"type":35,"tag":232,"props":5987,"children":5988},{"style":389},[5989],{"type":41,"value":430},{"type":35,"tag":232,"props":5991,"children":5992},{"style":255},[5993],{"type":41,"value":5834},{"type":35,"tag":232,"props":5995,"children":5996},{"class":234,"line":2767},[5997,6001],{"type":35,"tag":232,"props":5998,"children":5999},{"style":2095},[6000],{"type":41,"value":5858},{"type":35,"tag":232,"props":6002,"children":6003},{"style":389},[6004],{"type":41,"value":2127},{"type":35,"tag":232,"props":6006,"children":6007},{"class":234,"line":2785},[6008,6012],{"type":35,"tag":232,"props":6009,"children":6010},{"style":389},[6011],{"type":41,"value":2159},{"type":35,"tag":232,"props":6013,"children":6014},{"style":255},[6015],{"type":41,"value":6016},"postgresql:/var/lib/postgresql\n",{"type":35,"tag":232,"props":6018,"children":6019},{"class":234,"line":2794},[6020,6024],{"type":35,"tag":232,"props":6021,"children":6022},{"style":389},[6023],{"type":41,"value":2159},{"type":35,"tag":232,"props":6025,"children":6026},{"style":255},[6027],{"type":41,"value":6028},"postgresql_data:/var/lib/postgresql/data\n",{"type":35,"tag":232,"props":6030,"children":6031},{"class":234,"line":2802},[6032],{"type":35,"tag":232,"props":6033,"children":6034},{"emptyLinePlaceholder":270},[6035],{"type":41,"value":273},{"type":35,"tag":232,"props":6037,"children":6038},{"class":234,"line":2811},[6039,6044],{"type":35,"tag":232,"props":6040,"children":6041},{"style":2095},[6042],{"type":41,"value":6043},"volumes",{"type":35,"tag":232,"props":6045,"children":6046},{"style":389},[6047],{"type":41,"value":2127},{"type":35,"tag":232,"props":6049,"children":6050},{"class":234,"line":2819},[6051,6056],{"type":35,"tag":232,"props":6052,"children":6053},{"style":2095},[6054],{"type":41,"value":6055},"  sonarqube_data",{"type":35,"tag":232,"props":6057,"children":6058},{"style":389},[6059],{"type":41,"value":2127},{"type":35,"tag":232,"props":6061,"children":6063},{"class":234,"line":6062},29,[6064,6069],{"type":35,"tag":232,"props":6065,"children":6066},{"style":2095},[6067],{"type":41,"value":6068},"  sonarqube_extensions",{"type":35,"tag":232,"props":6070,"children":6071},{"style":389},[6072],{"type":41,"value":2127},{"type":35,"tag":232,"props":6074,"children":6076},{"class":234,"line":6075},30,[6077,6082],{"type":35,"tag":232,"props":6078,"children":6079},{"style":2095},[6080],{"type":41,"value":6081},"  sonarqube_logs",{"type":35,"tag":232,"props":6083,"children":6084},{"style":389},[6085],{"type":41,"value":2127},{"type":35,"tag":232,"props":6087,"children":6089},{"class":234,"line":6088},31,[6090,6095],{"type":35,"tag":232,"props":6091,"children":6092},{"style":2095},[6093],{"type":41,"value":6094},"  postgresql",{"type":35,"tag":232,"props":6096,"children":6097},{"style":389},[6098],{"type":41,"value":2127},{"type":35,"tag":232,"props":6100,"children":6102},{"class":234,"line":6101},32,[6103,6108],{"type":35,"tag":232,"props":6104,"children":6105},{"style":2095},[6106],{"type":41,"value":6107},"  postgresql_data",{"type":35,"tag":232,"props":6109,"children":6110},{"style":389},[6111],{"type":41,"value":2127},{"type":35,"tag":44,"props":6113,"children":6114},{},[6115],{"type":41,"value":6116},"Run the following command in the terminal:",{"type":35,"tag":221,"props":6118,"children":6122},{"className":6119,"code":6120,"language":6121,"meta":8,"style":8},"language-shell shiki shiki-themes github-dark","docker-compose up\n","shell",[6123],{"type":35,"tag":228,"props":6124,"children":6125},{"__ignoreMap":8},[6126],{"type":35,"tag":232,"props":6127,"children":6128},{"class":234,"line":235},[6129,6134],{"type":35,"tag":232,"props":6130,"children":6131},{"style":249},[6132],{"type":41,"value":6133},"docker-compose",{"type":35,"tag":232,"props":6135,"children":6136},{"style":255},[6137],{"type":41,"value":6138}," up\n",{"type":35,"tag":44,"props":6140,"children":6141},{},[6142,6144,6150],{"type":41,"value":6143},"Wait for the log output to stop, then open ",{"type":35,"tag":165,"props":6145,"children":6148},{"href":6146,"rel":6147},"http://localhost:9000",[169],[6149],{"type":41,"value":6146},{"type":41,"value":6151}," in your browser. If Sonarqube is displayed, it indicates success. The default login credentials are both admin, and you will be prompted to change the password after logging in.",{"type":35,"tag":36,"props":6153,"children":6155},{"id":6154},"create-workflows-in-gitea",[6156],{"type":41,"value":6157},"Create Workflows in Gitea",{"type":35,"tag":44,"props":6159,"children":6160},{},[6161,6163,6170],{"type":41,"value":6162},"If you are not familiar with Gitea Actions, you can refer to ",{"type":35,"tag":165,"props":6164,"children":6167},{"href":6165,"rel":6166},"https://blog.gitea.com/hacking-on-gitea-actions/",[169],[6168],{"type":41,"value":6169},"Hacking on Gitea Actions",{"type":41,"value":1865},{"type":35,"tag":44,"props":6172,"children":6173},{},[6174],{"type":41,"value":6175},"If you are already familiar with Gitea Actions, proceed to create a workflow in your repository as follows:",{"type":35,"tag":221,"props":6177,"children":6179},{"className":2083,"code":6178,"language":2085,"meta":8,"style":8},"on:\n  push:\n    branches:\n      - main\n  pull_request:\n      types: [opened, synchronize, reopened]\n\nname: SonarQube Scan\njobs:\n  sonarqube:\n    name: SonarQube Trigger\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checking out\n      uses: actions/checkout@v4\n      with:\n        # Disabling shallow clone is recommended for improving relevancy of reporting\n        fetch-depth: 0\n    - name: SonarQube Scan\n      uses: kitabisa/sonarqube-action@v1.2.0\n      with:\n        host: ${{ secrets.SONARQUBE_HOST }}\n        login: ${{ secrets.SONARQUBE_TOKEN }}\n",[6180],{"type":35,"tag":228,"props":6181,"children":6182},{"__ignoreMap":8},[6183,6194,6205,6216,6228,6239,6277,6284,6300,6311,6322,6338,6353,6364,6385,6402,6414,6422,6439,6458,6474,6485,6502],{"type":35,"tag":232,"props":6184,"children":6185},{"class":234,"line":235},[6186,6190],{"type":35,"tag":232,"props":6187,"children":6188},{"style":289},[6189],{"type":41,"value":2122},{"type":35,"tag":232,"props":6191,"children":6192},{"style":389},[6193],{"type":41,"value":2127},{"type":35,"tag":232,"props":6195,"children":6196},{"class":234,"line":245},[6197,6201],{"type":35,"tag":232,"props":6198,"children":6199},{"style":2095},[6200],{"type":41,"value":2511},{"type":35,"tag":232,"props":6202,"children":6203},{"style":389},[6204],{"type":41,"value":2127},{"type":35,"tag":232,"props":6206,"children":6207},{"class":234,"line":266},[6208,6212],{"type":35,"tag":232,"props":6209,"children":6210},{"style":2095},[6211],{"type":41,"value":2523},{"type":35,"tag":232,"props":6213,"children":6214},{"style":389},[6215],{"type":41,"value":2127},{"type":35,"tag":232,"props":6217,"children":6218},{"class":234,"line":276},[6219,6223],{"type":35,"tag":232,"props":6220,"children":6221},{"style":389},[6222],{"type":41,"value":2159},{"type":35,"tag":232,"props":6224,"children":6225},{"style":255},[6226],{"type":41,"value":6227},"main\n",{"type":35,"tag":232,"props":6229,"children":6230},{"class":234,"line":285},[6231,6235],{"type":35,"tag":232,"props":6232,"children":6233},{"style":2095},[6234],{"type":41,"value":3210},{"type":35,"tag":232,"props":6236,"children":6237},{"style":389},[6238],{"type":41,"value":2127},{"type":35,"tag":232,"props":6240,"children":6241},{"class":234,"line":300},[6242,6247,6251,6255,6259,6264,6268,6273],{"type":35,"tag":232,"props":6243,"children":6244},{"style":2095},[6245],{"type":41,"value":6246},"      types",{"type":35,"tag":232,"props":6248,"children":6249},{"style":389},[6250],{"type":41,"value":2910},{"type":35,"tag":232,"props":6252,"children":6253},{"style":255},[6254],{"type":41,"value":2860},{"type":35,"tag":232,"props":6256,"children":6257},{"style":389},[6258],{"type":41,"value":466},{"type":35,"tag":232,"props":6260,"children":6261},{"style":255},[6262],{"type":41,"value":6263},"synchronize",{"type":35,"tag":232,"props":6265,"children":6266},{"style":389},[6267],{"type":41,"value":466},{"type":35,"tag":232,"props":6269,"children":6270},{"style":255},[6271],{"type":41,"value":6272},"reopened",{"type":35,"tag":232,"props":6274,"children":6275},{"style":389},[6276],{"type":41,"value":2927},{"type":35,"tag":232,"props":6278,"children":6279},{"class":234,"line":314},[6280],{"type":35,"tag":232,"props":6281,"children":6282},{"emptyLinePlaceholder":270},[6283],{"type":41,"value":273},{"type":35,"tag":232,"props":6285,"children":6286},{"class":234,"line":322},[6287,6291,6295],{"type":35,"tag":232,"props":6288,"children":6289},{"style":2095},[6290],{"type":41,"value":2098},{"type":35,"tag":232,"props":6292,"children":6293},{"style":389},[6294],{"type":41,"value":430},{"type":35,"tag":232,"props":6296,"children":6297},{"style":255},[6298],{"type":41,"value":6299},"SonarQube Scan\n",{"type":35,"tag":232,"props":6301,"children":6302},{"class":234,"line":331},[6303,6307],{"type":35,"tag":232,"props":6304,"children":6305},{"style":2095},[6306],{"type":41,"value":2179},{"type":35,"tag":232,"props":6308,"children":6309},{"style":389},[6310],{"type":41,"value":2127},{"type":35,"tag":232,"props":6312,"children":6313},{"class":234,"line":524},[6314,6318],{"type":35,"tag":232,"props":6315,"children":6316},{"style":2095},[6317],{"type":41,"value":5743},{"type":35,"tag":232,"props":6319,"children":6320},{"style":389},[6321],{"type":41,"value":2127},{"type":35,"tag":232,"props":6323,"children":6324},{"class":234,"line":533},[6325,6329,6333],{"type":35,"tag":232,"props":6326,"children":6327},{"style":2095},[6328],{"type":41,"value":2237},{"type":35,"tag":232,"props":6330,"children":6331},{"style":389},[6332],{"type":41,"value":430},{"type":35,"tag":232,"props":6334,"children":6335},{"style":255},[6336],{"type":41,"value":6337},"SonarQube Trigger\n",{"type":35,"tag":232,"props":6339,"children":6340},{"class":234,"line":542},[6341,6345,6349],{"type":35,"tag":232,"props":6342,"children":6343},{"style":2095},[6344],{"type":41,"value":2203},{"type":35,"tag":232,"props":6346,"children":6347},{"style":389},[6348],{"type":41,"value":430},{"type":35,"tag":232,"props":6350,"children":6351},{"style":255},[6352],{"type":41,"value":2212},{"type":35,"tag":232,"props":6354,"children":6355},{"class":234,"line":2249},[6356,6360],{"type":35,"tag":232,"props":6357,"children":6358},{"style":2095},[6359],{"type":41,"value":2255},{"type":35,"tag":232,"props":6361,"children":6362},{"style":389},[6363],{"type":41,"value":2127},{"type":35,"tag":232,"props":6365,"children":6366},{"class":234,"line":2262},[6367,6372,6376,6380],{"type":35,"tag":232,"props":6368,"children":6369},{"style":389},[6370],{"type":41,"value":6371},"    - ",{"type":35,"tag":232,"props":6373,"children":6374},{"style":2095},[6375],{"type":41,"value":2098},{"type":35,"tag":232,"props":6377,"children":6378},{"style":389},[6379],{"type":41,"value":430},{"type":35,"tag":232,"props":6381,"children":6382},{"style":255},[6383],{"type":41,"value":6384},"Checking out\n",{"type":35,"tag":232,"props":6386,"children":6387},{"class":234,"line":2283},[6388,6393,6397],{"type":35,"tag":232,"props":6389,"children":6390},{"style":2095},[6391],{"type":41,"value":6392},"      uses",{"type":35,"tag":232,"props":6394,"children":6395},{"style":389},[6396],{"type":41,"value":430},{"type":35,"tag":232,"props":6398,"children":6399},{"style":255},[6400],{"type":41,"value":6401},"actions/checkout@v4\n",{"type":35,"tag":232,"props":6403,"children":6404},{"class":234,"line":2301},[6405,6410],{"type":35,"tag":232,"props":6406,"children":6407},{"style":2095},[6408],{"type":41,"value":6409},"      with",{"type":35,"tag":232,"props":6411,"children":6412},{"style":389},[6413],{"type":41,"value":2127},{"type":35,"tag":232,"props":6415,"children":6416},{"class":234,"line":2314},[6417],{"type":35,"tag":232,"props":6418,"children":6419},{"style":239},[6420],{"type":41,"value":6421},"        # Disabling shallow clone is recommended for improving relevancy of reporting\n",{"type":35,"tag":232,"props":6423,"children":6424},{"class":234,"line":2332},[6425,6430,6434],{"type":35,"tag":232,"props":6426,"children":6427},{"style":2095},[6428],{"type":41,"value":6429},"        fetch-depth",{"type":35,"tag":232,"props":6431,"children":6432},{"style":389},[6433],{"type":41,"value":430},{"type":35,"tag":232,"props":6435,"children":6436},{"style":289},[6437],{"type":41,"value":6438},"0\n",{"type":35,"tag":232,"props":6440,"children":6441},{"class":234,"line":2350},[6442,6446,6450,6454],{"type":35,"tag":232,"props":6443,"children":6444},{"style":389},[6445],{"type":41,"value":6371},{"type":35,"tag":232,"props":6447,"children":6448},{"style":2095},[6449],{"type":41,"value":2098},{"type":35,"tag":232,"props":6451,"children":6452},{"style":389},[6453],{"type":41,"value":430},{"type":35,"tag":232,"props":6455,"children":6456},{"style":255},[6457],{"type":41,"value":6299},{"type":35,"tag":232,"props":6459,"children":6460},{"class":234,"line":2368},[6461,6465,6469],{"type":35,"tag":232,"props":6462,"children":6463},{"style":2095},[6464],{"type":41,"value":6392},{"type":35,"tag":232,"props":6466,"children":6467},{"style":389},[6468],{"type":41,"value":430},{"type":35,"tag":232,"props":6470,"children":6471},{"style":255},[6472],{"type":41,"value":6473},"kitabisa/sonarqube-action@v1.2.0\n",{"type":35,"tag":232,"props":6475,"children":6476},{"class":234,"line":2386},[6477,6481],{"type":35,"tag":232,"props":6478,"children":6479},{"style":2095},[6480],{"type":41,"value":6409},{"type":35,"tag":232,"props":6482,"children":6483},{"style":389},[6484],{"type":41,"value":2127},{"type":35,"tag":232,"props":6486,"children":6487},{"class":234,"line":2404},[6488,6493,6497],{"type":35,"tag":232,"props":6489,"children":6490},{"style":2095},[6491],{"type":41,"value":6492},"        host",{"type":35,"tag":232,"props":6494,"children":6495},{"style":389},[6496],{"type":41,"value":430},{"type":35,"tag":232,"props":6498,"children":6499},{"style":255},[6500],{"type":41,"value":6501},"${{ secrets.SONARQUBE_HOST }}\n",{"type":35,"tag":232,"props":6503,"children":6504},{"class":234,"line":2767},[6505,6510,6514],{"type":35,"tag":232,"props":6506,"children":6507},{"style":2095},[6508],{"type":41,"value":6509},"        login",{"type":35,"tag":232,"props":6511,"children":6512},{"style":389},[6513],{"type":41,"value":430},{"type":35,"tag":232,"props":6515,"children":6516},{"style":255},[6517],{"type":41,"value":6518},"${{ secrets.SONARQUBE_TOKEN }}\n",{"type":35,"tag":44,"props":6520,"children":6521},{},[6522,6524,6529,6530,6535,6537,6541],{"type":41,"value":6523},"Here, you need to set two secrets: ",{"type":35,"tag":228,"props":6525,"children":6526},{"className":8},[6527],{"type":41,"value":6528},"SONARQUBE_HOST",{"type":41,"value":1734},{"type":35,"tag":228,"props":6531,"children":6532},{"className":8},[6533],{"type":41,"value":6534},"SONARQUBE_TOKEN",{"type":41,"value":6536},". ",{"type":35,"tag":228,"props":6538,"children":6539},{"className":8},[6540],{"type":41,"value":6528},{"type":41,"value":6542}," is the URL address of Sonarqube, similar to http://your_ip:9000. Note that you should use the local machine's IP address instead of localhost or 127.0.0.1, as CI runs in a Docker container, and using localhost or 127.0.0.1 will access the container's operating system.",{"type":35,"tag":44,"props":6544,"children":6545},{},[6546,6550],{"type":35,"tag":228,"props":6547,"children":6548},{"className":8},[6549],{"type":41,"value":6534},{"type":41,"value":6551}," should be created in Sonarqube by logging in and generating a token in the personal settings.",{"type":35,"tag":44,"props":6553,"children":6554},{},[6555],{"type":41,"value":6556},"After configuring these two secrets, push the code to the main branch, and you can see the Gitea Actions interface as shown below:",{"type":35,"tag":44,"props":6558,"children":6559},{},[6560],{"type":35,"tag":741,"props":6561,"children":6564},{"alt":6562,"src":6563},"gitea actions","/img/tutorials/gitea-integrate-sonarqube/gitea-actions-screenshot.png",[],{"type":35,"tag":44,"props":6566,"children":6567},{},[6568],{"type":41,"value":6569},"Once Gitea Actions runs successfully, you can view the analysis results in the Sonarqube console.",{"type":35,"tag":44,"props":6571,"children":6572},{},[6573],{"type":35,"tag":741,"props":6574,"children":6575},{"alt":5630,"src":5634},[],{"type":35,"tag":1651,"props":6577,"children":6578},{},[6579],{"type":41,"value":1655},{"title":8,"searchDepth":245,"depth":245,"links":6581},[6582,6583,6584],{"id":4733,"depth":245,"text":4736},{"id":5677,"depth":245,"text":5680},{"id":6154,"depth":245,"text":6157},"content:resources:tutorials:4.gitea-integrate-sonarqube.md","resources/tutorials/4.gitea-integrate-sonarqube.md",{"_path":6588,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":6589,"description":6590,"labels":6591,"category":6593,"author":6596,"coverImage":6600,"datetime":6601,"date":6602,"readingTime":6603,"body":6607,"_type":1680,"_id":8050,"_source":1682,"_file":8051,"_extension":1684},"/resources/tutorials/automating-release-versioning-with-gitea-actions-to-the-gitea-package-registry","Automating Release Versioning with Gitea Actions to the Gitea Package Registry","Automated release versioning plays a crucial role in contemporary CI/CD pipelines",[6592],"registry",{"title":6594,"href":6595},"CI/CD","/resources/tutorials?category=cicd",{"name":6597,"href":6598,"imageUrl":6599,"role":21},"Nanguan Lin","https://github.com/lng2020","https://github.com/lng2020.png","/img/tutorials/automating-release-versioning-with-gitea-actions-to-the-gitea-package-registry/cover.png","2023-11-7 12:00:00","2023-11-7",{"text":27,"minutes":6604,"time":6605,"words":6606},2.82,169200,564,{"type":32,"children":6608,"toc":8041},[6609,6613,6618,6624,6636,7393,7401,7407,7412,7418,7605,7610,7615,7643,7649,7818,7823,7831,7842,7848,8007,8019,8037],{"type":35,"tag":36,"props":6610,"children":6611},{"id":38},[6612],{"type":41,"value":42},{"type":35,"tag":44,"props":6614,"children":6615},{},[6616],{"type":41,"value":6617},"Automated release versioning plays a crucial role in contemporary CI/CD pipelines. There are situations when it's preferable to publish build artifacts to a private, self-hosted package registry instead of a public one. Yet, managing codebase, CI/CD tools, and a private registry can be quite a challenge. Thankfully, Gitea offers a solution by combining all these functions into one platform. By setting up a Gitea instance, you can manage the entire workflow. This tutorial demonstrates how to automatically build a Docker image and upload it to the Gitea Docker registry.",{"type":35,"tag":36,"props":6619,"children":6621},{"id":6620},"tldr",[6622],{"type":41,"value":6623},"TL;DR",{"type":35,"tag":44,"props":6625,"children":6626},{},[6627,6629,6634],{"type":41,"value":6628},"Paste the workflow file under your ",{"type":35,"tag":228,"props":6630,"children":6631},{"className":8},[6632],{"type":41,"value":6633},".gitea/workflows",{"type":41,"value":6635}," folder, replace the local IP with your own, add the relevant secret for your workflow, and you're all set.",{"type":35,"tag":221,"props":6637,"children":6639},{"className":2083,"code":6638,"language":2085,"meta":8,"style":8},"name: release-tag\n\non:\n  push\n\njobs:\n  release-image:\n    runs-on: ubuntu-latest\n    container:\n      image: catthehacker/ubuntu:act-latest\n    env:\n      DOCKER_ORG: teacup\n      DOCKER_LATEST: nightly\n      RUNNER_TOOL_CACHE: /toolcache\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v2\n\n      - name: Set up Docker BuildX\n        uses: docker/setup-buildx-action@v2\n        with: # replace it with your local IP\n          config-inline: |\n            [registry.\"192.168.8.30:3000\"] \n              http = true\n              insecure = true            \n\n      - name: Login to DockerHub\n        uses: docker/login-action@v2\n        with:\n          registry: 192.168.8.30:3000 # replace it with your local IP\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n          \n      - name: Get Meta\n        id: meta\n        run: |\n          echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F\"/\" '{print $2}') >> $GITHUB_OUTPUT\n          echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT                \n\n      - name: Build and push\n        uses: docker/build-push-action@v4\n        with:\n          context: .\n          file: ./Dockerfile\n          platforms: |\n            linux/amd64\n            linux/arm64                        \n          push: true\n          tags: | # replace it with your local IP and tags\n            192.168.8.30:3000/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }}\n            192.168.8.30:3000/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }}                 \n",[6640],{"type":35,"tag":228,"props":6641,"children":6642},{"__ignoreMap":8},[6643,6659,6666,6677,6685,6692,6703,6715,6730,6742,6759,6771,6788,6805,6822,6833,6853,6869,6876,6896,6912,6919,6939,6955,6971,6987,6995,7003,7011,7018,7038,7054,7065,7088,7106,7124,7133,7154,7172,7189,7198,7207,7215,7236,7253,7265,7283,7301,7318,7327,7336,7353,7375,7384],{"type":35,"tag":232,"props":6644,"children":6645},{"class":234,"line":235},[6646,6650,6654],{"type":35,"tag":232,"props":6647,"children":6648},{"style":2095},[6649],{"type":41,"value":2098},{"type":35,"tag":232,"props":6651,"children":6652},{"style":389},[6653],{"type":41,"value":430},{"type":35,"tag":232,"props":6655,"children":6656},{"style":255},[6657],{"type":41,"value":6658},"release-tag\n",{"type":35,"tag":232,"props":6660,"children":6661},{"class":234,"line":245},[6662],{"type":35,"tag":232,"props":6663,"children":6664},{"emptyLinePlaceholder":270},[6665],{"type":41,"value":273},{"type":35,"tag":232,"props":6667,"children":6668},{"class":234,"line":266},[6669,6673],{"type":35,"tag":232,"props":6670,"children":6671},{"style":289},[6672],{"type":41,"value":2122},{"type":35,"tag":232,"props":6674,"children":6675},{"style":389},[6676],{"type":41,"value":2127},{"type":35,"tag":232,"props":6678,"children":6679},{"class":234,"line":276},[6680],{"type":35,"tag":232,"props":6681,"children":6682},{"style":255},[6683],{"type":41,"value":6684},"  push\n",{"type":35,"tag":232,"props":6686,"children":6687},{"class":234,"line":285},[6688],{"type":35,"tag":232,"props":6689,"children":6690},{"emptyLinePlaceholder":270},[6691],{"type":41,"value":273},{"type":35,"tag":232,"props":6693,"children":6694},{"class":234,"line":300},[6695,6699],{"type":35,"tag":232,"props":6696,"children":6697},{"style":2095},[6698],{"type":41,"value":2179},{"type":35,"tag":232,"props":6700,"children":6701},{"style":389},[6702],{"type":41,"value":2127},{"type":35,"tag":232,"props":6704,"children":6705},{"class":234,"line":314},[6706,6711],{"type":35,"tag":232,"props":6707,"children":6708},{"style":2095},[6709],{"type":41,"value":6710},"  release-image",{"type":35,"tag":232,"props":6712,"children":6713},{"style":389},[6714],{"type":41,"value":2127},{"type":35,"tag":232,"props":6716,"children":6717},{"class":234,"line":322},[6718,6722,6726],{"type":35,"tag":232,"props":6719,"children":6720},{"style":2095},[6721],{"type":41,"value":2203},{"type":35,"tag":232,"props":6723,"children":6724},{"style":389},[6725],{"type":41,"value":430},{"type":35,"tag":232,"props":6727,"children":6728},{"style":255},[6729],{"type":41,"value":2212},{"type":35,"tag":232,"props":6731,"children":6732},{"class":234,"line":331},[6733,6738],{"type":35,"tag":232,"props":6734,"children":6735},{"style":2095},[6736],{"type":41,"value":6737},"    container",{"type":35,"tag":232,"props":6739,"children":6740},{"style":389},[6741],{"type":41,"value":2127},{"type":35,"tag":232,"props":6743,"children":6744},{"class":234,"line":524},[6745,6750,6754],{"type":35,"tag":232,"props":6746,"children":6747},{"style":2095},[6748],{"type":41,"value":6749},"      image",{"type":35,"tag":232,"props":6751,"children":6752},{"style":389},[6753],{"type":41,"value":430},{"type":35,"tag":232,"props":6755,"children":6756},{"style":255},[6757],{"type":41,"value":6758},"catthehacker/ubuntu:act-latest\n",{"type":35,"tag":232,"props":6760,"children":6761},{"class":234,"line":533},[6762,6767],{"type":35,"tag":232,"props":6763,"children":6764},{"style":2095},[6765],{"type":41,"value":6766},"    env",{"type":35,"tag":232,"props":6768,"children":6769},{"style":389},[6770],{"type":41,"value":2127},{"type":35,"tag":232,"props":6772,"children":6773},{"class":234,"line":542},[6774,6779,6783],{"type":35,"tag":232,"props":6775,"children":6776},{"style":2095},[6777],{"type":41,"value":6778},"      DOCKER_ORG",{"type":35,"tag":232,"props":6780,"children":6781},{"style":389},[6782],{"type":41,"value":430},{"type":35,"tag":232,"props":6784,"children":6785},{"style":255},[6786],{"type":41,"value":6787},"teacup\n",{"type":35,"tag":232,"props":6789,"children":6790},{"class":234,"line":2249},[6791,6796,6800],{"type":35,"tag":232,"props":6792,"children":6793},{"style":2095},[6794],{"type":41,"value":6795},"      DOCKER_LATEST",{"type":35,"tag":232,"props":6797,"children":6798},{"style":389},[6799],{"type":41,"value":430},{"type":35,"tag":232,"props":6801,"children":6802},{"style":255},[6803],{"type":41,"value":6804},"nightly\n",{"type":35,"tag":232,"props":6806,"children":6807},{"class":234,"line":2262},[6808,6813,6817],{"type":35,"tag":232,"props":6809,"children":6810},{"style":2095},[6811],{"type":41,"value":6812},"      RUNNER_TOOL_CACHE",{"type":35,"tag":232,"props":6814,"children":6815},{"style":389},[6816],{"type":41,"value":430},{"type":35,"tag":232,"props":6818,"children":6819},{"style":255},[6820],{"type":41,"value":6821},"/toolcache\n",{"type":35,"tag":232,"props":6823,"children":6824},{"class":234,"line":2283},[6825,6829],{"type":35,"tag":232,"props":6826,"children":6827},{"style":2095},[6828],{"type":41,"value":2255},{"type":35,"tag":232,"props":6830,"children":6831},{"style":389},[6832],{"type":41,"value":2127},{"type":35,"tag":232,"props":6834,"children":6835},{"class":234,"line":2301},[6836,6840,6844,6848],{"type":35,"tag":232,"props":6837,"children":6838},{"style":389},[6839],{"type":41,"value":2159},{"type":35,"tag":232,"props":6841,"children":6842},{"style":2095},[6843],{"type":41,"value":2098},{"type":35,"tag":232,"props":6845,"children":6846},{"style":389},[6847],{"type":41,"value":430},{"type":35,"tag":232,"props":6849,"children":6850},{"style":255},[6851],{"type":41,"value":6852},"Checkout\n",{"type":35,"tag":232,"props":6854,"children":6855},{"class":234,"line":2314},[6856,6860,6864],{"type":35,"tag":232,"props":6857,"children":6858},{"style":2095},[6859],{"type":41,"value":2289},{"type":35,"tag":232,"props":6861,"children":6862},{"style":389},[6863],{"type":41,"value":430},{"type":35,"tag":232,"props":6865,"children":6866},{"style":255},[6867],{"type":41,"value":6868},"actions/checkout@v3\n",{"type":35,"tag":232,"props":6870,"children":6871},{"class":234,"line":2332},[6872],{"type":35,"tag":232,"props":6873,"children":6874},{"emptyLinePlaceholder":270},[6875],{"type":41,"value":273},{"type":35,"tag":232,"props":6877,"children":6878},{"class":234,"line":2350},[6879,6883,6887,6891],{"type":35,"tag":232,"props":6880,"children":6881},{"style":389},[6882],{"type":41,"value":2159},{"type":35,"tag":232,"props":6884,"children":6885},{"style":2095},[6886],{"type":41,"value":2098},{"type":35,"tag":232,"props":6888,"children":6889},{"style":389},[6890],{"type":41,"value":430},{"type":35,"tag":232,"props":6892,"children":6893},{"style":255},[6894],{"type":41,"value":6895},"Set up QEMU\n",{"type":35,"tag":232,"props":6897,"children":6898},{"class":234,"line":2368},[6899,6903,6907],{"type":35,"tag":232,"props":6900,"children":6901},{"style":2095},[6902],{"type":41,"value":2289},{"type":35,"tag":232,"props":6904,"children":6905},{"style":389},[6906],{"type":41,"value":430},{"type":35,"tag":232,"props":6908,"children":6909},{"style":255},[6910],{"type":41,"value":6911},"docker/setup-qemu-action@v2\n",{"type":35,"tag":232,"props":6913,"children":6914},{"class":234,"line":2386},[6915],{"type":35,"tag":232,"props":6916,"children":6917},{"emptyLinePlaceholder":270},[6918],{"type":41,"value":273},{"type":35,"tag":232,"props":6920,"children":6921},{"class":234,"line":2404},[6922,6926,6930,6934],{"type":35,"tag":232,"props":6923,"children":6924},{"style":389},[6925],{"type":41,"value":2159},{"type":35,"tag":232,"props":6927,"children":6928},{"style":2095},[6929],{"type":41,"value":2098},{"type":35,"tag":232,"props":6931,"children":6932},{"style":389},[6933],{"type":41,"value":430},{"type":35,"tag":232,"props":6935,"children":6936},{"style":255},[6937],{"type":41,"value":6938},"Set up Docker BuildX\n",{"type":35,"tag":232,"props":6940,"children":6941},{"class":234,"line":2767},[6942,6946,6950],{"type":35,"tag":232,"props":6943,"children":6944},{"style":2095},[6945],{"type":41,"value":2289},{"type":35,"tag":232,"props":6947,"children":6948},{"style":389},[6949],{"type":41,"value":430},{"type":35,"tag":232,"props":6951,"children":6952},{"style":255},[6953],{"type":41,"value":6954},"docker/setup-buildx-action@v2\n",{"type":35,"tag":232,"props":6956,"children":6957},{"class":234,"line":2785},[6958,6962,6966],{"type":35,"tag":232,"props":6959,"children":6960},{"style":2095},[6961],{"type":41,"value":2307},{"type":35,"tag":232,"props":6963,"children":6964},{"style":389},[6965],{"type":41,"value":430},{"type":35,"tag":232,"props":6967,"children":6968},{"style":239},[6969],{"type":41,"value":6970},"# replace it with your local IP\n",{"type":35,"tag":232,"props":6972,"children":6973},{"class":234,"line":2794},[6974,6979,6983],{"type":35,"tag":232,"props":6975,"children":6976},{"style":2095},[6977],{"type":41,"value":6978},"          config-inline",{"type":35,"tag":232,"props":6980,"children":6981},{"style":389},[6982],{"type":41,"value":430},{"type":35,"tag":232,"props":6984,"children":6985},{"style":601},[6986],{"type":41,"value":2782},{"type":35,"tag":232,"props":6988,"children":6989},{"class":234,"line":2802},[6990],{"type":35,"tag":232,"props":6991,"children":6992},{"style":255},[6993],{"type":41,"value":6994},"            [registry.\"192.168.8.30:3000\"] \n",{"type":35,"tag":232,"props":6996,"children":6997},{"class":234,"line":2811},[6998],{"type":35,"tag":232,"props":6999,"children":7000},{"style":255},[7001],{"type":41,"value":7002},"              http = true\n",{"type":35,"tag":232,"props":7004,"children":7005},{"class":234,"line":2819},[7006],{"type":35,"tag":232,"props":7007,"children":7008},{"style":255},[7009],{"type":41,"value":7010},"              insecure = true            \n",{"type":35,"tag":232,"props":7012,"children":7013},{"class":234,"line":6062},[7014],{"type":35,"tag":232,"props":7015,"children":7016},{"emptyLinePlaceholder":270},[7017],{"type":41,"value":273},{"type":35,"tag":232,"props":7019,"children":7020},{"class":234,"line":6075},[7021,7025,7029,7033],{"type":35,"tag":232,"props":7022,"children":7023},{"style":389},[7024],{"type":41,"value":2159},{"type":35,"tag":232,"props":7026,"children":7027},{"style":2095},[7028],{"type":41,"value":2098},{"type":35,"tag":232,"props":7030,"children":7031},{"style":389},[7032],{"type":41,"value":430},{"type":35,"tag":232,"props":7034,"children":7035},{"style":255},[7036],{"type":41,"value":7037},"Login to DockerHub\n",{"type":35,"tag":232,"props":7039,"children":7040},{"class":234,"line":6088},[7041,7045,7049],{"type":35,"tag":232,"props":7042,"children":7043},{"style":2095},[7044],{"type":41,"value":2289},{"type":35,"tag":232,"props":7046,"children":7047},{"style":389},[7048],{"type":41,"value":430},{"type":35,"tag":232,"props":7050,"children":7051},{"style":255},[7052],{"type":41,"value":7053},"docker/login-action@v2\n",{"type":35,"tag":232,"props":7055,"children":7056},{"class":234,"line":6101},[7057,7061],{"type":35,"tag":232,"props":7058,"children":7059},{"style":2095},[7060],{"type":41,"value":2307},{"type":35,"tag":232,"props":7062,"children":7063},{"style":389},[7064],{"type":41,"value":2127},{"type":35,"tag":232,"props":7066,"children":7068},{"class":234,"line":7067},33,[7069,7074,7078,7083],{"type":35,"tag":232,"props":7070,"children":7071},{"style":2095},[7072],{"type":41,"value":7073},"          registry",{"type":35,"tag":232,"props":7075,"children":7076},{"style":389},[7077],{"type":41,"value":430},{"type":35,"tag":232,"props":7079,"children":7080},{"style":255},[7081],{"type":41,"value":7082},"192.168.8.30:3000",{"type":35,"tag":232,"props":7084,"children":7085},{"style":239},[7086],{"type":41,"value":7087}," # replace it with your local IP\n",{"type":35,"tag":232,"props":7089,"children":7091},{"class":234,"line":7090},34,[7092,7097,7101],{"type":35,"tag":232,"props":7093,"children":7094},{"style":2095},[7095],{"type":41,"value":7096},"          username",{"type":35,"tag":232,"props":7098,"children":7099},{"style":389},[7100],{"type":41,"value":430},{"type":35,"tag":232,"props":7102,"children":7103},{"style":255},[7104],{"type":41,"value":7105},"${{ secrets.DOCKER_USERNAME }}\n",{"type":35,"tag":232,"props":7107,"children":7109},{"class":234,"line":7108},35,[7110,7115,7119],{"type":35,"tag":232,"props":7111,"children":7112},{"style":2095},[7113],{"type":41,"value":7114},"          password",{"type":35,"tag":232,"props":7116,"children":7117},{"style":389},[7118],{"type":41,"value":430},{"type":35,"tag":232,"props":7120,"children":7121},{"style":255},[7122],{"type":41,"value":7123},"${{ secrets.DOCKER_PASSWORD }}\n",{"type":35,"tag":232,"props":7125,"children":7127},{"class":234,"line":7126},36,[7128],{"type":35,"tag":232,"props":7129,"children":7130},{"style":389},[7131],{"type":41,"value":7132},"          \n",{"type":35,"tag":232,"props":7134,"children":7136},{"class":234,"line":7135},37,[7137,7141,7145,7149],{"type":35,"tag":232,"props":7138,"children":7139},{"style":389},[7140],{"type":41,"value":2159},{"type":35,"tag":232,"props":7142,"children":7143},{"style":2095},[7144],{"type":41,"value":2098},{"type":35,"tag":232,"props":7146,"children":7147},{"style":389},[7148],{"type":41,"value":430},{"type":35,"tag":232,"props":7150,"children":7151},{"style":255},[7152],{"type":41,"value":7153},"Get Meta\n",{"type":35,"tag":232,"props":7155,"children":7157},{"class":234,"line":7156},38,[7158,7163,7167],{"type":35,"tag":232,"props":7159,"children":7160},{"style":2095},[7161],{"type":41,"value":7162},"        id",{"type":35,"tag":232,"props":7164,"children":7165},{"style":389},[7166],{"type":41,"value":430},{"type":35,"tag":232,"props":7168,"children":7169},{"style":255},[7170],{"type":41,"value":7171},"meta\n",{"type":35,"tag":232,"props":7173,"children":7175},{"class":234,"line":7174},39,[7176,7181,7185],{"type":35,"tag":232,"props":7177,"children":7178},{"style":2095},[7179],{"type":41,"value":7180},"        run",{"type":35,"tag":232,"props":7182,"children":7183},{"style":389},[7184],{"type":41,"value":430},{"type":35,"tag":232,"props":7186,"children":7187},{"style":601},[7188],{"type":41,"value":2782},{"type":35,"tag":232,"props":7190,"children":7192},{"class":234,"line":7191},40,[7193],{"type":35,"tag":232,"props":7194,"children":7195},{"style":255},[7196],{"type":41,"value":7197},"          echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F\"/\" '{print $2}') >> $GITHUB_OUTPUT\n",{"type":35,"tag":232,"props":7199,"children":7201},{"class":234,"line":7200},41,[7202],{"type":35,"tag":232,"props":7203,"children":7204},{"style":255},[7205],{"type":41,"value":7206},"          echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT                \n",{"type":35,"tag":232,"props":7208,"children":7210},{"class":234,"line":7209},42,[7211],{"type":35,"tag":232,"props":7212,"children":7213},{"emptyLinePlaceholder":270},[7214],{"type":41,"value":273},{"type":35,"tag":232,"props":7216,"children":7218},{"class":234,"line":7217},43,[7219,7223,7227,7231],{"type":35,"tag":232,"props":7220,"children":7221},{"style":389},[7222],{"type":41,"value":2159},{"type":35,"tag":232,"props":7224,"children":7225},{"style":2095},[7226],{"type":41,"value":2098},{"type":35,"tag":232,"props":7228,"children":7229},{"style":389},[7230],{"type":41,"value":430},{"type":35,"tag":232,"props":7232,"children":7233},{"style":255},[7234],{"type":41,"value":7235},"Build and push\n",{"type":35,"tag":232,"props":7237,"children":7239},{"class":234,"line":7238},44,[7240,7244,7248],{"type":35,"tag":232,"props":7241,"children":7242},{"style":2095},[7243],{"type":41,"value":2289},{"type":35,"tag":232,"props":7245,"children":7246},{"style":389},[7247],{"type":41,"value":430},{"type":35,"tag":232,"props":7249,"children":7250},{"style":255},[7251],{"type":41,"value":7252},"docker/build-push-action@v4\n",{"type":35,"tag":232,"props":7254,"children":7256},{"class":234,"line":7255},45,[7257,7261],{"type":35,"tag":232,"props":7258,"children":7259},{"style":2095},[7260],{"type":41,"value":2307},{"type":35,"tag":232,"props":7262,"children":7263},{"style":389},[7264],{"type":41,"value":2127},{"type":35,"tag":232,"props":7266,"children":7268},{"class":234,"line":7267},46,[7269,7274,7278],{"type":35,"tag":232,"props":7270,"children":7271},{"style":2095},[7272],{"type":41,"value":7273},"          context",{"type":35,"tag":232,"props":7275,"children":7276},{"style":389},[7277],{"type":41,"value":430},{"type":35,"tag":232,"props":7279,"children":7280},{"style":289},[7281],{"type":41,"value":7282},".\n",{"type":35,"tag":232,"props":7284,"children":7286},{"class":234,"line":7285},47,[7287,7292,7296],{"type":35,"tag":232,"props":7288,"children":7289},{"style":2095},[7290],{"type":41,"value":7291},"          file",{"type":35,"tag":232,"props":7293,"children":7294},{"style":389},[7295],{"type":41,"value":430},{"type":35,"tag":232,"props":7297,"children":7298},{"style":255},[7299],{"type":41,"value":7300},"./Dockerfile\n",{"type":35,"tag":232,"props":7302,"children":7304},{"class":234,"line":7303},48,[7305,7310,7314],{"type":35,"tag":232,"props":7306,"children":7307},{"style":2095},[7308],{"type":41,"value":7309},"          platforms",{"type":35,"tag":232,"props":7311,"children":7312},{"style":389},[7313],{"type":41,"value":430},{"type":35,"tag":232,"props":7315,"children":7316},{"style":601},[7317],{"type":41,"value":2782},{"type":35,"tag":232,"props":7319,"children":7321},{"class":234,"line":7320},49,[7322],{"type":35,"tag":232,"props":7323,"children":7324},{"style":255},[7325],{"type":41,"value":7326},"            linux/amd64\n",{"type":35,"tag":232,"props":7328,"children":7330},{"class":234,"line":7329},50,[7331],{"type":35,"tag":232,"props":7332,"children":7333},{"style":255},[7334],{"type":41,"value":7335},"            linux/arm64                        \n",{"type":35,"tag":232,"props":7337,"children":7339},{"class":234,"line":7338},51,[7340,7345,7349],{"type":35,"tag":232,"props":7341,"children":7342},{"style":2095},[7343],{"type":41,"value":7344},"          push",{"type":35,"tag":232,"props":7346,"children":7347},{"style":389},[7348],{"type":41,"value":430},{"type":35,"tag":232,"props":7350,"children":7351},{"style":289},[7352],{"type":41,"value":2347},{"type":35,"tag":232,"props":7354,"children":7356},{"class":234,"line":7355},52,[7357,7362,7366,7370],{"type":35,"tag":232,"props":7358,"children":7359},{"style":2095},[7360],{"type":41,"value":7361},"          tags",{"type":35,"tag":232,"props":7363,"children":7364},{"style":389},[7365],{"type":41,"value":430},{"type":35,"tag":232,"props":7367,"children":7368},{"style":601},[7369],{"type":41,"value":4161},{"type":35,"tag":232,"props":7371,"children":7372},{"style":239},[7373],{"type":41,"value":7374}," # replace it with your local IP and tags\n",{"type":35,"tag":232,"props":7376,"children":7378},{"class":234,"line":7377},53,[7379],{"type":35,"tag":232,"props":7380,"children":7381},{"style":255},[7382],{"type":41,"value":7383},"            192.168.8.30:3000/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }}\n",{"type":35,"tag":232,"props":7385,"children":7387},{"class":234,"line":7386},54,[7388],{"type":35,"tag":232,"props":7389,"children":7390},{"style":255},[7391],{"type":41,"value":7392},"            192.168.8.30:3000/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }}\n",{"type":35,"tag":44,"props":7394,"children":7395},{},[7396],{"type":35,"tag":741,"props":7397,"children":7400},{"alt":7398,"src":7399},"docker package","/img/tutorials/automating-release-versioning-with-gitea-actions-to-the-gitea-package-registry/docker_package.png",[],{"type":35,"tag":36,"props":7402,"children":7404},{"id":7403},"explanation",[7405],{"type":41,"value":7406},"Explanation",{"type":35,"tag":44,"props":7408,"children":7409},{},[7410],{"type":41,"value":7411},"Let's dissect the different components of this workflow file. It consists of three parts: setting up the Docker environment, logging in to the Docker registry, and building and uploading the image.",{"type":35,"tag":50,"props":7413,"children":7415},{"id":7414},"set-up-the-docker-environment",[7416],{"type":41,"value":7417},"Set up the Docker environment",{"type":35,"tag":221,"props":7419,"children":7421},{"className":2083,"code":7420,"language":2085,"meta":8,"style":8},"steps:\n      - name: Checkout\n        uses: actions/checkout@v3\n\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v2\n\n      - name: Set up Docker BuildX\n        uses: docker/setup-buildx-action@v2\n        with: # replace it with your local IP\n          config-inline: |\n            [registry.\"192.168.8.30:3000\"] \n              http = true\n              insecure = true \n",[7422],{"type":35,"tag":228,"props":7423,"children":7424},{"__ignoreMap":8},[7425,7437,7456,7471,7478,7497,7512,7519,7538,7553,7568,7583,7590,7597],{"type":35,"tag":232,"props":7426,"children":7427},{"class":234,"line":235},[7428,7433],{"type":35,"tag":232,"props":7429,"children":7430},{"style":2095},[7431],{"type":41,"value":7432},"steps",{"type":35,"tag":232,"props":7434,"children":7435},{"style":389},[7436],{"type":41,"value":2127},{"type":35,"tag":232,"props":7438,"children":7439},{"class":234,"line":245},[7440,7444,7448,7452],{"type":35,"tag":232,"props":7441,"children":7442},{"style":389},[7443],{"type":41,"value":2159},{"type":35,"tag":232,"props":7445,"children":7446},{"style":2095},[7447],{"type":41,"value":2098},{"type":35,"tag":232,"props":7449,"children":7450},{"style":389},[7451],{"type":41,"value":430},{"type":35,"tag":232,"props":7453,"children":7454},{"style":255},[7455],{"type":41,"value":6852},{"type":35,"tag":232,"props":7457,"children":7458},{"class":234,"line":266},[7459,7463,7467],{"type":35,"tag":232,"props":7460,"children":7461},{"style":2095},[7462],{"type":41,"value":2289},{"type":35,"tag":232,"props":7464,"children":7465},{"style":389},[7466],{"type":41,"value":430},{"type":35,"tag":232,"props":7468,"children":7469},{"style":255},[7470],{"type":41,"value":6868},{"type":35,"tag":232,"props":7472,"children":7473},{"class":234,"line":276},[7474],{"type":35,"tag":232,"props":7475,"children":7476},{"emptyLinePlaceholder":270},[7477],{"type":41,"value":273},{"type":35,"tag":232,"props":7479,"children":7480},{"class":234,"line":285},[7481,7485,7489,7493],{"type":35,"tag":232,"props":7482,"children":7483},{"style":389},[7484],{"type":41,"value":2159},{"type":35,"tag":232,"props":7486,"children":7487},{"style":2095},[7488],{"type":41,"value":2098},{"type":35,"tag":232,"props":7490,"children":7491},{"style":389},[7492],{"type":41,"value":430},{"type":35,"tag":232,"props":7494,"children":7495},{"style":255},[7496],{"type":41,"value":6895},{"type":35,"tag":232,"props":7498,"children":7499},{"class":234,"line":300},[7500,7504,7508],{"type":35,"tag":232,"props":7501,"children":7502},{"style":2095},[7503],{"type":41,"value":2289},{"type":35,"tag":232,"props":7505,"children":7506},{"style":389},[7507],{"type":41,"value":430},{"type":35,"tag":232,"props":7509,"children":7510},{"style":255},[7511],{"type":41,"value":6911},{"type":35,"tag":232,"props":7513,"children":7514},{"class":234,"line":314},[7515],{"type":35,"tag":232,"props":7516,"children":7517},{"emptyLinePlaceholder":270},[7518],{"type":41,"value":273},{"type":35,"tag":232,"props":7520,"children":7521},{"class":234,"line":322},[7522,7526,7530,7534],{"type":35,"tag":232,"props":7523,"children":7524},{"style":389},[7525],{"type":41,"value":2159},{"type":35,"tag":232,"props":7527,"children":7528},{"style":2095},[7529],{"type":41,"value":2098},{"type":35,"tag":232,"props":7531,"children":7532},{"style":389},[7533],{"type":41,"value":430},{"type":35,"tag":232,"props":7535,"children":7536},{"style":255},[7537],{"type":41,"value":6938},{"type":35,"tag":232,"props":7539,"children":7540},{"class":234,"line":331},[7541,7545,7549],{"type":35,"tag":232,"props":7542,"children":7543},{"style":2095},[7544],{"type":41,"value":2289},{"type":35,"tag":232,"props":7546,"children":7547},{"style":389},[7548],{"type":41,"value":430},{"type":35,"tag":232,"props":7550,"children":7551},{"style":255},[7552],{"type":41,"value":6954},{"type":35,"tag":232,"props":7554,"children":7555},{"class":234,"line":524},[7556,7560,7564],{"type":35,"tag":232,"props":7557,"children":7558},{"style":2095},[7559],{"type":41,"value":2307},{"type":35,"tag":232,"props":7561,"children":7562},{"style":389},[7563],{"type":41,"value":430},{"type":35,"tag":232,"props":7565,"children":7566},{"style":239},[7567],{"type":41,"value":6970},{"type":35,"tag":232,"props":7569,"children":7570},{"class":234,"line":533},[7571,7575,7579],{"type":35,"tag":232,"props":7572,"children":7573},{"style":2095},[7574],{"type":41,"value":6978},{"type":35,"tag":232,"props":7576,"children":7577},{"style":389},[7578],{"type":41,"value":430},{"type":35,"tag":232,"props":7580,"children":7581},{"style":601},[7582],{"type":41,"value":2782},{"type":35,"tag":232,"props":7584,"children":7585},{"class":234,"line":542},[7586],{"type":35,"tag":232,"props":7587,"children":7588},{"style":255},[7589],{"type":41,"value":6994},{"type":35,"tag":232,"props":7591,"children":7592},{"class":234,"line":2249},[7593],{"type":35,"tag":232,"props":7594,"children":7595},{"style":255},[7596],{"type":41,"value":7002},{"type":35,"tag":232,"props":7598,"children":7599},{"class":234,"line":2262},[7600],{"type":35,"tag":232,"props":7601,"children":7602},{"style":255},[7603],{"type":41,"value":7604},"              insecure = true\n",{"type":35,"tag":44,"props":7606,"children":7607},{},[7608],{"type":41,"value":7609},"These three steps are designed to set up the Docker environment.",{"type":35,"tag":44,"props":7611,"children":7612},{},[7613],{"type":41,"value":7614},"As this tutorial does not cover HTTPS setup in Gitea, we are using HTTP for our local Gitea instance. Since the Docker action defaults to HTTPS, we need to adjust the configuration accordingly.",{"type":35,"tag":44,"props":7616,"children":7617},{},[7618,7623,7625,7632,7634,7641],{"type":35,"tag":94,"props":7619,"children":7620},{},[7621],{"type":41,"value":7622},"Note:",{"type":41,"value":7624}," If your Gitea instance is open to the public network, please use HTTPS. Follow ",{"type":35,"tag":165,"props":7626,"children":7629},{"href":7627,"rel":7628},"https://docs.gitea.com/administration/https-setup",[169],[7630],{"type":41,"value":7631},"the official Gitea guide",{"type":41,"value":7633}," to set up HTTPS for your Gitea instance and ",{"type":35,"tag":165,"props":7635,"children":7638},{"href":7636,"rel":7637},"https://github.com/docker/login-action/issues/295",[169],[7639],{"type":41,"value":7640},"this guide",{"type":41,"value":7642}," for setting up HTTPS certification for your Docker.",{"type":35,"tag":50,"props":7644,"children":7646},{"id":7645},"login-to-the-docker-registry",[7647],{"type":41,"value":7648},"Login to the Docker registry",{"type":35,"tag":221,"props":7650,"children":7652},{"className":2083,"code":7651,"language":2085,"meta":8,"style":8},"      - name: Login to DockerHub\n        uses: docker/login-action@v2\n        with:\n          registry: http://192.168.8.30:3000\n          username: ${{ secrets.DOCKER_USERNAME }}\n          password: ${{ secrets.DOCKER_PASSWORD }}\n\n      - name: Get Meta\n        id: meta\n        run: |\n          echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F\"/\" '{print $2}') >> $GITHUB_OUTPUT\n          echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT                    \n",[7653],{"type":35,"tag":228,"props":7654,"children":7655},{"__ignoreMap":8},[7656,7675,7690,7701,7717,7732,7747,7754,7773,7788,7803,7810],{"type":35,"tag":232,"props":7657,"children":7658},{"class":234,"line":235},[7659,7663,7667,7671],{"type":35,"tag":232,"props":7660,"children":7661},{"style":389},[7662],{"type":41,"value":2159},{"type":35,"tag":232,"props":7664,"children":7665},{"style":2095},[7666],{"type":41,"value":2098},{"type":35,"tag":232,"props":7668,"children":7669},{"style":389},[7670],{"type":41,"value":430},{"type":35,"tag":232,"props":7672,"children":7673},{"style":255},[7674],{"type":41,"value":7037},{"type":35,"tag":232,"props":7676,"children":7677},{"class":234,"line":245},[7678,7682,7686],{"type":35,"tag":232,"props":7679,"children":7680},{"style":2095},[7681],{"type":41,"value":2289},{"type":35,"tag":232,"props":7683,"children":7684},{"style":389},[7685],{"type":41,"value":430},{"type":35,"tag":232,"props":7687,"children":7688},{"style":255},[7689],{"type":41,"value":7053},{"type":35,"tag":232,"props":7691,"children":7692},{"class":234,"line":266},[7693,7697],{"type":35,"tag":232,"props":7694,"children":7695},{"style":2095},[7696],{"type":41,"value":2307},{"type":35,"tag":232,"props":7698,"children":7699},{"style":389},[7700],{"type":41,"value":2127},{"type":35,"tag":232,"props":7702,"children":7703},{"class":234,"line":276},[7704,7708,7712],{"type":35,"tag":232,"props":7705,"children":7706},{"style":2095},[7707],{"type":41,"value":7073},{"type":35,"tag":232,"props":7709,"children":7710},{"style":389},[7711],{"type":41,"value":430},{"type":35,"tag":232,"props":7713,"children":7714},{"style":255},[7715],{"type":41,"value":7716},"http://192.168.8.30:3000\n",{"type":35,"tag":232,"props":7718,"children":7719},{"class":234,"line":285},[7720,7724,7728],{"type":35,"tag":232,"props":7721,"children":7722},{"style":2095},[7723],{"type":41,"value":7096},{"type":35,"tag":232,"props":7725,"children":7726},{"style":389},[7727],{"type":41,"value":430},{"type":35,"tag":232,"props":7729,"children":7730},{"style":255},[7731],{"type":41,"value":7105},{"type":35,"tag":232,"props":7733,"children":7734},{"class":234,"line":300},[7735,7739,7743],{"type":35,"tag":232,"props":7736,"children":7737},{"style":2095},[7738],{"type":41,"value":7114},{"type":35,"tag":232,"props":7740,"children":7741},{"style":389},[7742],{"type":41,"value":430},{"type":35,"tag":232,"props":7744,"children":7745},{"style":255},[7746],{"type":41,"value":7123},{"type":35,"tag":232,"props":7748,"children":7749},{"class":234,"line":314},[7750],{"type":35,"tag":232,"props":7751,"children":7752},{"emptyLinePlaceholder":270},[7753],{"type":41,"value":273},{"type":35,"tag":232,"props":7755,"children":7756},{"class":234,"line":322},[7757,7761,7765,7769],{"type":35,"tag":232,"props":7758,"children":7759},{"style":389},[7760],{"type":41,"value":2159},{"type":35,"tag":232,"props":7762,"children":7763},{"style":2095},[7764],{"type":41,"value":2098},{"type":35,"tag":232,"props":7766,"children":7767},{"style":389},[7768],{"type":41,"value":430},{"type":35,"tag":232,"props":7770,"children":7771},{"style":255},[7772],{"type":41,"value":7153},{"type":35,"tag":232,"props":7774,"children":7775},{"class":234,"line":331},[7776,7780,7784],{"type":35,"tag":232,"props":7777,"children":7778},{"style":2095},[7779],{"type":41,"value":7162},{"type":35,"tag":232,"props":7781,"children":7782},{"style":389},[7783],{"type":41,"value":430},{"type":35,"tag":232,"props":7785,"children":7786},{"style":255},[7787],{"type":41,"value":7171},{"type":35,"tag":232,"props":7789,"children":7790},{"class":234,"line":524},[7791,7795,7799],{"type":35,"tag":232,"props":7792,"children":7793},{"style":2095},[7794],{"type":41,"value":7180},{"type":35,"tag":232,"props":7796,"children":7797},{"style":389},[7798],{"type":41,"value":430},{"type":35,"tag":232,"props":7800,"children":7801},{"style":601},[7802],{"type":41,"value":2782},{"type":35,"tag":232,"props":7804,"children":7805},{"class":234,"line":533},[7806],{"type":35,"tag":232,"props":7807,"children":7808},{"style":255},[7809],{"type":41,"value":7197},{"type":35,"tag":232,"props":7811,"children":7812},{"class":234,"line":542},[7813],{"type":35,"tag":232,"props":7814,"children":7815},{"style":255},[7816],{"type":41,"value":7817},"          echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT\n",{"type":35,"tag":44,"props":7819,"children":7820},{},[7821],{"type":41,"value":7822},"Ensure to set up the secrets beforehand.",{"type":35,"tag":44,"props":7824,"children":7825},{},[7826],{"type":35,"tag":741,"props":7827,"children":7830},{"alt":7828,"src":7829},"docker secrets","/img/tutorials/automating-release-versioning-with-gitea-actions-to-the-gitea-package-registry/docker_secrets.png",[],{"type":35,"tag":44,"props":7832,"children":7833},{},[7834,7835,7840],{"type":41,"value":3894},{"type":35,"tag":228,"props":7836,"children":7837},{"className":8},[7838],{"type":41,"value":7839},"Get Meta",{"type":41,"value":7841}," step is used for obtaining metadata for the Docker tag. You can customize the Docker tag according to your preference.",{"type":35,"tag":50,"props":7843,"children":7845},{"id":7844},"build-and-upload-the-image",[7846],{"type":41,"value":7847},"Build and Upload the Image",{"type":35,"tag":221,"props":7849,"children":7851},{"className":2083,"code":7850,"language":2085,"meta":8,"style":8},"      - name: Build and push\n        uses: docker/build-push-action@v4\n        with:\n          context: .\n          file: ./Dockerfile\n          platforms: |\n            linux/amd64\n            linux/arm64                        \n          push: true\n          tags: | # replace it with your local IP and tags\n            192.168.8.30:3000/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }}\n            192.168.8.30:3000/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }}       \n",[7852],{"type":35,"tag":228,"props":7853,"children":7854},{"__ignoreMap":8},[7855,7874,7889,7900,7915,7930,7945,7952,7959,7974,7993,8000],{"type":35,"tag":232,"props":7856,"children":7857},{"class":234,"line":235},[7858,7862,7866,7870],{"type":35,"tag":232,"props":7859,"children":7860},{"style":389},[7861],{"type":41,"value":2159},{"type":35,"tag":232,"props":7863,"children":7864},{"style":2095},[7865],{"type":41,"value":2098},{"type":35,"tag":232,"props":7867,"children":7868},{"style":389},[7869],{"type":41,"value":430},{"type":35,"tag":232,"props":7871,"children":7872},{"style":255},[7873],{"type":41,"value":7235},{"type":35,"tag":232,"props":7875,"children":7876},{"class":234,"line":245},[7877,7881,7885],{"type":35,"tag":232,"props":7878,"children":7879},{"style":2095},[7880],{"type":41,"value":2289},{"type":35,"tag":232,"props":7882,"children":7883},{"style":389},[7884],{"type":41,"value":430},{"type":35,"tag":232,"props":7886,"children":7887},{"style":255},[7888],{"type":41,"value":7252},{"type":35,"tag":232,"props":7890,"children":7891},{"class":234,"line":266},[7892,7896],{"type":35,"tag":232,"props":7893,"children":7894},{"style":2095},[7895],{"type":41,"value":2307},{"type":35,"tag":232,"props":7897,"children":7898},{"style":389},[7899],{"type":41,"value":2127},{"type":35,"tag":232,"props":7901,"children":7902},{"class":234,"line":276},[7903,7907,7911],{"type":35,"tag":232,"props":7904,"children":7905},{"style":2095},[7906],{"type":41,"value":7273},{"type":35,"tag":232,"props":7908,"children":7909},{"style":389},[7910],{"type":41,"value":430},{"type":35,"tag":232,"props":7912,"children":7913},{"style":289},[7914],{"type":41,"value":7282},{"type":35,"tag":232,"props":7916,"children":7917},{"class":234,"line":285},[7918,7922,7926],{"type":35,"tag":232,"props":7919,"children":7920},{"style":2095},[7921],{"type":41,"value":7291},{"type":35,"tag":232,"props":7923,"children":7924},{"style":389},[7925],{"type":41,"value":430},{"type":35,"tag":232,"props":7927,"children":7928},{"style":255},[7929],{"type":41,"value":7300},{"type":35,"tag":232,"props":7931,"children":7932},{"class":234,"line":300},[7933,7937,7941],{"type":35,"tag":232,"props":7934,"children":7935},{"style":2095},[7936],{"type":41,"value":7309},{"type":35,"tag":232,"props":7938,"children":7939},{"style":389},[7940],{"type":41,"value":430},{"type":35,"tag":232,"props":7942,"children":7943},{"style":601},[7944],{"type":41,"value":2782},{"type":35,"tag":232,"props":7946,"children":7947},{"class":234,"line":314},[7948],{"type":35,"tag":232,"props":7949,"children":7950},{"style":255},[7951],{"type":41,"value":7326},{"type":35,"tag":232,"props":7953,"children":7954},{"class":234,"line":322},[7955],{"type":35,"tag":232,"props":7956,"children":7957},{"style":255},[7958],{"type":41,"value":7335},{"type":35,"tag":232,"props":7960,"children":7961},{"class":234,"line":331},[7962,7966,7970],{"type":35,"tag":232,"props":7963,"children":7964},{"style":2095},[7965],{"type":41,"value":7344},{"type":35,"tag":232,"props":7967,"children":7968},{"style":389},[7969],{"type":41,"value":430},{"type":35,"tag":232,"props":7971,"children":7972},{"style":289},[7973],{"type":41,"value":2347},{"type":35,"tag":232,"props":7975,"children":7976},{"class":234,"line":524},[7977,7981,7985,7989],{"type":35,"tag":232,"props":7978,"children":7979},{"style":2095},[7980],{"type":41,"value":7361},{"type":35,"tag":232,"props":7982,"children":7983},{"style":389},[7984],{"type":41,"value":430},{"type":35,"tag":232,"props":7986,"children":7987},{"style":601},[7988],{"type":41,"value":4161},{"type":35,"tag":232,"props":7990,"children":7991},{"style":239},[7992],{"type":41,"value":7374},{"type":35,"tag":232,"props":7994,"children":7995},{"class":234,"line":533},[7996],{"type":35,"tag":232,"props":7997,"children":7998},{"style":255},[7999],{"type":41,"value":7383},{"type":35,"tag":232,"props":8001,"children":8002},{"class":234,"line":542},[8003],{"type":35,"tag":232,"props":8004,"children":8005},{"style":255},[8006],{"type":41,"value":7392},{"type":35,"tag":44,"props":8008,"children":8009},{},[8010,8012,8017],{"type":41,"value":8011},"The tag format is ",{"type":35,"tag":228,"props":8013,"children":8014},{"className":8},[8015],{"type":41,"value":8016},"{package registry address}/{owner}/{image}:{tag}",{"type":41,"value":8018},", which should be replaced with your own tag.",{"type":35,"tag":44,"props":8020,"children":8021},{},[8022,8024,8029,8031,8035],{"type":41,"value":8023},"In the example above, we use the ",{"type":35,"tag":228,"props":8025,"children":8026},{"className":8},[8027],{"type":41,"value":8028},"meta",{"type":41,"value":8030}," data obtained from the ",{"type":35,"tag":228,"props":8032,"children":8033},{"className":8},[8034],{"type":41,"value":7648},{"type":41,"value":8036}," step.",{"type":35,"tag":1651,"props":8038,"children":8039},{},[8040],{"type":41,"value":1655},{"title":8,"searchDepth":245,"depth":245,"links":8042},[8043,8044,8045],{"id":38,"depth":245,"text":42},{"id":6620,"depth":245,"text":6623},{"id":7403,"depth":245,"text":7406,"children":8046},[8047,8048,8049],{"id":7414,"depth":266,"text":7417},{"id":7645,"depth":266,"text":7648},{"id":7844,"depth":266,"text":7847},"content:resources:tutorials:3.automating-release-versioning-with-gitea-actions-to-the-gitea-package-registry.md","resources/tutorials/3.automating-release-versioning-with-gitea-actions-to-the-gitea-package-registry.md",{"_path":8053,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":8054,"description":8055,"labels":8056,"category":8057,"author":8058,"coverImage":8059,"datetime":8060,"date":8061,"readingTime":8062,"body":8067,"_type":1680,"_id":9584,"_source":1682,"_file":9585,"_extension":1684},"/resources/tutorials/enable-gitea-actions-cache-to-accelerate-cicd","Enable Gitea Actions Cache to Accelerate CI/CD","Caching is a vital aspect of modern computer science to enhance performance",[5629],{"title":6594,"href":6595},{"name":6597,"href":6598,"imageUrl":6599,"role":21},"/img/tutorials/enable-gitea-actions-cache-to-accelerate-cicd/cover.jpg","2023-10-26 12:00:00","2023-10-26",{"text":8063,"minutes":8064,"time":8065,"words":8066},"4 min read",3.12,187200,624,{"type":32,"children":8068,"toc":9577},[8069,8073,8078,8104,8125,8131,8150,8183,8188,8252,8264,8366,8376,8386,8392,8402,8406,8791,8803,8810,8857,8863,8868,8880,8894,9504,9509,9517,9525,9531,9543,9563,9568,9573],{"type":35,"tag":36,"props":8070,"children":8071},{"id":38},[8072],{"type":41,"value":42},{"type":35,"tag":44,"props":8074,"children":8075},{},[8076],{"type":41,"value":8077},"Caching is a vital aspect of modern computer science. Today, we will discuss enabling Gitea Actions(Gitea's built-in CI/CD) cache to speed up CI/CD.",{"type":35,"tag":44,"props":8079,"children":8080},{},[8081,8083,8088,8090,8095,8097,8102],{"type":41,"value":8082},"Gitea Actions utilizes two types of caches. The first is the Runner Tool Cache, created when launching a runner. This runner creates a volume named ",{"type":35,"tag":228,"props":8084,"children":8085},{"className":8},[8086],{"type":41,"value":8087},"act-toolcache",{"type":41,"value":8089},", which is mounted to the local file system(usually ",{"type":35,"tag":228,"props":8091,"children":8092},{"className":8},[8093],{"type":41,"value":8094},"/opt/hostedtoolcache",{"type":41,"value":8096},"). When an action like ",{"type":35,"tag":228,"props":8098,"children":8099},{"className":8},[8100],{"type":41,"value":8101},"setup-go",{"type":41,"value":8103}," is used, it downloads and installs a version of Go, storing it in this special volume, thus preventing redundant downloads of dependencies.",{"type":35,"tag":44,"props":8105,"children":8106},{},[8107,8109,8114,8116,8123],{"type":41,"value":8108},"The second type is more fine-grained. Originating from GitHub Actions but compatible with Gitea Actions, it's called ",{"type":35,"tag":228,"props":8110,"children":8111},{"className":8},[8112],{"type":41,"value":8113},"action/cache",{"type":41,"value":8115},". This action uses a hash key to retrieve the specific cache. For more specific information and detailed configuration about this action, refer to this ",{"type":35,"tag":165,"props":8117,"children":8120},{"href":8118,"rel":8119},"https://docs.github.com/en/actions/using-workflows/caching-dependencies-to-speed-up-workflows",[169],[8121],{"type":41,"value":8122},"GitHub Official Doc",{"type":41,"value":8124},". In this tutorial, we will enable both types of caches to accelerate CI/CD.",{"type":35,"tag":36,"props":8126,"children":8128},{"id":8127},"use-runner-tool-cache",[8129],{"type":41,"value":8130},"Use Runner Tool Cache",{"type":35,"tag":44,"props":8132,"children":8133},{},[8134,8136,8141,8143,8148],{"type":41,"value":8135},"The process is straightforward. Just add an ",{"type":35,"tag":228,"props":8137,"children":8138},{"className":8},[8139],{"type":41,"value":8140},"env",{"type":41,"value":8142}," variable called ",{"type":35,"tag":228,"props":8144,"children":8145},{"className":8},[8146],{"type":41,"value":8147},"RUNNER_TOOL_CACHE",{"type":41,"value":8149}," in your Gitea action workflow, and the Gitea runner will automatically detect this environment and store the download cache there.",{"type":35,"tag":44,"props":8151,"children":8152},{},[8153,8158,8160,8165,8167,8174,8176,8181],{"type":35,"tag":94,"props":8154,"children":8155},{},[8156],{"type":41,"value":8157},"Notice",{"type":41,"value":8159},": For now, ",{"type":35,"tag":228,"props":8161,"children":8162},{"className":8},[8163],{"type":41,"value":8164},"/toolcache",{"type":41,"value":8166}," is ",{"type":35,"tag":165,"props":8168,"children":8171},{"href":8169,"rel":8170},"https://github.com/nektos/act/blob/4fae81efe4cdd9e09e7ef8e874a2d63b1ed98524/pkg/runner/run_context.go#L137-L139",[169],[8172],{"type":41,"value":8173},"hardcoded",{"type":41,"value":8175}," in the upstream project ",{"type":35,"tag":228,"props":8177,"children":8178},{"className":8},[8179],{"type":41,"value":8180},"nektos/act",{"type":41,"value":8182},". So it cannot be changed.",{"type":35,"tag":44,"props":8184,"children":8185},{},[8186],{"type":41,"value":8187},"An example configuration:",{"type":35,"tag":221,"props":8189,"children":8191},{"className":2083,"code":8190,"language":2085,"meta":8,"style":8},"jobs:\n  build:\n    env:\n      RUNNER_TOOL_CACHE: /toolcache\n...\n",[8192],{"type":35,"tag":228,"props":8193,"children":8194},{"__ignoreMap":8},[8195,8206,8218,8229,8244],{"type":35,"tag":232,"props":8196,"children":8197},{"class":234,"line":235},[8198,8202],{"type":35,"tag":232,"props":8199,"children":8200},{"style":2095},[8201],{"type":41,"value":2179},{"type":35,"tag":232,"props":8203,"children":8204},{"style":389},[8205],{"type":41,"value":2127},{"type":35,"tag":232,"props":8207,"children":8208},{"class":234,"line":245},[8209,8214],{"type":35,"tag":232,"props":8210,"children":8211},{"style":2095},[8212],{"type":41,"value":8213},"  build",{"type":35,"tag":232,"props":8215,"children":8216},{"style":389},[8217],{"type":41,"value":2127},{"type":35,"tag":232,"props":8219,"children":8220},{"class":234,"line":266},[8221,8225],{"type":35,"tag":232,"props":8222,"children":8223},{"style":2095},[8224],{"type":41,"value":6766},{"type":35,"tag":232,"props":8226,"children":8227},{"style":389},[8228],{"type":41,"value":2127},{"type":35,"tag":232,"props":8230,"children":8231},{"class":234,"line":276},[8232,8236,8240],{"type":35,"tag":232,"props":8233,"children":8234},{"style":2095},[8235],{"type":41,"value":6812},{"type":35,"tag":232,"props":8237,"children":8238},{"style":389},[8239],{"type":41,"value":430},{"type":35,"tag":232,"props":8241,"children":8242},{"style":255},[8243],{"type":41,"value":6821},{"type":35,"tag":232,"props":8245,"children":8246},{"class":234,"line":285},[8247],{"type":35,"tag":232,"props":8248,"children":8249},{"style":249},[8250],{"type":41,"value":8251},"...\n",{"type":35,"tag":44,"props":8253,"children":8254},{},[8255,8257,8262],{"type":41,"value":8256},"Alternatively, you can use ",{"type":35,"tag":228,"props":8258,"children":8259},{"className":8},[8260],{"type":41,"value":8261},"Docker Volume",{"type":41,"value":8263}," to specifically mount the cache volume:",{"type":35,"tag":221,"props":8265,"children":8267},{"className":2083,"code":8266,"language":2085,"meta":8,"style":8},"jobs:\n  build:\n    runs-on: ubuntu-latest\n    container: \n      image: your_docker_image\n      volumes:\n        - your_docker_volumn:/opt/hostedtoolcache # this is where Runner store their cache default\n",[8268],{"type":35,"tag":228,"props":8269,"children":8270},{"__ignoreMap":8},[8271,8282,8293,8308,8320,8336,8348],{"type":35,"tag":232,"props":8272,"children":8273},{"class":234,"line":235},[8274,8278],{"type":35,"tag":232,"props":8275,"children":8276},{"style":2095},[8277],{"type":41,"value":2179},{"type":35,"tag":232,"props":8279,"children":8280},{"style":389},[8281],{"type":41,"value":2127},{"type":35,"tag":232,"props":8283,"children":8284},{"class":234,"line":245},[8285,8289],{"type":35,"tag":232,"props":8286,"children":8287},{"style":2095},[8288],{"type":41,"value":8213},{"type":35,"tag":232,"props":8290,"children":8291},{"style":389},[8292],{"type":41,"value":2127},{"type":35,"tag":232,"props":8294,"children":8295},{"class":234,"line":266},[8296,8300,8304],{"type":35,"tag":232,"props":8297,"children":8298},{"style":2095},[8299],{"type":41,"value":2203},{"type":35,"tag":232,"props":8301,"children":8302},{"style":389},[8303],{"type":41,"value":430},{"type":35,"tag":232,"props":8305,"children":8306},{"style":255},[8307],{"type":41,"value":2212},{"type":35,"tag":232,"props":8309,"children":8310},{"class":234,"line":276},[8311,8315],{"type":35,"tag":232,"props":8312,"children":8313},{"style":2095},[8314],{"type":41,"value":6737},{"type":35,"tag":232,"props":8316,"children":8317},{"style":389},[8318],{"type":41,"value":8319},": \n",{"type":35,"tag":232,"props":8321,"children":8322},{"class":234,"line":285},[8323,8327,8331],{"type":35,"tag":232,"props":8324,"children":8325},{"style":2095},[8326],{"type":41,"value":6749},{"type":35,"tag":232,"props":8328,"children":8329},{"style":389},[8330],{"type":41,"value":430},{"type":35,"tag":232,"props":8332,"children":8333},{"style":255},[8334],{"type":41,"value":8335},"your_docker_image\n",{"type":35,"tag":232,"props":8337,"children":8338},{"class":234,"line":300},[8339,8344],{"type":35,"tag":232,"props":8340,"children":8341},{"style":2095},[8342],{"type":41,"value":8343},"      volumes",{"type":35,"tag":232,"props":8345,"children":8346},{"style":389},[8347],{"type":41,"value":2127},{"type":35,"tag":232,"props":8349,"children":8350},{"class":234,"line":314},[8351,8356,8361],{"type":35,"tag":232,"props":8352,"children":8353},{"style":389},[8354],{"type":41,"value":8355},"        - ",{"type":35,"tag":232,"props":8357,"children":8358},{"style":255},[8359],{"type":41,"value":8360},"your_docker_volumn:/opt/hostedtoolcache",{"type":35,"tag":232,"props":8362,"children":8363},{"style":239},[8364],{"type":41,"value":8365}," # this is where Runner store their cache default\n",{"type":35,"tag":44,"props":8367,"children":8368},{},[8369,8371],{"type":41,"value":8370},"download time before:\n",{"type":35,"tag":741,"props":8372,"children":8375},{"alt":8373,"src":8374},"download_before","/img/tutorials/enable-gitea-actions-cache-to-accelerate-cicd/download_before.png",[],{"type":35,"tag":44,"props":8377,"children":8378},{},[8379,8381],{"type":41,"value":8380},"download time after:\n",{"type":35,"tag":741,"props":8382,"children":8385},{"alt":8383,"src":8384},"download_after","/img/tutorials/enable-gitea-actions-cache-to-accelerate-cicd/download_after.png",[],{"type":35,"tag":36,"props":8387,"children":8389},{"id":8388},"use-cache-action",[8390],{"type":41,"value":8391},"Use Cache Action",{"type":35,"tag":44,"props":8393,"children":8394},{},[8395,8397,8401],{"type":41,"value":8396},"The Runner uses a cache server to store the key/value pair cache. The cache server is enabled by default. So You can directly use the ",{"type":35,"tag":228,"props":8398,"children":8399},{"className":8},[8400],{"type":41,"value":8113},{"type":41,"value":1865},{"type":35,"tag":44,"props":8403,"children":8404},{},[8405],{"type":41,"value":8187},{"type":35,"tag":221,"props":8407,"children":8409},{"className":2083,"code":8408,"language":2085,"meta":8,"style":8},"name: Caching with Go\non: push\njobs:\n  Cache-Go:\n    name: Cache Go\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n      - uses: actions/setup-go@v3\n        with:\n          go-version: '>=1.20.1'\n      - uses: https://gitea.com/actions/go-hashfiles@v0.0.1\n        id: hash-go\n        with:\n          patterns: |\n            go.mod\n            go.sum                                    \n      - name: cache go\n        id: cache-go\n        uses: actions/cache@v3\n        with: # Specify with your cache path\n          path: |\n            /your_cache_path                                    \n          key: go_path-${{ steps.hash-go.outputs.hash }}\n          restore-keys: |-\n            go_cache-${{ steps.hash-go.outputs.hash }} \n",[8410],{"type":35,"tag":228,"props":8411,"children":8412},{"__ignoreMap":8},[8413,8429,8445,8456,8468,8484,8499,8510,8530,8550,8561,8578,8598,8614,8625,8641,8649,8657,8677,8693,8709,8725,8741,8749,8766,8783],{"type":35,"tag":232,"props":8414,"children":8415},{"class":234,"line":235},[8416,8420,8424],{"type":35,"tag":232,"props":8417,"children":8418},{"style":2095},[8419],{"type":41,"value":2098},{"type":35,"tag":232,"props":8421,"children":8422},{"style":389},[8423],{"type":41,"value":430},{"type":35,"tag":232,"props":8425,"children":8426},{"style":255},[8427],{"type":41,"value":8428},"Caching with Go\n",{"type":35,"tag":232,"props":8430,"children":8431},{"class":234,"line":245},[8432,8436,8440],{"type":35,"tag":232,"props":8433,"children":8434},{"style":289},[8435],{"type":41,"value":2122},{"type":35,"tag":232,"props":8437,"children":8438},{"style":389},[8439],{"type":41,"value":430},{"type":35,"tag":232,"props":8441,"children":8442},{"style":255},[8443],{"type":41,"value":8444},"push\n",{"type":35,"tag":232,"props":8446,"children":8447},{"class":234,"line":266},[8448,8452],{"type":35,"tag":232,"props":8449,"children":8450},{"style":2095},[8451],{"type":41,"value":2179},{"type":35,"tag":232,"props":8453,"children":8454},{"style":389},[8455],{"type":41,"value":2127},{"type":35,"tag":232,"props":8457,"children":8458},{"class":234,"line":276},[8459,8464],{"type":35,"tag":232,"props":8460,"children":8461},{"style":2095},[8462],{"type":41,"value":8463},"  Cache-Go",{"type":35,"tag":232,"props":8465,"children":8466},{"style":389},[8467],{"type":41,"value":2127},{"type":35,"tag":232,"props":8469,"children":8470},{"class":234,"line":285},[8471,8475,8479],{"type":35,"tag":232,"props":8472,"children":8473},{"style":2095},[8474],{"type":41,"value":2237},{"type":35,"tag":232,"props":8476,"children":8477},{"style":389},[8478],{"type":41,"value":430},{"type":35,"tag":232,"props":8480,"children":8481},{"style":255},[8482],{"type":41,"value":8483},"Cache Go\n",{"type":35,"tag":232,"props":8485,"children":8486},{"class":234,"line":300},[8487,8491,8495],{"type":35,"tag":232,"props":8488,"children":8489},{"style":2095},[8490],{"type":41,"value":2203},{"type":35,"tag":232,"props":8492,"children":8493},{"style":389},[8494],{"type":41,"value":430},{"type":35,"tag":232,"props":8496,"children":8497},{"style":255},[8498],{"type":41,"value":2212},{"type":35,"tag":232,"props":8500,"children":8501},{"class":234,"line":314},[8502,8506],{"type":35,"tag":232,"props":8503,"children":8504},{"style":2095},[8505],{"type":41,"value":2255},{"type":35,"tag":232,"props":8507,"children":8508},{"style":389},[8509],{"type":41,"value":2127},{"type":35,"tag":232,"props":8511,"children":8512},{"class":234,"line":322},[8513,8517,8522,8526],{"type":35,"tag":232,"props":8514,"children":8515},{"style":389},[8516],{"type":41,"value":2159},{"type":35,"tag":232,"props":8518,"children":8519},{"style":2095},[8520],{"type":41,"value":8521},"uses",{"type":35,"tag":232,"props":8523,"children":8524},{"style":389},[8525],{"type":41,"value":430},{"type":35,"tag":232,"props":8527,"children":8528},{"style":255},[8529],{"type":41,"value":6868},{"type":35,"tag":232,"props":8531,"children":8532},{"class":234,"line":331},[8533,8537,8541,8545],{"type":35,"tag":232,"props":8534,"children":8535},{"style":389},[8536],{"type":41,"value":2159},{"type":35,"tag":232,"props":8538,"children":8539},{"style":2095},[8540],{"type":41,"value":8521},{"type":35,"tag":232,"props":8542,"children":8543},{"style":389},[8544],{"type":41,"value":430},{"type":35,"tag":232,"props":8546,"children":8547},{"style":255},[8548],{"type":41,"value":8549},"actions/setup-go@v3\n",{"type":35,"tag":232,"props":8551,"children":8552},{"class":234,"line":524},[8553,8557],{"type":35,"tag":232,"props":8554,"children":8555},{"style":2095},[8556],{"type":41,"value":2307},{"type":35,"tag":232,"props":8558,"children":8559},{"style":389},[8560],{"type":41,"value":2127},{"type":35,"tag":232,"props":8562,"children":8563},{"class":234,"line":533},[8564,8569,8573],{"type":35,"tag":232,"props":8565,"children":8566},{"style":2095},[8567],{"type":41,"value":8568},"          go-version",{"type":35,"tag":232,"props":8570,"children":8571},{"style":389},[8572],{"type":41,"value":430},{"type":35,"tag":232,"props":8574,"children":8575},{"style":255},[8576],{"type":41,"value":8577},"'>=1.20.1'\n",{"type":35,"tag":232,"props":8579,"children":8580},{"class":234,"line":542},[8581,8585,8589,8593],{"type":35,"tag":232,"props":8582,"children":8583},{"style":389},[8584],{"type":41,"value":2159},{"type":35,"tag":232,"props":8586,"children":8587},{"style":2095},[8588],{"type":41,"value":8521},{"type":35,"tag":232,"props":8590,"children":8591},{"style":389},[8592],{"type":41,"value":430},{"type":35,"tag":232,"props":8594,"children":8595},{"style":255},[8596],{"type":41,"value":8597},"https://gitea.com/actions/go-hashfiles@v0.0.1\n",{"type":35,"tag":232,"props":8599,"children":8600},{"class":234,"line":2249},[8601,8605,8609],{"type":35,"tag":232,"props":8602,"children":8603},{"style":2095},[8604],{"type":41,"value":7162},{"type":35,"tag":232,"props":8606,"children":8607},{"style":389},[8608],{"type":41,"value":430},{"type":35,"tag":232,"props":8610,"children":8611},{"style":255},[8612],{"type":41,"value":8613},"hash-go\n",{"type":35,"tag":232,"props":8615,"children":8616},{"class":234,"line":2262},[8617,8621],{"type":35,"tag":232,"props":8618,"children":8619},{"style":2095},[8620],{"type":41,"value":2307},{"type":35,"tag":232,"props":8622,"children":8623},{"style":389},[8624],{"type":41,"value":2127},{"type":35,"tag":232,"props":8626,"children":8627},{"class":234,"line":2283},[8628,8633,8637],{"type":35,"tag":232,"props":8629,"children":8630},{"style":2095},[8631],{"type":41,"value":8632},"          patterns",{"type":35,"tag":232,"props":8634,"children":8635},{"style":389},[8636],{"type":41,"value":430},{"type":35,"tag":232,"props":8638,"children":8639},{"style":601},[8640],{"type":41,"value":2782},{"type":35,"tag":232,"props":8642,"children":8643},{"class":234,"line":2301},[8644],{"type":35,"tag":232,"props":8645,"children":8646},{"style":255},[8647],{"type":41,"value":8648},"            go.mod\n",{"type":35,"tag":232,"props":8650,"children":8651},{"class":234,"line":2314},[8652],{"type":35,"tag":232,"props":8653,"children":8654},{"style":255},[8655],{"type":41,"value":8656},"            go.sum                                    \n",{"type":35,"tag":232,"props":8658,"children":8659},{"class":234,"line":2332},[8660,8664,8668,8672],{"type":35,"tag":232,"props":8661,"children":8662},{"style":389},[8663],{"type":41,"value":2159},{"type":35,"tag":232,"props":8665,"children":8666},{"style":2095},[8667],{"type":41,"value":2098},{"type":35,"tag":232,"props":8669,"children":8670},{"style":389},[8671],{"type":41,"value":430},{"type":35,"tag":232,"props":8673,"children":8674},{"style":255},[8675],{"type":41,"value":8676},"cache go\n",{"type":35,"tag":232,"props":8678,"children":8679},{"class":234,"line":2350},[8680,8684,8688],{"type":35,"tag":232,"props":8681,"children":8682},{"style":2095},[8683],{"type":41,"value":7162},{"type":35,"tag":232,"props":8685,"children":8686},{"style":389},[8687],{"type":41,"value":430},{"type":35,"tag":232,"props":8689,"children":8690},{"style":255},[8691],{"type":41,"value":8692},"cache-go\n",{"type":35,"tag":232,"props":8694,"children":8695},{"class":234,"line":2368},[8696,8700,8704],{"type":35,"tag":232,"props":8697,"children":8698},{"style":2095},[8699],{"type":41,"value":2289},{"type":35,"tag":232,"props":8701,"children":8702},{"style":389},[8703],{"type":41,"value":430},{"type":35,"tag":232,"props":8705,"children":8706},{"style":255},[8707],{"type":41,"value":8708},"actions/cache@v3\n",{"type":35,"tag":232,"props":8710,"children":8711},{"class":234,"line":2386},[8712,8716,8720],{"type":35,"tag":232,"props":8713,"children":8714},{"style":2095},[8715],{"type":41,"value":2307},{"type":35,"tag":232,"props":8717,"children":8718},{"style":389},[8719],{"type":41,"value":430},{"type":35,"tag":232,"props":8721,"children":8722},{"style":239},[8723],{"type":41,"value":8724},"# Specify with your cache path\n",{"type":35,"tag":232,"props":8726,"children":8727},{"class":234,"line":2404},[8728,8733,8737],{"type":35,"tag":232,"props":8729,"children":8730},{"style":2095},[8731],{"type":41,"value":8732},"          path",{"type":35,"tag":232,"props":8734,"children":8735},{"style":389},[8736],{"type":41,"value":430},{"type":35,"tag":232,"props":8738,"children":8739},{"style":601},[8740],{"type":41,"value":2782},{"type":35,"tag":232,"props":8742,"children":8743},{"class":234,"line":2767},[8744],{"type":35,"tag":232,"props":8745,"children":8746},{"style":255},[8747],{"type":41,"value":8748},"            /your_cache_path                                    \n",{"type":35,"tag":232,"props":8750,"children":8751},{"class":234,"line":2785},[8752,8757,8761],{"type":35,"tag":232,"props":8753,"children":8754},{"style":2095},[8755],{"type":41,"value":8756},"          key",{"type":35,"tag":232,"props":8758,"children":8759},{"style":389},[8760],{"type":41,"value":430},{"type":35,"tag":232,"props":8762,"children":8763},{"style":255},[8764],{"type":41,"value":8765},"go_path-${{ steps.hash-go.outputs.hash }}\n",{"type":35,"tag":232,"props":8767,"children":8768},{"class":234,"line":2794},[8769,8774,8778],{"type":35,"tag":232,"props":8770,"children":8771},{"style":2095},[8772],{"type":41,"value":8773},"          restore-keys",{"type":35,"tag":232,"props":8775,"children":8776},{"style":389},[8777],{"type":41,"value":430},{"type":35,"tag":232,"props":8779,"children":8780},{"style":601},[8781],{"type":41,"value":8782},"|-\n",{"type":35,"tag":232,"props":8784,"children":8785},{"class":234,"line":2802},[8786],{"type":35,"tag":232,"props":8787,"children":8788},{"style":255},[8789],{"type":41,"value":8790},"            go_cache-${{ steps.hash-go.outputs.hash }}\n",{"type":35,"tag":44,"props":8792,"children":8793},{},[8794,8796,8801],{"type":41,"value":8795},"This example utilizes a go cache and ",{"type":35,"tag":228,"props":8797,"children":8798},{"className":8},[8799],{"type":41,"value":8800},"go-hashfiles",{"type":41,"value":8802}," to generate a hash. You should specify your cache path according to your programming language and define the key in any form you like.",{"type":35,"tag":44,"props":8804,"children":8805},{},[8806],{"type":35,"tag":94,"props":8807,"children":8808},{},[8809],{"type":41,"value":8157},{"type":35,"tag":561,"props":8811,"children":8812},{},[8813,8834],{"type":35,"tag":66,"props":8814,"children":8815},{},[8816,8818,8823,8825,8832],{"type":41,"value":8817},"If you are running the Runner with docker. You may encounter network issue with the cache server. You should change the cache server host and port in ",{"type":35,"tag":228,"props":8819,"children":8820},{"className":8},[8821],{"type":41,"value":8822},"config.yaml",{"type":41,"value":8824}," for your runner. The configuration is explained ",{"type":35,"tag":165,"props":8826,"children":8829},{"href":8827,"rel":8828},"https://docs.gitea.com/usage/actions/act-runner#configuring-cache-when-starting-a-runner-using-docker-image",[169],[8830],{"type":41,"value":8831},"here",{"type":41,"value":8833}," in detail.",{"type":35,"tag":66,"props":8835,"children":8836},{},[8837,8839,8844,8846,8855],{"type":41,"value":8838},"The built-in function ",{"type":35,"tag":228,"props":8840,"children":8841},{"className":8},[8842],{"type":41,"value":8843},"hashFiles",{"type":41,"value":8845}," in the workflow yaml is not supported in Gitea Actions right now. You can use ",{"type":35,"tag":165,"props":8847,"children":8850},{"href":8848,"rel":8849},"https://gitea.com/actions/go-hashfiles",[169],[8851],{"type":35,"tag":228,"props":8852,"children":8853},{"className":8},[8854],{"type":41,"value":8800},{"type":41,"value":8856},"(maintained by Gitea maintainers) or other alternatives instead.",{"type":35,"tag":36,"props":8858,"children":8860},{"id":8859},"a-complete-example",[8861],{"type":41,"value":8862},"A Complete Example",{"type":35,"tag":44,"props":8864,"children":8865},{},[8866],{"type":41,"value":8867},"Let's use an example to demonstrate how to utilize these two types of caches in a real development environment.",{"type":35,"tag":44,"props":8869,"children":8870},{},[8871,8873,8878],{"type":41,"value":8872},"Assume we're going to build an app called ",{"type":35,"tag":228,"props":8874,"children":8875},{"className":8},[8876],{"type":41,"value":8877},"Hello-Gitea",{"type":41,"value":8879}," using Go, and we enable the Gitea Actions workflow for every Push.",{"type":35,"tag":44,"props":8881,"children":8882},{},[8883,8885,8892],{"type":41,"value":8884},"Here is the workflow yaml(this file is also available ",{"type":35,"tag":165,"props":8886,"children":8889},{"href":8887,"rel":8888},"https://gitea.com/lng2020/cache_example/src/branch/main/.gitea/workflows/cache.yaml",[169],[8890],{"type":41,"value":8891},"on Gitea website",{"type":41,"value":8893},")",{"type":35,"tag":221,"props":8895,"children":8897},{"className":2083,"code":8896,"language":2085,"meta":8,"style":8},"name: Test Cache\n\non: \n  push\n\njobs:\n  TestCache:\n    env: \n      RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache\n    name: Cache Go\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n\n      - uses: actions/setup-go@v3\n        with:\n          go-version: '>=1.20.1'\n\n      - name: Get go-hashfiles\n        uses: https://gitea.com/actions/go-hashfiles@v0.0.1\n        id: hash-go\n        with:\n          patterns: |-\n            go.mod\n            go.sum                                            \n\n      - name: Echo hash\n        run: echo ${{ steps.hash-go.outputs.hash }}\n        \n      - name: Cache go\n        id: cache-go\n        uses: https://github.com/actions/cache@v3 # Action cache\n        with: # specify with your GOMODCACHE and GOCACHE\n          path: |- \n            /root/go/pkg/mod\n            /root/.cache/go-build\n          key: go_cache-${{ steps.hash-go.outputs.hash }}  \n          restore-keys: |-\n            go_cache-${{ steps.hash-go.outputs.hash }}            \n\n      - name: Build\n        run: go build -v .\n\n      - name: Test\n        run: go test -v ./...\n",[8898],{"type":35,"tag":228,"props":8899,"children":8900},{"__ignoreMap":8},[8901,8917,8924,8935,8942,8949,8960,8972,8983,9003,9018,9033,9044,9063,9070,9089,9100,9115,9122,9142,9157,9172,9183,9198,9205,9213,9220,9240,9256,9264,9284,9299,9320,9336,9358,9366,9374,9395,9410,9418,9425,9445,9461,9468,9488],{"type":35,"tag":232,"props":8902,"children":8903},{"class":234,"line":235},[8904,8908,8912],{"type":35,"tag":232,"props":8905,"children":8906},{"style":2095},[8907],{"type":41,"value":2098},{"type":35,"tag":232,"props":8909,"children":8910},{"style":389},[8911],{"type":41,"value":430},{"type":35,"tag":232,"props":8913,"children":8914},{"style":255},[8915],{"type":41,"value":8916},"Test Cache\n",{"type":35,"tag":232,"props":8918,"children":8919},{"class":234,"line":245},[8920],{"type":35,"tag":232,"props":8921,"children":8922},{"emptyLinePlaceholder":270},[8923],{"type":41,"value":273},{"type":35,"tag":232,"props":8925,"children":8926},{"class":234,"line":266},[8927,8931],{"type":35,"tag":232,"props":8928,"children":8929},{"style":289},[8930],{"type":41,"value":2122},{"type":35,"tag":232,"props":8932,"children":8933},{"style":389},[8934],{"type":41,"value":8319},{"type":35,"tag":232,"props":8936,"children":8937},{"class":234,"line":276},[8938],{"type":35,"tag":232,"props":8939,"children":8940},{"style":255},[8941],{"type":41,"value":6684},{"type":35,"tag":232,"props":8943,"children":8944},{"class":234,"line":285},[8945],{"type":35,"tag":232,"props":8946,"children":8947},{"emptyLinePlaceholder":270},[8948],{"type":41,"value":273},{"type":35,"tag":232,"props":8950,"children":8951},{"class":234,"line":300},[8952,8956],{"type":35,"tag":232,"props":8953,"children":8954},{"style":2095},[8955],{"type":41,"value":2179},{"type":35,"tag":232,"props":8957,"children":8958},{"style":389},[8959],{"type":41,"value":2127},{"type":35,"tag":232,"props":8961,"children":8962},{"class":234,"line":314},[8963,8968],{"type":35,"tag":232,"props":8964,"children":8965},{"style":2095},[8966],{"type":41,"value":8967},"  TestCache",{"type":35,"tag":232,"props":8969,"children":8970},{"style":389},[8971],{"type":41,"value":2127},{"type":35,"tag":232,"props":8973,"children":8974},{"class":234,"line":322},[8975,8979],{"type":35,"tag":232,"props":8976,"children":8977},{"style":2095},[8978],{"type":41,"value":6766},{"type":35,"tag":232,"props":8980,"children":8981},{"style":389},[8982],{"type":41,"value":8319},{"type":35,"tag":232,"props":8984,"children":8985},{"class":234,"line":331},[8986,8990,8994,8998],{"type":35,"tag":232,"props":8987,"children":8988},{"style":2095},[8989],{"type":41,"value":6812},{"type":35,"tag":232,"props":8991,"children":8992},{"style":389},[8993],{"type":41,"value":430},{"type":35,"tag":232,"props":8995,"children":8996},{"style":255},[8997],{"type":41,"value":8164},{"type":35,"tag":232,"props":8999,"children":9000},{"style":239},[9001],{"type":41,"value":9002}," # Runner Tool Cache\n",{"type":35,"tag":232,"props":9004,"children":9005},{"class":234,"line":524},[9006,9010,9014],{"type":35,"tag":232,"props":9007,"children":9008},{"style":2095},[9009],{"type":41,"value":2237},{"type":35,"tag":232,"props":9011,"children":9012},{"style":389},[9013],{"type":41,"value":430},{"type":35,"tag":232,"props":9015,"children":9016},{"style":255},[9017],{"type":41,"value":8483},{"type":35,"tag":232,"props":9019,"children":9020},{"class":234,"line":533},[9021,9025,9029],{"type":35,"tag":232,"props":9022,"children":9023},{"style":2095},[9024],{"type":41,"value":2203},{"type":35,"tag":232,"props":9026,"children":9027},{"style":389},[9028],{"type":41,"value":430},{"type":35,"tag":232,"props":9030,"children":9031},{"style":255},[9032],{"type":41,"value":2212},{"type":35,"tag":232,"props":9034,"children":9035},{"class":234,"line":542},[9036,9040],{"type":35,"tag":232,"props":9037,"children":9038},{"style":2095},[9039],{"type":41,"value":2255},{"type":35,"tag":232,"props":9041,"children":9042},{"style":389},[9043],{"type":41,"value":2127},{"type":35,"tag":232,"props":9045,"children":9046},{"class":234,"line":2249},[9047,9051,9055,9059],{"type":35,"tag":232,"props":9048,"children":9049},{"style":389},[9050],{"type":41,"value":2159},{"type":35,"tag":232,"props":9052,"children":9053},{"style":2095},[9054],{"type":41,"value":8521},{"type":35,"tag":232,"props":9056,"children":9057},{"style":389},[9058],{"type":41,"value":430},{"type":35,"tag":232,"props":9060,"children":9061},{"style":255},[9062],{"type":41,"value":6868},{"type":35,"tag":232,"props":9064,"children":9065},{"class":234,"line":2262},[9066],{"type":35,"tag":232,"props":9067,"children":9068},{"emptyLinePlaceholder":270},[9069],{"type":41,"value":273},{"type":35,"tag":232,"props":9071,"children":9072},{"class":234,"line":2283},[9073,9077,9081,9085],{"type":35,"tag":232,"props":9074,"children":9075},{"style":389},[9076],{"type":41,"value":2159},{"type":35,"tag":232,"props":9078,"children":9079},{"style":2095},[9080],{"type":41,"value":8521},{"type":35,"tag":232,"props":9082,"children":9083},{"style":389},[9084],{"type":41,"value":430},{"type":35,"tag":232,"props":9086,"children":9087},{"style":255},[9088],{"type":41,"value":8549},{"type":35,"tag":232,"props":9090,"children":9091},{"class":234,"line":2301},[9092,9096],{"type":35,"tag":232,"props":9093,"children":9094},{"style":2095},[9095],{"type":41,"value":2307},{"type":35,"tag":232,"props":9097,"children":9098},{"style":389},[9099],{"type":41,"value":2127},{"type":35,"tag":232,"props":9101,"children":9102},{"class":234,"line":2314},[9103,9107,9111],{"type":35,"tag":232,"props":9104,"children":9105},{"style":2095},[9106],{"type":41,"value":8568},{"type":35,"tag":232,"props":9108,"children":9109},{"style":389},[9110],{"type":41,"value":430},{"type":35,"tag":232,"props":9112,"children":9113},{"style":255},[9114],{"type":41,"value":8577},{"type":35,"tag":232,"props":9116,"children":9117},{"class":234,"line":2332},[9118],{"type":35,"tag":232,"props":9119,"children":9120},{"emptyLinePlaceholder":270},[9121],{"type":41,"value":273},{"type":35,"tag":232,"props":9123,"children":9124},{"class":234,"line":2350},[9125,9129,9133,9137],{"type":35,"tag":232,"props":9126,"children":9127},{"style":389},[9128],{"type":41,"value":2159},{"type":35,"tag":232,"props":9130,"children":9131},{"style":2095},[9132],{"type":41,"value":2098},{"type":35,"tag":232,"props":9134,"children":9135},{"style":389},[9136],{"type":41,"value":430},{"type":35,"tag":232,"props":9138,"children":9139},{"style":255},[9140],{"type":41,"value":9141},"Get go-hashfiles\n",{"type":35,"tag":232,"props":9143,"children":9144},{"class":234,"line":2368},[9145,9149,9153],{"type":35,"tag":232,"props":9146,"children":9147},{"style":2095},[9148],{"type":41,"value":2289},{"type":35,"tag":232,"props":9150,"children":9151},{"style":389},[9152],{"type":41,"value":430},{"type":35,"tag":232,"props":9154,"children":9155},{"style":255},[9156],{"type":41,"value":8597},{"type":35,"tag":232,"props":9158,"children":9159},{"class":234,"line":2386},[9160,9164,9168],{"type":35,"tag":232,"props":9161,"children":9162},{"style":2095},[9163],{"type":41,"value":7162},{"type":35,"tag":232,"props":9165,"children":9166},{"style":389},[9167],{"type":41,"value":430},{"type":35,"tag":232,"props":9169,"children":9170},{"style":255},[9171],{"type":41,"value":8613},{"type":35,"tag":232,"props":9173,"children":9174},{"class":234,"line":2404},[9175,9179],{"type":35,"tag":232,"props":9176,"children":9177},{"style":2095},[9178],{"type":41,"value":2307},{"type":35,"tag":232,"props":9180,"children":9181},{"style":389},[9182],{"type":41,"value":2127},{"type":35,"tag":232,"props":9184,"children":9185},{"class":234,"line":2767},[9186,9190,9194],{"type":35,"tag":232,"props":9187,"children":9188},{"style":2095},[9189],{"type":41,"value":8632},{"type":35,"tag":232,"props":9191,"children":9192},{"style":389},[9193],{"type":41,"value":430},{"type":35,"tag":232,"props":9195,"children":9196},{"style":601},[9197],{"type":41,"value":8782},{"type":35,"tag":232,"props":9199,"children":9200},{"class":234,"line":2785},[9201],{"type":35,"tag":232,"props":9202,"children":9203},{"style":255},[9204],{"type":41,"value":8648},{"type":35,"tag":232,"props":9206,"children":9207},{"class":234,"line":2794},[9208],{"type":35,"tag":232,"props":9209,"children":9210},{"style":255},[9211],{"type":41,"value":9212},"            go.sum                                            \n",{"type":35,"tag":232,"props":9214,"children":9215},{"class":234,"line":2802},[9216],{"type":35,"tag":232,"props":9217,"children":9218},{"emptyLinePlaceholder":270},[9219],{"type":41,"value":273},{"type":35,"tag":232,"props":9221,"children":9222},{"class":234,"line":2811},[9223,9227,9231,9235],{"type":35,"tag":232,"props":9224,"children":9225},{"style":389},[9226],{"type":41,"value":2159},{"type":35,"tag":232,"props":9228,"children":9229},{"style":2095},[9230],{"type":41,"value":2098},{"type":35,"tag":232,"props":9232,"children":9233},{"style":389},[9234],{"type":41,"value":430},{"type":35,"tag":232,"props":9236,"children":9237},{"style":255},[9238],{"type":41,"value":9239},"Echo hash\n",{"type":35,"tag":232,"props":9241,"children":9242},{"class":234,"line":2819},[9243,9247,9251],{"type":35,"tag":232,"props":9244,"children":9245},{"style":2095},[9246],{"type":41,"value":7180},{"type":35,"tag":232,"props":9248,"children":9249},{"style":389},[9250],{"type":41,"value":430},{"type":35,"tag":232,"props":9252,"children":9253},{"style":255},[9254],{"type":41,"value":9255},"echo ${{ steps.hash-go.outputs.hash }}\n",{"type":35,"tag":232,"props":9257,"children":9258},{"class":234,"line":6062},[9259],{"type":35,"tag":232,"props":9260,"children":9261},{"style":389},[9262],{"type":41,"value":9263},"        \n",{"type":35,"tag":232,"props":9265,"children":9266},{"class":234,"line":6075},[9267,9271,9275,9279],{"type":35,"tag":232,"props":9268,"children":9269},{"style":389},[9270],{"type":41,"value":2159},{"type":35,"tag":232,"props":9272,"children":9273},{"style":2095},[9274],{"type":41,"value":2098},{"type":35,"tag":232,"props":9276,"children":9277},{"style":389},[9278],{"type":41,"value":430},{"type":35,"tag":232,"props":9280,"children":9281},{"style":255},[9282],{"type":41,"value":9283},"Cache go\n",{"type":35,"tag":232,"props":9285,"children":9286},{"class":234,"line":6088},[9287,9291,9295],{"type":35,"tag":232,"props":9288,"children":9289},{"style":2095},[9290],{"type":41,"value":7162},{"type":35,"tag":232,"props":9292,"children":9293},{"style":389},[9294],{"type":41,"value":430},{"type":35,"tag":232,"props":9296,"children":9297},{"style":255},[9298],{"type":41,"value":8692},{"type":35,"tag":232,"props":9300,"children":9301},{"class":234,"line":6101},[9302,9306,9310,9315],{"type":35,"tag":232,"props":9303,"children":9304},{"style":2095},[9305],{"type":41,"value":2289},{"type":35,"tag":232,"props":9307,"children":9308},{"style":389},[9309],{"type":41,"value":430},{"type":35,"tag":232,"props":9311,"children":9312},{"style":255},[9313],{"type":41,"value":9314},"https://github.com/actions/cache@v3",{"type":35,"tag":232,"props":9316,"children":9317},{"style":239},[9318],{"type":41,"value":9319}," # Action cache\n",{"type":35,"tag":232,"props":9321,"children":9322},{"class":234,"line":7067},[9323,9327,9331],{"type":35,"tag":232,"props":9324,"children":9325},{"style":2095},[9326],{"type":41,"value":2307},{"type":35,"tag":232,"props":9328,"children":9329},{"style":389},[9330],{"type":41,"value":430},{"type":35,"tag":232,"props":9332,"children":9333},{"style":239},[9334],{"type":41,"value":9335},"# specify with your GOMODCACHE and GOCACHE\n",{"type":35,"tag":232,"props":9337,"children":9338},{"class":234,"line":7090},[9339,9343,9347,9352],{"type":35,"tag":232,"props":9340,"children":9341},{"style":2095},[9342],{"type":41,"value":8732},{"type":35,"tag":232,"props":9344,"children":9345},{"style":389},[9346],{"type":41,"value":430},{"type":35,"tag":232,"props":9348,"children":9349},{"style":601},[9350],{"type":41,"value":9351},"|-",{"type":35,"tag":232,"props":9353,"children":9355},{"style":9354},"--shiki-default:#FDAEB7;--shiki-default-font-style:italic",[9356],{"type":41,"value":9357}," \n",{"type":35,"tag":232,"props":9359,"children":9360},{"class":234,"line":7108},[9361],{"type":35,"tag":232,"props":9362,"children":9363},{"style":255},[9364],{"type":41,"value":9365},"            /root/go/pkg/mod\n",{"type":35,"tag":232,"props":9367,"children":9368},{"class":234,"line":7126},[9369],{"type":35,"tag":232,"props":9370,"children":9371},{"style":255},[9372],{"type":41,"value":9373},"            /root/.cache/go-build\n",{"type":35,"tag":232,"props":9375,"children":9376},{"class":234,"line":7135},[9377,9381,9385,9390],{"type":35,"tag":232,"props":9378,"children":9379},{"style":2095},[9380],{"type":41,"value":8756},{"type":35,"tag":232,"props":9382,"children":9383},{"style":389},[9384],{"type":41,"value":430},{"type":35,"tag":232,"props":9386,"children":9387},{"style":255},[9388],{"type":41,"value":9389},"go_cache-${{ steps.hash-go.outputs.hash }}",{"type":35,"tag":232,"props":9391,"children":9392},{"style":389},[9393],{"type":41,"value":9394},"  \n",{"type":35,"tag":232,"props":9396,"children":9397},{"class":234,"line":7156},[9398,9402,9406],{"type":35,"tag":232,"props":9399,"children":9400},{"style":2095},[9401],{"type":41,"value":8773},{"type":35,"tag":232,"props":9403,"children":9404},{"style":389},[9405],{"type":41,"value":430},{"type":35,"tag":232,"props":9407,"children":9408},{"style":601},[9409],{"type":41,"value":8782},{"type":35,"tag":232,"props":9411,"children":9412},{"class":234,"line":7174},[9413],{"type":35,"tag":232,"props":9414,"children":9415},{"style":255},[9416],{"type":41,"value":9417},"            go_cache-${{ steps.hash-go.outputs.hash }}            \n",{"type":35,"tag":232,"props":9419,"children":9420},{"class":234,"line":7191},[9421],{"type":35,"tag":232,"props":9422,"children":9423},{"emptyLinePlaceholder":270},[9424],{"type":41,"value":273},{"type":35,"tag":232,"props":9426,"children":9427},{"class":234,"line":7200},[9428,9432,9436,9440],{"type":35,"tag":232,"props":9429,"children":9430},{"style":389},[9431],{"type":41,"value":2159},{"type":35,"tag":232,"props":9433,"children":9434},{"style":2095},[9435],{"type":41,"value":2098},{"type":35,"tag":232,"props":9437,"children":9438},{"style":389},[9439],{"type":41,"value":430},{"type":35,"tag":232,"props":9441,"children":9442},{"style":255},[9443],{"type":41,"value":9444},"Build\n",{"type":35,"tag":232,"props":9446,"children":9447},{"class":234,"line":7209},[9448,9452,9456],{"type":35,"tag":232,"props":9449,"children":9450},{"style":2095},[9451],{"type":41,"value":7180},{"type":35,"tag":232,"props":9453,"children":9454},{"style":389},[9455],{"type":41,"value":430},{"type":35,"tag":232,"props":9457,"children":9458},{"style":255},[9459],{"type":41,"value":9460},"go build -v .\n",{"type":35,"tag":232,"props":9462,"children":9463},{"class":234,"line":7217},[9464],{"type":35,"tag":232,"props":9465,"children":9466},{"emptyLinePlaceholder":270},[9467],{"type":41,"value":273},{"type":35,"tag":232,"props":9469,"children":9470},{"class":234,"line":7238},[9471,9475,9479,9483],{"type":35,"tag":232,"props":9472,"children":9473},{"style":389},[9474],{"type":41,"value":2159},{"type":35,"tag":232,"props":9476,"children":9477},{"style":2095},[9478],{"type":41,"value":2098},{"type":35,"tag":232,"props":9480,"children":9481},{"style":389},[9482],{"type":41,"value":430},{"type":35,"tag":232,"props":9484,"children":9485},{"style":255},[9486],{"type":41,"value":9487},"Test\n",{"type":35,"tag":232,"props":9489,"children":9490},{"class":234,"line":7255},[9491,9495,9499],{"type":35,"tag":232,"props":9492,"children":9493},{"style":2095},[9494],{"type":41,"value":7180},{"type":35,"tag":232,"props":9496,"children":9497},{"style":389},[9498],{"type":41,"value":430},{"type":35,"tag":232,"props":9500,"children":9501},{"style":255},[9502],{"type":41,"value":9503},"go test -v ./...\n",{"type":35,"tag":44,"props":9505,"children":9506},{},[9507],{"type":41,"value":9508},"After setting everything up, we can see how these caches are utilized.",{"type":35,"tag":44,"props":9510,"children":9511},{},[9512],{"type":35,"tag":741,"props":9513,"children":9516},{"alt":9514,"src":9515},"tool cache","/img/tutorials/enable-gitea-actions-cache-to-accelerate-cicd/tool_cache.png",[],{"type":35,"tag":44,"props":9518,"children":9519},{},[9520],{"type":35,"tag":741,"props":9521,"children":9524},{"alt":9522,"src":9523},"action cache","/img/tutorials/enable-gitea-actions-cache-to-accelerate-cicd/action_cache.png",[],{"type":35,"tag":36,"props":9526,"children":9528},{"id":9527},"faq",[9529],{"type":41,"value":9530},"FAQ",{"type":35,"tag":44,"props":9532,"children":9533},{},[9534,9536,9541],{"type":41,"value":9535},"Q: Why should I specify ",{"type":35,"tag":228,"props":9537,"children":9538},{"className":8},[9539],{"type":41,"value":9540},"RUNNER_TOOL_CACHE: /toolcache",{"type":41,"value":9542}," to make the Runner Tool Cache work? It seems like it should cache the file by default",{"type":35,"tag":44,"props":9544,"children":9545},{},[9546,9548,9552,9554,9561],{"type":41,"value":9547},"A: It's an upstream issue of ",{"type":35,"tag":228,"props":9549,"children":9550},{"className":8},[9551],{"type":41,"value":8180},{"type":41,"value":9553},". See the ",{"type":35,"tag":165,"props":9555,"children":9558},{"href":9556,"rel":9557},"https://gitea.com/gitea/runner/issues/70",[169],[9559],{"type":41,"value":9560},"issue",{"type":41,"value":9562}," for more details.",{"type":35,"tag":44,"props":9564,"children":9565},{},[9566],{"type":41,"value":9567},"Q: Can different runners on the same host share the Runner Tool Cache?",{"type":35,"tag":44,"props":9569,"children":9570},{},[9571],{"type":41,"value":9572},"A: Yes, they can. To do so, use a Docker volume to map the cache directory.",{"type":35,"tag":1651,"props":9574,"children":9575},{},[9576],{"type":41,"value":1655},{"title":8,"searchDepth":245,"depth":245,"links":9578},[9579,9580,9581,9582,9583],{"id":38,"depth":245,"text":42},{"id":8127,"depth":245,"text":8130},{"id":8388,"depth":245,"text":8391},{"id":8859,"depth":245,"text":8862},{"id":9527,"depth":245,"text":9530},"content:resources:tutorials:2.enable-gitea-actions-cache-to-accelerate-cicd.md","resources/tutorials/2.enable-gitea-actions-cache-to-accelerate-cicd.md",{"_path":9587,"_dir":6,"_draft":7,"_partial":7,"_locale":8,"title":9588,"description":5627,"labels":9589,"category":9591,"author":9592,"coverImage":9593,"datetime":9594,"date":9595,"readingTime":9596,"body":9600,"_type":1680,"_id":10524,"_source":1682,"_file":10525,"_extension":1684},"/resources/tutorials/use-gitea-and-renovate-bot-to-automatically-monitor-software-packages","Use Gitea and Renovate bot to automatically monitor software packages",[9590],"dependencies",{"title":4640,"href":5632},{"name":6597,"href":6598,"imageUrl":6599,"role":21},"/img/tutorials/use-gitea-and-renovate-bot-to-automatically-monitor-software-packages/cover.jpg","2023-10-23 12:00:00","2023-10-23",{"text":27,"minutes":9597,"time":9598,"words":9599},2.285,137100,457,{"type":32,"children":9601,"toc":10515},[9602,9606,9611,9616,9620,9674,9680,9685,9693,9698,9706,9712,9717,9729,9734,9887,9892,9906,9911,9919,9925,9936,9954,10128,10140,10146,10164,10455,10468,10479,10487,10493,10498,10503,10511],{"type":35,"tag":36,"props":9603,"children":9604},{"id":38},[9605],{"type":41,"value":42},{"type":35,"tag":44,"props":9607,"children":9608},{},[9609],{"type":41,"value":9610},"Keeping your project's dependencies up-to-date is important to get bug fixes, new features and security updates. But manually checking and updating dozens of dependencies can be tedious. This tutorial will show you how to automate dependency updates using Gitea and Renovate bot.",{"type":35,"tag":44,"props":9612,"children":9613},{},[9614],{"type":41,"value":9615},"There are various ways to use Renovate Bot in Gitea. You can set up your local Renovate bot instance or integrate it with third party CI/CD. In this tutorial, we will use Gitea Action(Gitea's built-in CI/CD) since it's probably the easiest out-of-the-box way.",{"type":35,"tag":36,"props":9617,"children":9618},{"id":4733},[9619],{"type":41,"value":4736},{"type":35,"tag":62,"props":9621,"children":9622},{},[9623,9645,9664,9669],{"type":35,"tag":66,"props":9624,"children":9625},{},[9626,9628,9635,9637,9644],{"type":41,"value":9627},"A Gitea server installed and running. If you don't have one, refer to the ",{"type":35,"tag":165,"props":9629,"children":9632},{"href":9630,"rel":9631},"https://docs.gitea.com/category/installation",[169],[9633],{"type":41,"value":9634},"Gitea installation guide",{"type":41,"value":9636}," for your platform or you can try this on ",{"type":35,"tag":165,"props":9638,"children":9641},{"href":9639,"rel":9640},"https://www.gitea.com",[169],[9642],{"type":41,"value":9643},"Gitea's Official Website",{"type":41,"value":1865},{"type":35,"tag":66,"props":9646,"children":9647},{},[9648,9650,9656,9658,9663],{"type":41,"value":9649},"Gitea Action enabled. If you don't know how to use Gitea Action for your local Gitea server, refer to the ",{"type":35,"tag":165,"props":9651,"children":9654},{"href":9652,"rel":9653},"https://docs.gitea.com/usage/actions/quickstart",[169],[9655],{"type":41,"value":136},{"type":41,"value":9657}," or you can try this on ",{"type":35,"tag":165,"props":9659,"children":9661},{"href":9639,"rel":9660},[169],[9662],{"type":41,"value":9643},{"type":41,"value":1865},{"type":35,"tag":66,"props":9665,"children":9666},{},[9667],{"type":41,"value":9668},"A repository in Gitea containing your project code.",{"type":35,"tag":66,"props":9670,"children":9671},{},[9672],{"type":41,"value":9673},"Your project should have a package.json, requirements.txt or similar file defining its dependencies.",{"type":35,"tag":36,"props":9675,"children":9677},{"id":9676},"step-1-create-renovate-bot-account",[9678],{"type":41,"value":9679},"Step 1 - Create Renovate Bot Account",{"type":35,"tag":44,"props":9681,"children":9682},{},[9683],{"type":41,"value":9684},"First, we need to create a Renovate bot account.",{"type":35,"tag":44,"props":9686,"children":9687},{},[9688],{"type":35,"tag":741,"props":9689,"children":9692},{"alt":9690,"src":9691},"Renovate bot accout","/img/tutorials/use-gitea-and-renovate-bot-to-automatically-monitor-software-packages/renovate-bot-account.png",[],{"type":35,"tag":44,"props":9694,"children":9695},{},[9696],{"type":41,"value":9697},"Generate a token for this account for the Gitea Action secret.",{"type":35,"tag":44,"props":9699,"children":9700},{},[9701],{"type":35,"tag":741,"props":9702,"children":9705},{"alt":9703,"src":9704},"generte token","/img/tutorials/use-gitea-and-renovate-bot-to-automatically-monitor-software-packages/generate-token.png",[],{"type":35,"tag":36,"props":9707,"children":9709},{"id":9708},"step-2-configure-repository-settings",[9710],{"type":41,"value":9711},"Step 2 - Configure Repository Settings",{"type":35,"tag":44,"props":9713,"children":9714},{},[9715],{"type":41,"value":9716},"We need to configure the Renovate bot for your repository.",{"type":35,"tag":44,"props":9718,"children":9719},{},[9720,9722,9727],{"type":41,"value":9721},"Create a file called ",{"type":35,"tag":228,"props":9723,"children":9724},{"className":8},[9725],{"type":41,"value":9726},"renovate.json",{"type":41,"value":9728}," in the root of your repository.",{"type":35,"tag":44,"props":9730,"children":9731},{},[9732],{"type":41,"value":9733},"Add configuration options for Renovate:",{"type":35,"tag":221,"props":9735,"children":9737},{"className":377,"code":9736,"language":379,"meta":8,"style":8},"{\n  \"extends\": [\n    \"config:base\"  \n  ],\n  \"packageRules\": [\n    {\n      \"updateTypes\": [\"minor\", \"patch\", \"pin\", \"digest\"],\n      \"automerge\": true\n    }\n  ]\n}\n",[9738],{"type":35,"tag":228,"props":9739,"children":9740},{"__ignoreMap":8},[9741,9748,9760,9772,9780,9792,9800,9849,9865,9872,9880],{"type":35,"tag":232,"props":9742,"children":9743},{"class":234,"line":235},[9744],{"type":35,"tag":232,"props":9745,"children":9746},{"style":389},[9747],{"type":41,"value":392},{"type":35,"tag":232,"props":9749,"children":9750},{"class":234,"line":245},[9751,9756],{"type":35,"tag":232,"props":9752,"children":9753},{"style":289},[9754],{"type":41,"value":9755},"  \"extends\"",{"type":35,"tag":232,"props":9757,"children":9758},{"style":389},[9759],{"type":41,"value":453},{"type":35,"tag":232,"props":9761,"children":9762},{"class":234,"line":266},[9763,9768],{"type":35,"tag":232,"props":9764,"children":9765},{"style":255},[9766],{"type":41,"value":9767},"    \"config:base\"",{"type":35,"tag":232,"props":9769,"children":9770},{"style":389},[9771],{"type":41,"value":9394},{"type":35,"tag":232,"props":9773,"children":9774},{"class":234,"line":276},[9775],{"type":35,"tag":232,"props":9776,"children":9777},{"style":389},[9778],{"type":41,"value":9779},"  ],\n",{"type":35,"tag":232,"props":9781,"children":9782},{"class":234,"line":285},[9783,9788],{"type":35,"tag":232,"props":9784,"children":9785},{"style":289},[9786],{"type":41,"value":9787},"  \"packageRules\"",{"type":35,"tag":232,"props":9789,"children":9790},{"style":389},[9791],{"type":41,"value":453},{"type":35,"tag":232,"props":9793,"children":9794},{"class":234,"line":300},[9795],{"type":35,"tag":232,"props":9796,"children":9797},{"style":389},[9798],{"type":41,"value":9799},"    {\n",{"type":35,"tag":232,"props":9801,"children":9802},{"class":234,"line":314},[9803,9808,9812,9817,9821,9826,9830,9835,9839,9844],{"type":35,"tag":232,"props":9804,"children":9805},{"style":289},[9806],{"type":41,"value":9807},"      \"updateTypes\"",{"type":35,"tag":232,"props":9809,"children":9810},{"style":389},[9811],{"type":41,"value":2910},{"type":35,"tag":232,"props":9813,"children":9814},{"style":255},[9815],{"type":41,"value":9816},"\"minor\"",{"type":35,"tag":232,"props":9818,"children":9819},{"style":389},[9820],{"type":41,"value":466},{"type":35,"tag":232,"props":9822,"children":9823},{"style":255},[9824],{"type":41,"value":9825},"\"patch\"",{"type":35,"tag":232,"props":9827,"children":9828},{"style":389},[9829],{"type":41,"value":466},{"type":35,"tag":232,"props":9831,"children":9832},{"style":255},[9833],{"type":41,"value":9834},"\"pin\"",{"type":35,"tag":232,"props":9836,"children":9837},{"style":389},[9838],{"type":41,"value":466},{"type":35,"tag":232,"props":9840,"children":9841},{"style":255},[9842],{"type":41,"value":9843},"\"digest\"",{"type":35,"tag":232,"props":9845,"children":9846},{"style":389},[9847],{"type":41,"value":9848},"],\n",{"type":35,"tag":232,"props":9850,"children":9851},{"class":234,"line":322},[9852,9857,9861],{"type":35,"tag":232,"props":9853,"children":9854},{"style":289},[9855],{"type":41,"value":9856},"      \"automerge\"",{"type":35,"tag":232,"props":9858,"children":9859},{"style":389},[9860],{"type":41,"value":430},{"type":35,"tag":232,"props":9862,"children":9863},{"style":289},[9864],{"type":41,"value":2347},{"type":35,"tag":232,"props":9866,"children":9867},{"class":234,"line":331},[9868],{"type":35,"tag":232,"props":9869,"children":9870},{"style":389},[9871],{"type":41,"value":530},{"type":35,"tag":232,"props":9873,"children":9874},{"class":234,"line":524},[9875],{"type":35,"tag":232,"props":9876,"children":9877},{"style":389},[9878],{"type":41,"value":9879},"  ]\n",{"type":35,"tag":232,"props":9881,"children":9882},{"class":234,"line":533},[9883],{"type":35,"tag":232,"props":9884,"children":9885},{"style":389},[9886],{"type":41,"value":548},{"type":35,"tag":44,"props":9888,"children":9889},{},[9890],{"type":41,"value":9891},"This enables minor and patch updates to be automatically merged once Renovate creates pull requests.",{"type":35,"tag":44,"props":9893,"children":9894},{},[9895,9897,9904],{"type":41,"value":9896},"See ",{"type":35,"tag":165,"props":9898,"children":9901},{"href":9899,"rel":9900},"https://docs.renovatebot.com/configuration-options/",[169],[9902],{"type":41,"value":9903},"Renovate official docs",{"type":41,"value":9905}," for more configuration details.",{"type":35,"tag":44,"props":9907,"children":9908},{},[9909],{"type":41,"value":9910},"Then, add the Renovate Bot as a Collaborator.",{"type":35,"tag":44,"props":9912,"children":9913},{},[9914],{"type":35,"tag":741,"props":9915,"children":9918},{"alt":9916,"src":9917},"Add Renovate bot as collaborator","/img/tutorials/use-gitea-and-renovate-bot-to-automatically-monitor-software-packages/add-renocate-bot-as-collaborator.jpg",[],{"type":35,"tag":36,"props":9920,"children":9922},{"id":9921},"step-3-configure-renovate-bot",[9923],{"type":41,"value":9924},"Step 3 - Configure Renovate Bot",{"type":35,"tag":44,"props":9926,"children":9927},{},[9928,9930,9935],{"type":41,"value":9929},"We create a repository to store our Renovate bot configurations, assuming called ",{"type":35,"tag":228,"props":9931,"children":9932},{"className":8},[9933],{"type":41,"value":9934},"renovate-config",{"type":41,"value":1865},{"type":35,"tag":44,"props":9937,"children":9938},{},[9939,9941,9945,9947,9952],{"type":41,"value":9940},"In ",{"type":35,"tag":228,"props":9942,"children":9943},{"className":8},[9944],{"type":41,"value":9934},{"type":41,"value":9946},", create a file ",{"type":35,"tag":228,"props":9948,"children":9949},{"className":8},[9950],{"type":41,"value":9951},"config.js",{"type":41,"value":9953}," to configure Renovate:",{"type":35,"tag":221,"props":9955,"children":9959},{"className":9956,"code":9957,"language":9958,"meta":8,"style":8},"language-js shiki shiki-themes github-dark","module.exports = {\n    \"endpoint\": \"https://gitea.com/api/v1\", // replace it with your actual endpoint\n    \"gitAuthor\": \"Renovate Bot \u003Crenovate-bot@yourhost.com>\",\n    \"platform\": \"gitea\",\n    \"onboardingConfigFileName\": \"renovate.json\",\n    \"autodiscover\": true,\n    \"optimizeForDisabled\": true,\n};\n","js",[9960],{"type":35,"tag":228,"props":9961,"children":9962},{"__ignoreMap":8},[9963,9990,10016,10037,10058,10079,10100,10120],{"type":35,"tag":232,"props":9964,"children":9965},{"class":234,"line":235},[9966,9971,9975,9980,9985],{"type":35,"tag":232,"props":9967,"children":9968},{"style":289},[9969],{"type":41,"value":9970},"module",{"type":35,"tag":232,"props":9972,"children":9973},{"style":389},[9974],{"type":41,"value":1865},{"type":35,"tag":232,"props":9976,"children":9977},{"style":289},[9978],{"type":41,"value":9979},"exports",{"type":35,"tag":232,"props":9981,"children":9982},{"style":601},[9983],{"type":41,"value":9984}," =",{"type":35,"tag":232,"props":9986,"children":9987},{"style":389},[9988],{"type":41,"value":9989}," {\n",{"type":35,"tag":232,"props":9991,"children":9992},{"class":234,"line":245},[9993,9998,10002,10007,10011],{"type":35,"tag":232,"props":9994,"children":9995},{"style":255},[9996],{"type":41,"value":9997},"    \"endpoint\"",{"type":35,"tag":232,"props":9999,"children":10000},{"style":389},[10001],{"type":41,"value":430},{"type":35,"tag":232,"props":10003,"children":10004},{"style":255},[10005],{"type":41,"value":10006},"\"https://gitea.com/api/v1\"",{"type":35,"tag":232,"props":10008,"children":10009},{"style":389},[10010],{"type":41,"value":466},{"type":35,"tag":232,"props":10012,"children":10013},{"style":239},[10014],{"type":41,"value":10015},"// replace it with your actual endpoint\n",{"type":35,"tag":232,"props":10017,"children":10018},{"class":234,"line":266},[10019,10024,10028,10033],{"type":35,"tag":232,"props":10020,"children":10021},{"style":255},[10022],{"type":41,"value":10023},"    \"gitAuthor\"",{"type":35,"tag":232,"props":10025,"children":10026},{"style":389},[10027],{"type":41,"value":430},{"type":35,"tag":232,"props":10029,"children":10030},{"style":255},[10031],{"type":41,"value":10032},"\"Renovate Bot \u003Crenovate-bot@yourhost.com>\"",{"type":35,"tag":232,"props":10034,"children":10035},{"style":389},[10036],{"type":41,"value":440},{"type":35,"tag":232,"props":10038,"children":10039},{"class":234,"line":276},[10040,10045,10049,10054],{"type":35,"tag":232,"props":10041,"children":10042},{"style":255},[10043],{"type":41,"value":10044},"    \"platform\"",{"type":35,"tag":232,"props":10046,"children":10047},{"style":389},[10048],{"type":41,"value":430},{"type":35,"tag":232,"props":10050,"children":10051},{"style":255},[10052],{"type":41,"value":10053},"\"gitea\"",{"type":35,"tag":232,"props":10055,"children":10056},{"style":389},[10057],{"type":41,"value":440},{"type":35,"tag":232,"props":10059,"children":10060},{"class":234,"line":285},[10061,10066,10070,10075],{"type":35,"tag":232,"props":10062,"children":10063},{"style":255},[10064],{"type":41,"value":10065},"    \"onboardingConfigFileName\"",{"type":35,"tag":232,"props":10067,"children":10068},{"style":389},[10069],{"type":41,"value":430},{"type":35,"tag":232,"props":10071,"children":10072},{"style":255},[10073],{"type":41,"value":10074},"\"renovate.json\"",{"type":35,"tag":232,"props":10076,"children":10077},{"style":389},[10078],{"type":41,"value":440},{"type":35,"tag":232,"props":10080,"children":10081},{"class":234,"line":300},[10082,10087,10091,10096],{"type":35,"tag":232,"props":10083,"children":10084},{"style":255},[10085],{"type":41,"value":10086},"    \"autodiscover\"",{"type":35,"tag":232,"props":10088,"children":10089},{"style":389},[10090],{"type":41,"value":430},{"type":35,"tag":232,"props":10092,"children":10093},{"style":289},[10094],{"type":41,"value":10095},"true",{"type":35,"tag":232,"props":10097,"children":10098},{"style":389},[10099],{"type":41,"value":440},{"type":35,"tag":232,"props":10101,"children":10102},{"class":234,"line":314},[10103,10108,10112,10116],{"type":35,"tag":232,"props":10104,"children":10105},{"style":255},[10106],{"type":41,"value":10107},"    \"optimizeForDisabled\"",{"type":35,"tag":232,"props":10109,"children":10110},{"style":389},[10111],{"type":41,"value":430},{"type":35,"tag":232,"props":10113,"children":10114},{"style":289},[10115],{"type":41,"value":10095},{"type":35,"tag":232,"props":10117,"children":10118},{"style":389},[10119],{"type":41,"value":440},{"type":35,"tag":232,"props":10121,"children":10122},{"class":234,"line":322},[10123],{"type":35,"tag":232,"props":10124,"children":10125},{"style":389},[10126],{"type":41,"value":10127},"};\n",{"type":35,"tag":44,"props":10129,"children":10130},{},[10131,10133,10139],{"type":41,"value":10132},"You can change the configuration according to the rules in ",{"type":35,"tag":165,"props":10134,"children":10137},{"href":10135,"rel":10136},"https://docs.renovatebot.com/examples/self-hosting/#usage",[169],[10138],{"type":41,"value":9903},{"type":41,"value":1865},{"type":35,"tag":36,"props":10141,"children":10143},{"id":10142},"step-4-configure-gitea-action",[10144],{"type":41,"value":10145},"Step 4 - Configure Gitea Action",{"type":35,"tag":44,"props":10147,"children":10148},{},[10149,10151,10156,10158,10162],{"type":41,"value":10150},"In the previous Renovate configuration repository, create a file ",{"type":35,"tag":228,"props":10152,"children":10153},{"className":8},[10154],{"type":41,"value":10155},"renovate.yaml",{"type":41,"value":10157}," under ",{"type":35,"tag":228,"props":10159,"children":10160},{"className":8},[10161],{"type":41,"value":6633},{"type":41,"value":10163},":",{"type":35,"tag":221,"props":10165,"children":10167},{"className":2083,"code":10166,"language":2085,"meta":8,"style":8},"name: renovate\n\non:\n  schedule:\n    - cron: \"@daily\"\n  push:\n    branches:\n      - main\n\njobs:\n  renovate:\n    runs-on: ubuntu-latest\n    container: ghcr.io/renovatebot/renovate:37.20.2\n    steps:\n      - uses: actions/checkout@v4\n      - run: renovate\n        env:\n          RENOVATE_CONFIG_FILE: \"/workspace/{{username}}/{{repo name}/config.js\" # replace it with your config.js path\n          LOG_LEVEL: \"debug\"\n          RENOVATE_TOKEN: ${{ secrets.RENOVATE_TOKEN }} # your Revonate bot token\n",[10168],{"type":35,"tag":228,"props":10169,"children":10170},{"__ignoreMap":8},[10171,10187,10194,10205,10217,10238,10249,10260,10271,10278,10289,10301,10316,10332,10343,10362,10382,10394,10416,10433],{"type":35,"tag":232,"props":10172,"children":10173},{"class":234,"line":235},[10174,10178,10182],{"type":35,"tag":232,"props":10175,"children":10176},{"style":2095},[10177],{"type":41,"value":2098},{"type":35,"tag":232,"props":10179,"children":10180},{"style":389},[10181],{"type":41,"value":430},{"type":35,"tag":232,"props":10183,"children":10184},{"style":255},[10185],{"type":41,"value":10186},"renovate\n",{"type":35,"tag":232,"props":10188,"children":10189},{"class":234,"line":245},[10190],{"type":35,"tag":232,"props":10191,"children":10192},{"emptyLinePlaceholder":270},[10193],{"type":41,"value":273},{"type":35,"tag":232,"props":10195,"children":10196},{"class":234,"line":266},[10197,10201],{"type":35,"tag":232,"props":10198,"children":10199},{"style":289},[10200],{"type":41,"value":2122},{"type":35,"tag":232,"props":10202,"children":10203},{"style":389},[10204],{"type":41,"value":2127},{"type":35,"tag":232,"props":10206,"children":10207},{"class":234,"line":276},[10208,10213],{"type":35,"tag":232,"props":10209,"children":10210},{"style":2095},[10211],{"type":41,"value":10212},"  schedule",{"type":35,"tag":232,"props":10214,"children":10215},{"style":389},[10216],{"type":41,"value":2127},{"type":35,"tag":232,"props":10218,"children":10219},{"class":234,"line":285},[10220,10224,10229,10233],{"type":35,"tag":232,"props":10221,"children":10222},{"style":389},[10223],{"type":41,"value":6371},{"type":35,"tag":232,"props":10225,"children":10226},{"style":2095},[10227],{"type":41,"value":10228},"cron",{"type":35,"tag":232,"props":10230,"children":10231},{"style":389},[10232],{"type":41,"value":430},{"type":35,"tag":232,"props":10234,"children":10235},{"style":255},[10236],{"type":41,"value":10237},"\"@daily\"\n",{"type":35,"tag":232,"props":10239,"children":10240},{"class":234,"line":300},[10241,10245],{"type":35,"tag":232,"props":10242,"children":10243},{"style":2095},[10244],{"type":41,"value":2511},{"type":35,"tag":232,"props":10246,"children":10247},{"style":389},[10248],{"type":41,"value":2127},{"type":35,"tag":232,"props":10250,"children":10251},{"class":234,"line":314},[10252,10256],{"type":35,"tag":232,"props":10253,"children":10254},{"style":2095},[10255],{"type":41,"value":2523},{"type":35,"tag":232,"props":10257,"children":10258},{"style":389},[10259],{"type":41,"value":2127},{"type":35,"tag":232,"props":10261,"children":10262},{"class":234,"line":322},[10263,10267],{"type":35,"tag":232,"props":10264,"children":10265},{"style":389},[10266],{"type":41,"value":2159},{"type":35,"tag":232,"props":10268,"children":10269},{"style":255},[10270],{"type":41,"value":6227},{"type":35,"tag":232,"props":10272,"children":10273},{"class":234,"line":331},[10274],{"type":35,"tag":232,"props":10275,"children":10276},{"emptyLinePlaceholder":270},[10277],{"type":41,"value":273},{"type":35,"tag":232,"props":10279,"children":10280},{"class":234,"line":524},[10281,10285],{"type":35,"tag":232,"props":10282,"children":10283},{"style":2095},[10284],{"type":41,"value":2179},{"type":35,"tag":232,"props":10286,"children":10287},{"style":389},[10288],{"type":41,"value":2127},{"type":35,"tag":232,"props":10290,"children":10291},{"class":234,"line":533},[10292,10297],{"type":35,"tag":232,"props":10293,"children":10294},{"style":2095},[10295],{"type":41,"value":10296},"  renovate",{"type":35,"tag":232,"props":10298,"children":10299},{"style":389},[10300],{"type":41,"value":2127},{"type":35,"tag":232,"props":10302,"children":10303},{"class":234,"line":542},[10304,10308,10312],{"type":35,"tag":232,"props":10305,"children":10306},{"style":2095},[10307],{"type":41,"value":2203},{"type":35,"tag":232,"props":10309,"children":10310},{"style":389},[10311],{"type":41,"value":430},{"type":35,"tag":232,"props":10313,"children":10314},{"style":255},[10315],{"type":41,"value":2212},{"type":35,"tag":232,"props":10317,"children":10318},{"class":234,"line":2249},[10319,10323,10327],{"type":35,"tag":232,"props":10320,"children":10321},{"style":2095},[10322],{"type":41,"value":6737},{"type":35,"tag":232,"props":10324,"children":10325},{"style":389},[10326],{"type":41,"value":430},{"type":35,"tag":232,"props":10328,"children":10329},{"style":255},[10330],{"type":41,"value":10331},"ghcr.io/renovatebot/renovate:37.20.2\n",{"type":35,"tag":232,"props":10333,"children":10334},{"class":234,"line":2262},[10335,10339],{"type":35,"tag":232,"props":10336,"children":10337},{"style":2095},[10338],{"type":41,"value":2255},{"type":35,"tag":232,"props":10340,"children":10341},{"style":389},[10342],{"type":41,"value":2127},{"type":35,"tag":232,"props":10344,"children":10345},{"class":234,"line":2283},[10346,10350,10354,10358],{"type":35,"tag":232,"props":10347,"children":10348},{"style":389},[10349],{"type":41,"value":2159},{"type":35,"tag":232,"props":10351,"children":10352},{"style":2095},[10353],{"type":41,"value":8521},{"type":35,"tag":232,"props":10355,"children":10356},{"style":389},[10357],{"type":41,"value":430},{"type":35,"tag":232,"props":10359,"children":10360},{"style":255},[10361],{"type":41,"value":6401},{"type":35,"tag":232,"props":10363,"children":10364},{"class":234,"line":2301},[10365,10369,10374,10378],{"type":35,"tag":232,"props":10366,"children":10367},{"style":389},[10368],{"type":41,"value":2159},{"type":35,"tag":232,"props":10370,"children":10371},{"style":2095},[10372],{"type":41,"value":10373},"run",{"type":35,"tag":232,"props":10375,"children":10376},{"style":389},[10377],{"type":41,"value":430},{"type":35,"tag":232,"props":10379,"children":10380},{"style":255},[10381],{"type":41,"value":10186},{"type":35,"tag":232,"props":10383,"children":10384},{"class":234,"line":2314},[10385,10390],{"type":35,"tag":232,"props":10386,"children":10387},{"style":2095},[10388],{"type":41,"value":10389},"        env",{"type":35,"tag":232,"props":10391,"children":10392},{"style":389},[10393],{"type":41,"value":2127},{"type":35,"tag":232,"props":10395,"children":10396},{"class":234,"line":2332},[10397,10402,10406,10411],{"type":35,"tag":232,"props":10398,"children":10399},{"style":2095},[10400],{"type":41,"value":10401},"          RENOVATE_CONFIG_FILE",{"type":35,"tag":232,"props":10403,"children":10404},{"style":389},[10405],{"type":41,"value":430},{"type":35,"tag":232,"props":10407,"children":10408},{"style":255},[10409],{"type":41,"value":10410},"\"/workspace/{{username}}/{{repo name}/config.js\"",{"type":35,"tag":232,"props":10412,"children":10413},{"style":239},[10414],{"type":41,"value":10415}," # replace it with your config.js path\n",{"type":35,"tag":232,"props":10417,"children":10418},{"class":234,"line":2350},[10419,10424,10428],{"type":35,"tag":232,"props":10420,"children":10421},{"style":2095},[10422],{"type":41,"value":10423},"          LOG_LEVEL",{"type":35,"tag":232,"props":10425,"children":10426},{"style":389},[10427],{"type":41,"value":430},{"type":35,"tag":232,"props":10429,"children":10430},{"style":255},[10431],{"type":41,"value":10432},"\"debug\"\n",{"type":35,"tag":232,"props":10434,"children":10435},{"class":234,"line":2368},[10436,10441,10445,10450],{"type":35,"tag":232,"props":10437,"children":10438},{"style":2095},[10439],{"type":41,"value":10440},"          RENOVATE_TOKEN",{"type":35,"tag":232,"props":10442,"children":10443},{"style":389},[10444],{"type":41,"value":430},{"type":35,"tag":232,"props":10446,"children":10447},{"style":255},[10448],{"type":41,"value":10449},"${{ secrets.RENOVATE_TOKEN }}",{"type":35,"tag":232,"props":10451,"children":10452},{"style":239},[10453],{"type":41,"value":10454}," # your Revonate bot token\n",{"type":35,"tag":44,"props":10456,"children":10457},{},[10458,10460,10467],{"type":41,"value":10459},"While Gitea Actions is designed with compatibility to GitHub Actions, there are some differences between the two. For a comprehensive understanding of these differences, you can refer to the ",{"type":35,"tag":165,"props":10461,"children":10464},{"href":10462,"rel":10463},"https://docs.gitea.com/usage/actions/comparison",[169],[10465],{"type":41,"value":10466},"Gitea Documentation",{"type":41,"value":1865},{"type":35,"tag":44,"props":10469,"children":10470},{},[10471,10473,10477],{"type":41,"value":10472},"Add the secret your defined in your ",{"type":35,"tag":228,"props":10474,"children":10475},{"className":8},[10476],{"type":41,"value":10155},{"type":41,"value":10478}," with your renovate bot token. so the renovate bot can have access to that account.",{"type":35,"tag":44,"props":10480,"children":10481},{},[10482],{"type":35,"tag":741,"props":10483,"children":10486},{"alt":10484,"src":10485},"Add secret","/img/tutorials/use-gitea-and-renovate-bot-to-automatically-monitor-software-packages/add-secret.png",[],{"type":35,"tag":36,"props":10488,"children":10490},{"id":10489},"final",[10491],{"type":41,"value":10492},"Final",{"type":35,"tag":44,"props":10494,"children":10495},{},[10496],{"type":41,"value":10497},"That's it! Just four simple steps to use the Renovate bot with Gitea Action.",{"type":35,"tag":44,"props":10499,"children":10500},{},[10501],{"type":41,"value":10502},"Now just drink a cup of tea and wait for the Renovate bot to auto update dependencies.",{"type":35,"tag":44,"props":10504,"children":10505},{},[10506],{"type":35,"tag":741,"props":10507,"children":10510},{"alt":10508,"src":10509},"Renovate bot","/img/tutorials/use-gitea-and-renovate-bot-to-automatically-monitor-software-packages/update-dependence.png",[],{"type":35,"tag":1651,"props":10512,"children":10513},{},[10514],{"type":41,"value":1655},{"title":8,"searchDepth":245,"depth":245,"links":10516},[10517,10518,10519,10520,10521,10522,10523],{"id":38,"depth":245,"text":42},{"id":4733,"depth":245,"text":4736},{"id":9676,"depth":245,"text":9679},{"id":9708,"depth":245,"text":9711},{"id":9921,"depth":245,"text":9924},{"id":10142,"depth":245,"text":10145},{"id":10489,"depth":245,"text":10492},"content:resources:tutorials:1.use-gitea-and-renovate-bot-to-automatically-monitor-software-packages.md","resources/tutorials/1.use-gitea-and-renovate-bot-to-automatically-monitor-software-packages.md",1782602787576]