chore: add favicons
BIN
assets/img/favicons/android-chrome-192x192.png
Normal file
|
After Width: | Height: | Size: 49 KiB |
BIN
assets/img/favicons/android-chrome-512x512.png
Normal file
|
After Width: | Height: | Size: 264 KiB |
BIN
assets/img/favicons/apple-touch-icon.png
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
assets/img/favicons/favicon-16x16.png
Normal file
|
After Width: | Height: | Size: 808 B |
BIN
assets/img/favicons/favicon-32x32.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
assets/img/favicons/favicon.ico
Normal file
|
After Width: | Height: | Size: 15 KiB |
920
public/404.html
@@ -1,49 +1,883 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/404.html"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="404 Page not found"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="404 Page not found"><meta itemprop=name content="404 Page not found"><title>404 Page not found |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><link rel=stylesheet href=/><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css><script src=/js/modules/theme.js></script><script defer src=/js/commons.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span>404 Page not found</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title>404 Page not found</div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><h1 class=dynamic-title>404: Page not found</h1><div class=content><blockquote class=prompt-danger><p>Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.</p></blockquote></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/404.html">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="404 Page not found">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="404 Page not found">
|
||||
|
||||
|
||||
<meta itemprop="name" content="404 Page not found">
|
||||
|
||||
<title>
|
||||
|
||||
404 Page not found |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css">
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/commons.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>404 Page not found</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
404 Page not found
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
<h1 class="dynamic-title">404: Page not found</h1>
|
||||
<div class="content">
|
||||
<blockquote class="prompt-danger"><p>Sorry, we've misplaced that URL or it's pointing to something that doesn't exist.</p></blockquote>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,53 +1,950 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/about/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="About"><meta property="og:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
|
||||
Follow the posts in the demo site to quickly set up a free personal blog!"><meta property="og:locale" content="en"><meta property="og:type" content="article"><meta property="article:published_time" content="2023-04-20T00:00:00+00:00"><meta property="article:modified_time" content="2025-09-06T13:28:05+10:00"><meta name=twitter:card content="summary"><meta name=twitter:title content="About"><meta name=twitter:description content="Chirpy is a blog theme originally based on Jekyll. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
|
||||
Follow the posts in the demo site to quickly set up a free personal blog!"><meta itemprop=name content="About"><meta itemprop=description content="Chirpy is a blog theme originally based on Jekyll. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
|
||||
Follow the posts in the demo site to quickly set up a free personal blog!"><meta itemprop=datePublished content="2023-04-20T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><meta itemprop=wordCount content="171"><title>About |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><link rel=stylesheet href=/><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js></script><script src=https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js></script><script src=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.js></script><script defer src=/js/page.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class="nav-item active"><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span>About</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title>About</div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><article class=px-1><h1 class=dynamic-title>About</h1><div class=content><p><a href=https://github.com/cotes2020/jekyll-theme-chirpy>Chirpy</a> is a blog theme originally based on <a href=https://jekyllrb.com/>Jekyll</a>. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the <a href=https://github.com/geekifan/hugo-theme-chirpy>hugo-theme-chirpy</a> project migrated the Chirpy theme to <a href=https://gohugo.io/>Hugo</a> with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).</p><p>Follow the posts in the demo site to quickly set up a free personal blog!</p><h2 id=features id=features><span class=me-2>Features</span>
|
||||
<a href=#features class="anchor text-muted"><i class="fas fa-hashtag"></i></a></h2><ul><li><strong>Dark Mode</strong>: Enhanced readability in low-light environments.</li><li><strong>Multilingual UI:</strong> Easily switch between different languages.</li><li><strong>Efficient Post Organization:</strong> Use hierarchical categories, trending tags, recommended reading, and search functionalities.</li><li><strong>Optimized Layout:</strong> Includes TOC, syntax highlighting, prompts, and more.</li><li><strong>Rich Writing Extensions:</strong> Support for mathematical formulas, charts, flowcharts, and embedded media.</li><li><strong>Multiple Comment Systems:</strong> Choose from various commenting options.</li><li><strong>Web Analysis Tools:</strong> Integrated with multiple analytics tools.</li><li><strong>Modern Web Technologies:</strong> Built for SEO and web performance.</li><li><strong>RSS Feed Support:</strong> Keep your readers updated with RSS feeds.</li></ul></div></article></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/about/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="About">
|
||||
<meta property="og:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
|
||||
Follow the posts in the demo site to quickly set up a free personal blog!">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="article:published_time" content="2023-04-20T00:00:00+00:00">
|
||||
<meta property="article:modified_time" content="2023-04-20T00:00:00+00:00">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="About">
|
||||
<meta name="twitter:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
|
||||
Follow the posts in the demo site to quickly set up a free personal blog!">
|
||||
|
||||
|
||||
<meta itemprop="name" content="About">
|
||||
<meta itemprop="description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the hugo-theme-chirpy project migrated the Chirpy theme to Hugo with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).
|
||||
Follow the posts in the demo site to quickly set up a free personal blog!">
|
||||
<meta itemprop="datePublished" content="2023-04-20T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2023-04-20T00:00:00+00:00">
|
||||
<meta itemprop="wordCount" content="171">
|
||||
|
||||
<title>
|
||||
|
||||
About |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="/">
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/css/glightbox.min.css">
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/glightbox@3.3.0/dist/js/glightbox.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/clipboard@2.0.11/dist/clipboard.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/page.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item active">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>About</span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
About
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
<article class="px-1">
|
||||
|
||||
|
||||
|
||||
<h1 class="dynamic-title">
|
||||
About
|
||||
</h1>
|
||||
<div class="content">
|
||||
<p><a href="https://github.com/cotes2020/jekyll-theme-chirpy">Chirpy</a> is a blog theme originally based on <a href="https://jekyllrb.com/">Jekyll</a>. Due to Jekyll’s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the <a href="https://github.com/geekifan/hugo-theme-chirpy">hugo-theme-chirpy</a> project migrated the Chirpy theme to <a href="https://gohugo.io/">Hugo</a> with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).</p>
|
||||
<p>Follow the posts in the demo site to quickly set up a free personal blog!</p>
|
||||
<h2 id="features" id=features>
|
||||
|
||||
<span class="me-2">Features</span>
|
||||
<a href="#features" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h2><ul>
|
||||
<li><strong>Dark Mode</strong>: Enhanced readability in low-light environments.</li>
|
||||
<li><strong>Multilingual UI:</strong> Easily switch between different languages.</li>
|
||||
<li><strong>Efficient Post Organization:</strong> Use hierarchical categories, trending tags, recommended reading, and search functionalities.</li>
|
||||
<li><strong>Optimized Layout:</strong> Includes TOC, syntax highlighting, prompts, and more.</li>
|
||||
<li><strong>Rich Writing Extensions:</strong> Support for mathematical formulas, charts, flowcharts, and embedded media.</li>
|
||||
<li><strong>Multiple Comment Systems:</strong> Choose from various commenting options.</li>
|
||||
<li><strong>Web Analysis Tools:</strong> Integrated with multiple analytics tools.</li>
|
||||
<li><strong>Modern Web Technologies:</strong> Built for SEO and web performance.</li>
|
||||
<li><strong>RSS Feed Support:</strong> Keep your readers updated with RSS feeds.</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
</article>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,54 +1,902 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/categories/gitea/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Gitea"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Gitea"><meta itemprop=name content="Gitea"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Gitea |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/categories/>Categories</a></span>
|
||||
<span>gitea</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-category><h1 class=ps-lg-2><i class="far fa-folder-open fa-fw text-muted"></i>
|
||||
Gitea
|
||||
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<span class="text-muted small text-nowrap">Sep 21, 2024</span></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/categories/gitea/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Gitea">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Gitea">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Gitea">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Gitea |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/categories/">Categories</a></span>
|
||||
<span>gitea</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
<div id="page-category">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="far fa-folder-open fa-fw text-muted"></i>
|
||||
Gitea
|
||||
<span class="lead text-muted ps-2">1</span>
|
||||
</h1>
|
||||
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<span class="text-muted small text-nowrap">Sep 21, 2024</span>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Gitea on Comprofix</title><link>https://comprofix.com/categories/gitea/</link><description>Recent content in Gitea on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/categories/gitea/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Gitea on Comprofix</title>
|
||||
<link>http://localhost:1313/categories/gitea/</link>
|
||||
<description>Recent content in Gitea on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/categories/gitea/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1,56 +1,908 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/categories/homelab/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Homelab"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Homelab"><meta itemprop=name content="Homelab"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Homelab |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/categories/>Categories</a></span>
|
||||
<span>homelab</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-category><h1 class=ps-lg-2><i class="far fa-folder-open fa-fw text-muted"></i>
|
||||
Homelab
|
||||
<span class="lead text-muted ps-2">2</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<span class="text-muted small text-nowrap">Sep 21, 2024</span></li><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<span class="text-muted small text-nowrap">Sep 5, 2024</span></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/categories/homelab/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Homelab">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Homelab">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Homelab">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Homelab |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/categories/">Categories</a></span>
|
||||
<span>homelab</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
<div id="page-category">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="far fa-folder-open fa-fw text-muted"></i>
|
||||
Homelab
|
||||
<span class="lead text-muted ps-2">2</span>
|
||||
</h1>
|
||||
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<span class="text-muted small text-nowrap">Sep 21, 2024</span>
|
||||
</li>
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<span class="text-muted small text-nowrap">Sep 5, 2024</span>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,10 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelab on Comprofix</title><link>https://comprofix.com/categories/homelab/</link><description>Recent content in Homelab on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/categories/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
|
||||
<p>But the website has been more of a play ground for experimenting and testing.</p>
|
||||
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Homelab on Comprofix</title>
|
||||
<link>http://localhost:1313/categories/homelab/</link>
|
||||
<description>Recent content in Homelab on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/categories/homelab/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Reset and Restart</title>
|
||||
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
|
||||
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
|
||||
<description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
<p>But the website has been more of a play ground for experimenting and testing.</p>
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Categories on Comprofix</title><link>https://comprofix.com/categories/</link><description>Recent content in Categories on Comprofix</description><generator>Hugo</generator><language>en</language><atom:link href="https://comprofix.com/categories/index.xml" rel="self" type="application/rss+xml"/><item><title>Gitea</title><link>https://comprofix.com/categories/gitea/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/categories/gitea/</guid><description/></item><item><title>Homelab</title><link>https://comprofix.com/categories/homelab/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/categories/homelab/</guid><description/></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Categories on Comprofix</title>
|
||||
<link>http://localhost:1313/categories/</link>
|
||||
<description>Recent content in Categories on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/categories/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Gitea</title>
|
||||
<link>http://localhost:1313/categories/gitea/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/categories/gitea/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Homelab</title>
|
||||
<link>http://localhost:1313/categories/homelab/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/categories/homelab/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 808 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
1103
public/index.html
@@ -1,11 +1,40 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Comprofix</title><link>https://comprofix.com/</link><description>Recent content on Comprofix</description><generator>Hugo</generator><language>en</language><atom:link href="https://comprofix.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
|
||||
<p>But the website has been more of a play ground for experimenting and testing.</p>
|
||||
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description></item><item><title>About</title><link>https://comprofix.com/about/</link><pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate><guid>https://comprofix.com/about/</guid><description><p><a href="https://github.com/cotes2020/jekyll-theme-chirpy">Chirpy</a> is a blog theme originally based on <a href="https://jekyllrb.com/">Jekyll</a>. Due to Jekyll&rsquo;s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the <a href="https://github.com/geekifan/hugo-theme-chirpy">hugo-theme-chirpy</a> project migrated the Chirpy theme to <a href="https://gohugo.io/">Hugo</a> with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).</p>
|
||||
<p>Follow the posts in the demo site to quickly set up a free personal blog!</p></description></item><item><title>Archives</title><link>https://comprofix.com/archives/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://comprofix.com/archives/</guid><description/></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Comprofix</title>
|
||||
<link>http://localhost:1313/</link>
|
||||
<description>Recent content on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Reset and Restart</title>
|
||||
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
|
||||
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
|
||||
<description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
<p>But the website has been more of a play ground for experimenting and testing.</p>
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>About</title>
|
||||
<link>http://localhost:1313/about/</link>
|
||||
<pubDate>Thu, 20 Apr 2023 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/about/</guid>
|
||||
<description><p><a href="https://github.com/cotes2020/jekyll-theme-chirpy">Chirpy</a> is a blog theme originally based on <a href="https://jekyllrb.com/">Jekyll</a>. Due to Jekyll&rsquo;s design limitations, it does not natively support internationalization (i18n) and requires third-party plugins for i18n functionality. To enable i18n support for Chirpy without the hassle of relying on third-party plugins, the <a href="https://github.com/geekifan/hugo-theme-chirpy">hugo-theme-chirpy</a> project migrated the Chirpy theme to <a href="https://gohugo.io/">Hugo</a> with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).</p>
<p>Follow the posts in the demo site to quickly set up a free personal blog!</p></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Archives</title>
|
||||
<link>http://localhost:1313/archives/</link>
|
||||
<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/archives/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
3357
public/js/commons.js
3441
public/js/home.js
3392
public/js/misc.js
@@ -1 +1,128 @@
|
||||
(()=>{var L=Object.defineProperty;var w=i=>{throw TypeError(i)};var k=(i,s,a)=>s in i?L(i,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):i[s]=a;var M=(i,s,a)=>k(i,typeof s!="symbol"?s+"":s,a),b=(i,s,a)=>s.has(i)||w("Cannot "+a);var e=(i,s,a)=>(b(i,s,"read from private field"),a?a.call(i):s.get(i)),o=(i,s,a)=>s.has(i)?w("Cannot add the same private member more than once"):s instanceof WeakSet?s.add(i):s.set(i,a);var r=(i,s,a)=>(b(i,s,"access private method"),a);var c,n,m,t,d,K,l,g,A,D,I,f,h=class h{static get DARK(){return"dark"}static get LIGHT(){return"light"}static get ID(){return"theme-mode"}static get visualState(){return e(this,t,l)?e(this,t,d):e(this,t,g)?this.DARK:this.LIGHT}static getThemeMapper(s,a){return{[this.LIGHT]:s,[this.DARK]:a}}static init(){this.switchable&&(e(this,m).addEventListener("change",()=>{let s=e(this,t,d);r(this,t,I).call(this),s!==this.visualState&&r(this,t,f).call(this)}),e(this,t,l)&&(e(this,t,K)?r(this,t,A).call(this):r(this,t,D).call(this)))}static flip(){e(this,t,l)?r(this,t,I).call(this):e(this,t,g)?r(this,t,D).call(this):r(this,t,A).call(this),r(this,t,f).call(this)}};c=new WeakMap,n=new WeakMap,m=new WeakMap,t=new WeakSet,d=function(){return sessionStorage.getItem(e(this,c))||document.documentElement.getAttribute(e(this,n))},K=function(){return e(this,t,d)===this.DARK},l=function(){return e(this,t,d)!==null},g=function(){return e(this,m).matches},A=function(){document.documentElement.setAttribute(e(this,n),this.DARK),sessionStorage.setItem(e(this,c),this.DARK)},D=function(){document.documentElement.setAttribute(e(this,n),this.LIGHT),sessionStorage.setItem(e(this,c),this.LIGHT)},I=function(){document.documentElement.removeAttribute(e(this,n)),sessionStorage.removeItem(e(this,c))},f=function(){window.postMessage({id:this.ID},"*")},o(h,t),o(h,c,"mode"),o(h,n,"data-mode"),o(h,m,window.matchMedia("(prefers-color-scheme: dark)")),M(h,"switchable",!document.documentElement.hasAttribute(e(h,n)));var u=h;u.init();var E=u;window.Theme=u;})();
|
||||
(() => {
|
||||
var __defProp = Object.defineProperty;
|
||||
var __typeError = (msg) => {
|
||||
throw TypeError(msg);
|
||||
};
|
||||
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
||||
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
||||
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
||||
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
||||
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
||||
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
||||
|
||||
// <stdin>
|
||||
var _modeKey, _modeAttr, _darkMedia, _Theme_static, mode_get, isDarkMode_get, hasMode_get, sysDark_get, setDark_fn, setLight_fn, clearMode_fn, notify_fn;
|
||||
var _Theme = class _Theme {
|
||||
static get DARK() {
|
||||
return "dark";
|
||||
}
|
||||
static get LIGHT() {
|
||||
return "light";
|
||||
}
|
||||
/**
|
||||
* @returns {string} Theme mode identifier
|
||||
*/
|
||||
static get ID() {
|
||||
return "theme-mode";
|
||||
}
|
||||
/**
|
||||
* Gets the current visual state of the theme.
|
||||
*
|
||||
* @returns {string} The current visual state, either the mode if it exists,
|
||||
* or the system dark mode state ('dark' or 'light').
|
||||
*/
|
||||
static get visualState() {
|
||||
if (__privateGet(this, _Theme_static, hasMode_get)) {
|
||||
return __privateGet(this, _Theme_static, mode_get);
|
||||
} else {
|
||||
return __privateGet(this, _Theme_static, sysDark_get) ? this.DARK : this.LIGHT;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Maps theme modes to provided values
|
||||
* @param {string} light Value for light mode
|
||||
* @param {string} dark Value for dark mode
|
||||
* @returns {Object} Mapped values
|
||||
*/
|
||||
static getThemeMapper(light, dark) {
|
||||
return {
|
||||
[this.LIGHT]: light,
|
||||
[this.DARK]: dark
|
||||
};
|
||||
}
|
||||
/**
|
||||
* Initializes the theme based on system preferences or stored mode
|
||||
*/
|
||||
static init() {
|
||||
if (!this.switchable) {
|
||||
return;
|
||||
}
|
||||
__privateGet(this, _darkMedia).addEventListener("change", () => {
|
||||
const lastMode = __privateGet(this, _Theme_static, mode_get);
|
||||
__privateMethod(this, _Theme_static, clearMode_fn).call(this);
|
||||
if (lastMode !== this.visualState) {
|
||||
__privateMethod(this, _Theme_static, notify_fn).call(this);
|
||||
}
|
||||
});
|
||||
if (!__privateGet(this, _Theme_static, hasMode_get)) {
|
||||
return;
|
||||
}
|
||||
if (__privateGet(this, _Theme_static, isDarkMode_get)) {
|
||||
__privateMethod(this, _Theme_static, setDark_fn).call(this);
|
||||
} else {
|
||||
__privateMethod(this, _Theme_static, setLight_fn).call(this);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Flips the current theme mode
|
||||
*/
|
||||
static flip() {
|
||||
if (__privateGet(this, _Theme_static, hasMode_get)) {
|
||||
__privateMethod(this, _Theme_static, clearMode_fn).call(this);
|
||||
} else {
|
||||
__privateGet(this, _Theme_static, sysDark_get) ? __privateMethod(this, _Theme_static, setLight_fn).call(this) : __privateMethod(this, _Theme_static, setDark_fn).call(this);
|
||||
}
|
||||
__privateMethod(this, _Theme_static, notify_fn).call(this);
|
||||
}
|
||||
};
|
||||
_modeKey = new WeakMap();
|
||||
_modeAttr = new WeakMap();
|
||||
_darkMedia = new WeakMap();
|
||||
_Theme_static = new WeakSet();
|
||||
mode_get = function() {
|
||||
return sessionStorage.getItem(__privateGet(this, _modeKey)) || document.documentElement.getAttribute(__privateGet(this, _modeAttr));
|
||||
};
|
||||
isDarkMode_get = function() {
|
||||
return __privateGet(this, _Theme_static, mode_get) === this.DARK;
|
||||
};
|
||||
hasMode_get = function() {
|
||||
return __privateGet(this, _Theme_static, mode_get) !== null;
|
||||
};
|
||||
sysDark_get = function() {
|
||||
return __privateGet(this, _darkMedia).matches;
|
||||
};
|
||||
setDark_fn = function() {
|
||||
document.documentElement.setAttribute(__privateGet(this, _modeAttr), this.DARK);
|
||||
sessionStorage.setItem(__privateGet(this, _modeKey), this.DARK);
|
||||
};
|
||||
setLight_fn = function() {
|
||||
document.documentElement.setAttribute(__privateGet(this, _modeAttr), this.LIGHT);
|
||||
sessionStorage.setItem(__privateGet(this, _modeKey), this.LIGHT);
|
||||
};
|
||||
clearMode_fn = function() {
|
||||
document.documentElement.removeAttribute(__privateGet(this, _modeAttr));
|
||||
sessionStorage.removeItem(__privateGet(this, _modeKey));
|
||||
};
|
||||
notify_fn = function() {
|
||||
window.postMessage({ id: this.ID }, "*");
|
||||
};
|
||||
__privateAdd(_Theme, _Theme_static);
|
||||
__privateAdd(_Theme, _modeKey, "mode");
|
||||
__privateAdd(_Theme, _modeAttr, "data-mode");
|
||||
__privateAdd(_Theme, _darkMedia, window.matchMedia("(prefers-color-scheme: dark)"));
|
||||
__publicField(_Theme, "switchable", !document.documentElement.hasAttribute(__privateGet(_Theme, _modeAttr)));
|
||||
var Theme = _Theme;
|
||||
Theme.init();
|
||||
var stdin_default = Theme;
|
||||
window.Theme = Theme;
|
||||
})();
|
||||
|
||||
3585
public/js/page.js
3644
public/js/post.js
@@ -1 +1,10 @@
|
||||
<!doctype html><html lang=en><head><title>https://comprofix.com/</title><link rel=canonical href=https://comprofix.com/><meta name=robots content="noindex"><meta charset=utf-8><meta http-equiv=refresh content="0; url=https://comprofix.com/"></head></html>
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>http://localhost:1313/</title>
|
||||
<link rel="canonical" href="http://localhost:1313/">
|
||||
<meta name="robots" content="noindex">
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="refresh" content="0; url=http://localhost:1313/">
|
||||
</head>
|
||||
</html>
|
||||
|
||||
@@ -1,10 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Comprofix</title><link>https://comprofix.com/post/</link><description>Recent content in Posts on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
|
||||
<p>But the website has been more of a play ground for experimenting and testing.</p>
|
||||
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Posts on Comprofix</title>
|
||||
<link>http://localhost:1313/post/</link>
|
||||
<description>Recent content in Posts on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/post/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Reset and Restart</title>
|
||||
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
|
||||
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
|
||||
<description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
<p>But the website has been more of a play ground for experimenting and testing.</p>
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xhtml="http://www.w3.org/1999/xhtml"><url><loc>https://comprofix.com/tags/cd/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/ci/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/continuous-deployment/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/continuous-integration/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/post/2024-09-21-websitedeployment/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/docker/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/git/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/categories/gitea/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/categories/homelab/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/homelab/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/post/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/post/2024-09-05-resetrestart/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/about/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/archives/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/categories/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url><url><loc>https://comprofix.com/tags/</loc><lastmod>2025-09-06T13:28:05+10:00</lastmod></url></urlset>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<url>
|
||||
<loc>http://localhost:1313/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/categories/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/cd/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/ci/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/continuous-deployment/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/continuous-integration/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/post/2024-09-21-websitedeployment/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/docker/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/git/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/categories/gitea/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/categories/homelab/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/homelab/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/post/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/tags/</loc>
|
||||
<lastmod>2024-09-21T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/post/2024-09-05-resetrestart/</loc>
|
||||
<lastmod>2024-09-05T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/about/</loc>
|
||||
<lastmod>2023-04-20T00:00:00+00:00</lastmod>
|
||||
</url><url>
|
||||
<loc>http://localhost:1313/archives/</loc>
|
||||
</url>
|
||||
</urlset>
|
||||
|
||||
@@ -1,54 +1,914 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/cd/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Cd"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Cd"><meta itemprop=name content="Cd"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Cd |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
|
||||
<span>cd</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
|
||||
cd
|
||||
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/tags/cd/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Cd">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Cd">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Cd">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Cd |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/tags/">Tags</a></span>
|
||||
<span>cd</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
|
||||
<div id="page-tag">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="fa fa-tag fa-fw text-muted"></i>
|
||||
cd
|
||||
<span class="lead text-muted ps-2">1</span>
|
||||
</h1>
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1726876800"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cd on Comprofix</title><link>https://comprofix.com/tags/cd/</link><description>Recent content in Cd on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/cd/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Cd on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/cd/</link>
|
||||
<description>Recent content in Cd on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/cd/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1,54 +1,914 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/ci/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Ci"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Ci"><meta itemprop=name content="Ci"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Ci |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
|
||||
<span>ci</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
|
||||
ci
|
||||
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/tags/ci/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Ci">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Ci">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Ci">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Ci |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/tags/">Tags</a></span>
|
||||
<span>ci</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
|
||||
<div id="page-tag">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="fa fa-tag fa-fw text-muted"></i>
|
||||
ci
|
||||
<span class="lead text-muted ps-2">1</span>
|
||||
</h1>
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1726876800"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ci on Comprofix</title><link>https://comprofix.com/tags/ci/</link><description>Recent content in Ci on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/ci/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Ci on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/ci/</link>
|
||||
<description>Recent content in Ci on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/ci/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1,54 +1,914 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/continuous-deployment/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Continuous Deployment"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Continuous Deployment"><meta itemprop=name content="Continuous Deployment"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Continuous Deployment |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
|
||||
<span>continuous deployment</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
|
||||
continuous deployment
|
||||
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/tags/continuous-deployment/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Continuous Deployment">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Continuous Deployment">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Continuous Deployment">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Continuous Deployment |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/tags/">Tags</a></span>
|
||||
<span>continuous deployment</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
|
||||
<div id="page-tag">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="fa fa-tag fa-fw text-muted"></i>
|
||||
continuous deployment
|
||||
<span class="lead text-muted ps-2">1</span>
|
||||
</h1>
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1726876800"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Continuous Deployment on Comprofix</title><link>https://comprofix.com/tags/continuous-deployment/</link><description>Recent content in Continuous Deployment on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/continuous-deployment/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Continuous Deployment on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/continuous-deployment/</link>
|
||||
<description>Recent content in Continuous Deployment on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/continuous-deployment/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1,54 +1,914 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/continuous-integration/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Continuous Integration"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Continuous Integration"><meta itemprop=name content="Continuous Integration"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Continuous Integration |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
|
||||
<span>continuous integration</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
|
||||
continuous integration
|
||||
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/tags/continuous-integration/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Continuous Integration">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Continuous Integration">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Continuous Integration">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Continuous Integration |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/tags/">Tags</a></span>
|
||||
<span>continuous integration</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
|
||||
<div id="page-tag">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="fa fa-tag fa-fw text-muted"></i>
|
||||
continuous integration
|
||||
<span class="lead text-muted ps-2">1</span>
|
||||
</h1>
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1726876800"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Continuous Integration on Comprofix</title><link>https://comprofix.com/tags/continuous-integration/</link><description>Recent content in Continuous Integration on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/continuous-integration/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Continuous Integration on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/continuous-integration/</link>
|
||||
<description>Recent content in Continuous Integration on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/continuous-integration/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1,54 +1,914 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/docker/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Docker"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Docker"><meta itemprop=name content="Docker"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Docker |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
|
||||
<span>docker</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
|
||||
docker
|
||||
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/tags/docker/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Docker">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Docker">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Docker">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Docker |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/tags/">Tags</a></span>
|
||||
<span>docker</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
|
||||
<div id="page-tag">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="fa fa-tag fa-fw text-muted"></i>
|
||||
docker
|
||||
<span class="lead text-muted ps-2">1</span>
|
||||
</h1>
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1726876800"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Docker on Comprofix</title><link>https://comprofix.com/tags/docker/</link><description>Recent content in Docker on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/docker/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Docker on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/docker/</link>
|
||||
<description>Recent content in Docker on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/docker/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1,54 +1,914 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/git/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Git"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Git"><meta itemprop=name content="Git"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Git |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
|
||||
<span>git</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
|
||||
git
|
||||
<span class="lead text-muted ps-2">1</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/tags/git/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Git">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Git">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Git">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Git |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/tags/">Tags</a></span>
|
||||
<span>git</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
|
||||
<div id="page-tag">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="fa fa-tag fa-fw text-muted"></i>
|
||||
git
|
||||
<span class="lead text-muted ps-2">1</span>
|
||||
</h1>
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1726876800"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,8 +1,19 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git on Comprofix</title><link>https://comprofix.com/tags/git/</link><description>Recent content in Git on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/git/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Git on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/git/</link>
|
||||
<description>Recent content in Git on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/git/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1,56 +1,931 @@
|
||||
<!doctype html><head><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css></head><html lang=en><head><meta charset=utf-8><meta name=theme-color media="(prefers-color-scheme: light)" content="#f7f7f7"><meta name=theme-color media="(prefers-color-scheme: dark)" content="#1b1b1e"><meta name=mobile-web-app-capable content="yes"><meta name=apple-mobile-web-app-status-bar-style content="black-translucent"><meta name=viewport content="width=device-width,user-scalable=no,initial-scale=1,shrink-to-fit=no,viewport-fit=cover"><meta property="og:url" content="https://comprofix.com/tags/homelab/"><meta property="og:site_name" content="Comprofix"><meta property="og:title" content="Homelab"><meta property="og:locale" content="en"><meta property="og:type" content="website"><meta name=twitter:card content="summary"><meta name=twitter:title content="Homelab"><meta itemprop=name content="Homelab"><meta itemprop=datePublished content="2024-09-21T00:00:00+00:00"><meta itemprop=dateModified content="2025-09-06T13:28:05+10:00"><title>Homelab |
|
||||
Comprofix</title><link rel=apple-touch-icon sizes=180x180 href=/img/favicons/apple-touch-icon.png><link rel=icon type=image/png sizes=32x32 href=/img/favicons/favicon-32x32.png><link rel=icon type=image/png sizes=16x16 href=/img/favicons/favicon-16x16.png><link rel="shortcut icon" href=/img/favicons/favicon.ico><meta name=apple-mobile-web-app-title content="Comprofix"><meta name=application-name content="Comprofix"><meta name=msapplication-TileColor content="#da532c"><meta name=msapplication-config content="/img/favicons/browserconfig.xml"><meta name=theme-color content="#ffffff"><link rel=preconnect href=https://fonts.googleapis.com><link rel=dns-prefetch href=https://fonts.googleapis.com><link rel=preconnect href=https://fonts.gstatic.com crossorigin><link rel=dns-prefetch href=https://fonts.gstatic.com><link rel=preconnect href=https://cdn.jsdelivr.net><link rel=dns-prefetch href=https://cdn.jsdelivr.net><link rel=stylesheet href=https://comprofix.com/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css><link rel=stylesheet href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap"><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css><link rel=stylesheet href=https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css><script src=/js/modules/theme.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js></script><script src=https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js></script><script defer src=/js/misc.js></script></head><body><aside aria-label=Sidebar id=sidebar class="d-flex flex-column align-items-end"><header class=profile-wrapper><a href=/ id=avatar class=rounded-circle><img src=/img/man-logo.png width=112 height=112 alt=avatar onerror='this.style.display="none"'></a>
|
||||
<a class="site-title d-block" href=/>Comprofix</a><p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p></header><nav class="flex-column flex-grow-1 w-100 ps-0"><ul class=nav><li class=nav-item><a href=/ class=nav-link><i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span></a></li><li class=nav-item><a href=/archives/ class=nav-link><i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span></a></li></ul></nav><div class="sidebar-bottom d-flex flex-wrap align-items-center w-100"><button type=button class="btn btn-link nav-link" aria-label="Switch Mode" id=mode-toggle>
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
<span class=icon-border></span>
|
||||
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i>
|
||||
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i>
|
||||
</a><a href=https://comprofix.com/index.xml aria-label=rss><i class="fas fa-rss"></i></a></div></aside><div id=main-wrapper class="d-flex justify-content-center"><div class="container d-flex flex-column px-xxl-5"><header id=topbar-wrapper class=flex-shrink-0 aria-label="Top Bar"><div id=topbar class="d-flex align-items-center justify-content-between px-lg-3 h-100"><nav id=breadcrumb aria-label=Breadcrumb><span><a href=/>Home</a>
|
||||
</span><span><a href=https://comprofix.com/tags/>Tags</a></span>
|
||||
<span>homelab</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar>
|
||||
<i class="fas fa-bars fa-fw"></i></button><div id=topbar-title></div><button type=button id=search-trigger class="btn btn-link" aria-label=Search>
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i>
|
||||
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...>
|
||||
</search><button type=button class="btn btn-link text-decoration-none" id=search-cancel>Cancel</button></div></header><div class="row flex-grow-1"><main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4"><div id=page-tag><h1 class=ps-lg-2><i class="fa fa-tag fa-fw text-muted"></i>
|
||||
homelab
|
||||
<span class="lead text-muted ps-2">2</span></h1><ul class="content ps-0"><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1726876800 data-df=ll>%b %e, %Y</time></li><li class="d-flex justify-content-between px-md-3"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
<time class="text-muted small text-nowrap" data-ts=1725494400 data-df=ll>%b %e, %Y</time></li></ul></div></main><aside aria-label=Panel id=panel-wrapper class="col-xl-3 ps-2 text-muted"><div class=access><section id=access-lastmod><h2 class=panel-heading>Recently Updated</h2><ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2"><li class="text-truncate lh-lg"><a href=/post/2024-09-05-resetrestart/>Reset and Restart</a></li><li class="text-truncate lh-lg"><a href=/post/2024-09-21-websitedeployment/>Continuous Integration & Continuous Deployment</a></li></ul></section><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div></aside></div><div class=row><div id=tail-wrapper class="col-12 col-lg-11 col-xl-9 px-md-4"><footer aria-label="Site Info" class="d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
|
||||
<time>2025</time>
|
||||
<a href=https://comprofix.com>Comprofix</a>.
|
||||
<span data-bs-toggle=tooltip data-bs-placement=top title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author.">Some rights reserved.</span></p><p>Using the <a data-bs-toggle=tooltip data-bs-placement=top title=v1.0.2 href=https://github.com/geekifan/hugo-theme-chirpy target=_blank rel=noopener>Chirpy</a> theme for <a href=https://gohugo.io/ target=_blank rel=noopener>Hugo</a>.</p></footer></div></div><div id=search-result-wrapper class="d-flex justify-content-center d-none"><div class="col-11 content"><div id=search-hints><section><h2 class=panel-heading>Trending Tags</h2><div class="d-flex flex-wrap mt-3 mb-1 me-3"><a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/cd/>cd</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a>
|
||||
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/homelab/>homelab</a></div></section></div><div id=search-results class="d-flex flex-wrap justify-content-center text-muted mt-3"></div></div></div><script>const DEFAULT_CONFIG={search:{minChars:1,maxResults:5,fields:{title:!0,description:!0,section:!0,contents:!0},strictMode:!0}};class FastSearch{constructor({searchInput:e,resultsContainer:t,json:n,searchResultTemplate:s=null,noResultsText:o=null}){this.searchInput=e,this.resultsContainer=t,this.json=n,this.searchResultTemplate=s,this.noResultsText=o,this.init()}init(){this.loadSearchIndex(),this.searchInput.addEventListener("input",e=>{if(!this.searchIndex){this.resultsContainer.innerHTML='<li class="search-message">Loading search index...</li>';return}this.performSearch(this.searchInput.value)})}async loadSearchIndex(){try{const e=await fetch(this.json);if(!e.ok)throw new Error("Failed to load search index");const t=await e.json();this.searchIndex=t.map(e=>({...e,searchableTitle:e.title?.toLowerCase()||"",searchableDesc:e.desc?.toLowerCase()||"",searchableSection:e.section?.toLowerCase()||"",searchableContents:e.contents?.toLowerCase()||""}))}catch(e){console.error("Error loading search index:",e),this.resultsContainer.innerHTML='<li class="search-message">Error loading search index...</li>'}}escapeHtml(e){return e?e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):""}containsTerm(e,t){return!!e&&!!t&&e.includes(t)}performSearch(e){if(e=e.toLowerCase().trim(),!e||!this.searchIndex||e.length<DEFAULT_CONFIG.search.minChars){this.resultsContainer.innerHTML="";return}const s=[e,...e.split(/\s+/).filter(e=>e.length>0)],t=[...new Set(s)],o=DEFAULT_CONFIG.search.strictMode,n=this.searchIndex.map(e=>{const s=this.checkFieldsForMatch(e,t[0]);if(o&&!s)return{item:e,score:0,matched:!1};let n=0,i=0,a=!1;t.forEach((t,s)=>{const r=s===0,o=this.checkFieldsForMatch(e,t);o&&(i++,o.inTitle&&(n+=r?10:5,a=!0),o.inDesc&&(n+=r?8:4),o.inSection&&(n+=r?6:3),o.inContents&&(n+=r?4:2))});const r=i/t.length,c=n*r*(a?1.5:1);return{item:e,score:c,matched:s}}).filter(e=>e.matched).sort((e,t)=>t.score-e.score).slice(0,DEFAULT_CONFIG.search.maxResults).map(e=>e.item);if(n.length===0){this.resultsContainer.innerHTML='<p class="mt-5">Oops! No results found.</p>';return}const i=n.map(e=>{let t="",n="";return e.categories&&(t=e.categories.join(", "),t=`<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${t}</div>`),e.tags&&(n=e.tags.join(", "),n=`<div><i class="fa fa-tag fa-fw"></i>${n}</div>`),`
|
||||
<!doctype html>
|
||||
<head><script src="/livereload.js?mindelay=10&v=2&port=1313&path=livereload" data-no-instant defer></script>
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
</head>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
|
||||
<meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
|
||||
>
|
||||
|
||||
<meta property="og:url" content="http://localhost:1313/tags/homelab/">
|
||||
<meta property="og:site_name" content="Comprofix">
|
||||
<meta property="og:title" content="Homelab">
|
||||
<meta property="og:locale" content="en">
|
||||
<meta property="og:type" content="website">
|
||||
|
||||
|
||||
<meta name="twitter:card" content="summary">
|
||||
<meta name="twitter:title" content="Homelab">
|
||||
|
||||
|
||||
<meta itemprop="name" content="Homelab">
|
||||
<meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
|
||||
<meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
|
||||
|
||||
<title>
|
||||
|
||||
Homelab |
|
||||
|
||||
Comprofix
|
||||
</title>
|
||||
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicons/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicons/favicon-16x16.png">
|
||||
|
||||
<link rel="shortcut icon" href="/img/favicons/favicon.ico">
|
||||
<meta name="apple-mobile-web-app-title" content="Comprofix">
|
||||
<meta name="application-name" content="Comprofix">
|
||||
<meta name="msapplication-TileColor" content="#da532c">
|
||||
<meta name="msapplication-config" content="/img/favicons/browserconfig.xml">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.googleapis.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com" >
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="preconnect" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
<link rel="dns-prefetch" href="https://cdn.jsdelivr.net" >
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Lato:wght@300;400&family=Source+Sans+Pro:wght@400;600;700;900&display=swap">
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.1/css/all.min.css">
|
||||
|
||||
|
||||
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/tocbot@4.32.2/dist/tocbot.min.css">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="/js/modules/theme.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/dayjs.min.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/locale/en.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/relativeTime.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/dayjs@1.11.13/plugin/localizedFormat.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<script defer src="/js/misc.js"></script>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<aside aria-label="Sidebar" id="sidebar" class="d-flex flex-column align-items-end">
|
||||
<header class="profile-wrapper">
|
||||
<a href="/" id="avatar" class="rounded-circle"><img src="/img/man-logo.png" width="112" height="112" alt="avatar" onerror="this.style.display='none'"></a>
|
||||
|
||||
<a class="site-title d-block" href="/">Comprofix</a>
|
||||
|
||||
<p class="site-subtitle fst-italic mb-0">Geek | Nerd | Systems Administrator | IT Specialist</p>
|
||||
|
||||
</header>
|
||||
|
||||
|
||||
<nav class="flex-column flex-grow-1 w-100 ps-0">
|
||||
<ul class="nav">
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/" class="nav-link">
|
||||
<i class="fa-fw fas fa-house"></i>
|
||||
<span>HOME</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/categories/" class="nav-link">
|
||||
<i class="fa-fw fas fa-stream"></i>
|
||||
<span>CATEGORIES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/tags/" class="nav-link">
|
||||
<i class="fa-fw fas fa-tags"></i>
|
||||
<span>TAGS</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/archives/" class="nav-link">
|
||||
<i class="fa-fw fas fa-archive"></i>
|
||||
<span>ARCHIVES</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="nav-item">
|
||||
<a href="/about/" class="nav-link">
|
||||
<i class="fa-fw fas fa-info-circle"></i>
|
||||
<span>ABOUT</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="sidebar-bottom d-flex flex-wrap align-items-center w-100">
|
||||
|
||||
<button type="button" class="btn btn-link nav-link" aria-label="Switch Mode" id="mode-toggle">
|
||||
<i class="fas fa-adjust"></i>
|
||||
</button>
|
||||
|
||||
|
||||
<span class="icon-border"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://git.comprofix.com/mmckinnon"
|
||||
aria-label="custom"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-git-alt"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="https://twitter.com/mckinnon81"
|
||||
aria-label="twitter"
|
||||
target="_blank" rel="noopener noreferrer"
|
||||
|
||||
>
|
||||
<i class="fab fa-twitter"></i>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<a
|
||||
href="http://localhost:1313/index.xml"
|
||||
aria-label="rss"
|
||||
|
||||
|
||||
>
|
||||
<i class="fas fa-rss"></i>
|
||||
</a>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
|
||||
<div id="main-wrapper" class="d-flex justify-content-center">
|
||||
<div class="container d-flex flex-column px-xxl-5">
|
||||
|
||||
<header id="topbar-wrapper" class="flex-shrink-0" aria-label="Top Bar">
|
||||
<div id="topbar" class="d-flex align-items-center justify-content-between px-lg-3 h-100">
|
||||
<nav id="breadcrumb" aria-label="Breadcrumb">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<span>
|
||||
<a href="/">Home</a>
|
||||
</span>
|
||||
|
||||
|
||||
<span><a href="http://localhost:1313/tags/">Tags</a></span>
|
||||
<span>homelab</span>
|
||||
|
||||
|
||||
|
||||
</nav>
|
||||
|
||||
|
||||
<button type="button" id="sidebar-trigger" class="btn btn-link" aria-label="Sidebar">
|
||||
<i class="fas fa-bars fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<div id="topbar-title">
|
||||
|
||||
</div>
|
||||
|
||||
<button type="button" id="search-trigger" class="btn btn-link" aria-label="Search">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
</button>
|
||||
|
||||
<search id="search" class="align-items-center ms-3 ms-lg-0">
|
||||
<i class="fas fa-search fa-fw"></i>
|
||||
<input
|
||||
class="form-control"
|
||||
id="search-input"
|
||||
type="search"
|
||||
aria-label="search"
|
||||
autocomplete="off"
|
||||
placeholder="Search..."
|
||||
>
|
||||
</search>
|
||||
<button type="button" class="btn btn-link text-decoration-none" id="search-cancel">Cancel</button>
|
||||
</div>
|
||||
</header>
|
||||
<div class="row flex-grow-1">
|
||||
<main aria-label="Main Content" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
|
||||
<div id="page-tag">
|
||||
<h1 class="ps-lg-2">
|
||||
<i class="fa fa-tag fa-fw text-muted"></i>
|
||||
homelab
|
||||
<span class="lead text-muted ps-2">2</span>
|
||||
</h1>
|
||||
<ul class="content ps-0">
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1726876800"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
<li class="d-flex justify-content-between px-md-3">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
<span class="dash flex-grow-1"></span>
|
||||
|
||||
|
||||
|
||||
|
||||
<time
|
||||
class="text-muted small text-nowrap"
|
||||
data-ts="1725494400"
|
||||
data-df="ll"
|
||||
|
||||
>
|
||||
%b %e, %Y
|
||||
</time>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</main>
|
||||
|
||||
|
||||
<aside aria-label="Panel" id="panel-wrapper" class="col-xl-3 ps-2 text-muted">
|
||||
<div class="access">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section id="access-lastmod">
|
||||
<h2 class="panel-heading">Recently Updated</h2>
|
||||
<ul class="content list-unstyled ps-0 pb-1 ms-1 mt-2">
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-21-websitedeployment/">Continuous Integration & Continuous Deployment</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="text-truncate lh-lg">
|
||||
<a href="/post/2024-09-05-resetrestart/">Reset and Restart</a>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
<div id="tail-wrapper" class="col-12 col-lg-11 col-xl-9 px-md-4">
|
||||
|
||||
|
||||
<footer
|
||||
aria-label="Site Info"
|
||||
class="
|
||||
d-flex flex-column justify-content-center text-muted
|
||||
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3
|
||||
"
|
||||
>
|
||||
<p>
|
||||
©
|
||||
<time>2025</time>
|
||||
|
||||
|
||||
|
||||
<a href="https://comprofix.com">Comprofix</a>.
|
||||
|
||||
|
||||
|
||||
<span
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="Except where otherwise noted, the blog posts on this site are licensed under the Creative Commons Attribution 4.0 International (CC BY 4.0) License by the author."
|
||||
>Some rights reserved.</span>
|
||||
</p>
|
||||
|
||||
<p>Using the <a
|
||||
data-bs-toggle="tooltip"
|
||||
data-bs-placement="top"
|
||||
title="v1.0.2"
|
||||
href="https://github.com/geekifan/hugo-theme-chirpy"
|
||||
target="_blank"
|
||||
rel="noopener"
|
||||
>Chirpy</a> theme for <a href="https://gohugo.io/" target="_blank" rel="noopener">Hugo</a>.
|
||||
</p>
|
||||
</footer>
|
||||
</div>
|
||||
</div>
|
||||
<div id="search-result-wrapper" class="d-flex justify-content-center d-none">
|
||||
<div class="col-11 content">
|
||||
<div id="search-hints">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<section>
|
||||
<h2 class="panel-heading">Trending Tags</h2>
|
||||
<div class="d-flex flex-wrap mt-3 mb-1 me-3">
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/cd/">cd</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/ci/">ci</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-deployment/">continuous deployment</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/continuous-integration/">continuous integration</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/docker/">docker</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/git/">git</a>
|
||||
|
||||
|
||||
<a class="post-tag btn btn-outline-primary" href="http://localhost:1313/tags/homelab/">homelab</a>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
|
||||
</div>
|
||||
<div id="search-results" class="d-flex flex-wrap justify-content-center text-muted mt-3"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const DEFAULT_CONFIG = {
|
||||
search: {
|
||||
minChars: 1,
|
||||
maxResults: 5,
|
||||
fields: {
|
||||
title: true,
|
||||
description: true,
|
||||
section: true,
|
||||
contents: true
|
||||
},
|
||||
|
||||
strictMode: true
|
||||
}
|
||||
};
|
||||
|
||||
class FastSearch {
|
||||
constructor({
|
||||
searchInput, resultsContainer, json,
|
||||
searchResultTemplate = null,
|
||||
noResultsText = null,
|
||||
}) {
|
||||
this.searchInput = searchInput;
|
||||
this.resultsContainer = resultsContainer;
|
||||
this.json = json;
|
||||
this.searchResultTemplate = searchResultTemplate;
|
||||
this.noResultsText = noResultsText;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
this.loadSearchIndex();
|
||||
this.searchInput.addEventListener('input', (event) => {
|
||||
if (!this.searchIndex) {
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Loading search index...</li>';
|
||||
return;
|
||||
}
|
||||
this.performSearch(this.searchInput.value);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
async loadSearchIndex() {
|
||||
try {
|
||||
const response = await fetch(this.json);
|
||||
if (!response.ok) throw new Error('Failed to load search index');
|
||||
const data = await response.json();
|
||||
|
||||
this.searchIndex = data.map(item => ({
|
||||
...item,
|
||||
|
||||
searchableTitle: item.title?.toLowerCase() || '',
|
||||
searchableDesc: item.desc?.toLowerCase() || '',
|
||||
searchableSection: item.section?.toLowerCase() || '',
|
||||
searchableContents: item.contents?.toLowerCase() || ''
|
||||
}));
|
||||
} catch (error) {
|
||||
console.error('Error loading search index:', error);
|
||||
this.resultsContainer.innerHTML = '<li class="search-message">Error loading search index...</li>';
|
||||
}
|
||||
}
|
||||
|
||||
escapeHtml(unsafe) {
|
||||
if (!unsafe) return '';
|
||||
return unsafe
|
||||
.replace(/&/g, "&")
|
||||
.replace(/</g, "<")
|
||||
.replace(/>/g, ">")
|
||||
.replace(/"/g, """)
|
||||
.replace(/'/g, "'");
|
||||
}
|
||||
|
||||
|
||||
containsTerm(text, term) {
|
||||
if (!text || !term) return false;
|
||||
return text.includes(term);
|
||||
}
|
||||
|
||||
performSearch(query) {
|
||||
|
||||
query = query.toLowerCase().trim();
|
||||
|
||||
|
||||
if (!query || !this.searchIndex || query.length < DEFAULT_CONFIG.search.minChars) {
|
||||
this.resultsContainer.innerHTML = '';
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
const searchTerms = [
|
||||
query,
|
||||
...query.split(/\s+/).filter(term => term.length > 0)
|
||||
];
|
||||
|
||||
|
||||
const uniqueTerms = [...new Set(searchTerms)];
|
||||
|
||||
|
||||
const requireFullQueryMatch = DEFAULT_CONFIG.search.strictMode;
|
||||
|
||||
|
||||
const results = this.searchIndex
|
||||
.map(item => {
|
||||
|
||||
const fullQueryMatched = this.checkFieldsForMatch(item, uniqueTerms[0]);
|
||||
|
||||
|
||||
if (requireFullQueryMatch && !fullQueryMatched) {
|
||||
return { item, score: 0, matched: false };
|
||||
}
|
||||
|
||||
|
||||
let score = 0;
|
||||
let matchedTermsCount = 0;
|
||||
let matchedInTitle = false;
|
||||
|
||||
|
||||
uniqueTerms.forEach((term, index) => {
|
||||
|
||||
const isFullQuery = index === 0;
|
||||
const matched = this.checkFieldsForMatch(item, term);
|
||||
|
||||
if (matched) {
|
||||
matchedTermsCount++;
|
||||
|
||||
|
||||
if (matched.inTitle) {
|
||||
score += isFullQuery ? 10 : 5;
|
||||
matchedInTitle = true;
|
||||
}
|
||||
if (matched.inDesc) {
|
||||
score += isFullQuery ? 8 : 4;
|
||||
}
|
||||
if (matched.inSection) {
|
||||
score += isFullQuery ? 6 : 3;
|
||||
}
|
||||
if (matched.inContents) {
|
||||
score += isFullQuery ? 4 : 2;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const matchRatio = matchedTermsCount / uniqueTerms.length;
|
||||
|
||||
|
||||
const finalScore = score * matchRatio * (matchedInTitle ? 1.5 : 1);
|
||||
|
||||
return {
|
||||
item,
|
||||
score: finalScore,
|
||||
matched: fullQueryMatched
|
||||
};
|
||||
})
|
||||
.filter(result => result.matched)
|
||||
.sort((a, b) => b.score - a.score)
|
||||
.slice(0, DEFAULT_CONFIG.search.maxResults)
|
||||
.map(result => result.item);
|
||||
|
||||
|
||||
if (results.length === 0) {
|
||||
this.resultsContainer.innerHTML = '<p class="mt-5">Oops! No results found.</p>';
|
||||
return;
|
||||
}
|
||||
|
||||
const searchItems = results.map((item) => {
|
||||
let categories = '';
|
||||
let tags = '';
|
||||
if (item.categories) {
|
||||
categories = item.categories.join(', ');
|
||||
categories = `<div class="me-sm-4"><i class="far fa-folder fa-fw"></i>${categories}</div>`;
|
||||
}
|
||||
if (item.tags) {
|
||||
tags = item.tags.join(', ');
|
||||
tags = `<div><i class="fa fa-tag fa-fw"></i>${tags}</div>`
|
||||
}
|
||||
return `
|
||||
<article class="px-1 px-sm-2 px-lg-4 px-xl-0">
|
||||
<header>
|
||||
<h2><a href="${this.escapeHtml(e.permalink)}">${this.escapeHtml(e.title)}</a></h2>
|
||||
<h2><a href="${this.escapeHtml(item.permalink)}">${this.escapeHtml(item.title)}</a></h2>
|
||||
<div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
|
||||
${t}
|
||||
${n}
|
||||
${categories}
|
||||
${tags}
|
||||
</div>
|
||||
</header>
|
||||
<p>${this.escapeHtml(e.contents)}</p>
|
||||
<p>${this.escapeHtml(item.contents)}</p>
|
||||
</article>
|
||||
`}).join("");this.resultsContainer.innerHTML=i}checkFieldsForMatch(e,t){const n={inTitle:!1,inDesc:!1,inSection:!1,inContents:!1};return DEFAULT_CONFIG.search.fields.title&&this.containsTerm(e.searchableTitle,t)&&(n.inTitle=!0),DEFAULT_CONFIG.search.fields.description&&this.containsTerm(e.searchableDesc,t)&&(n.inDesc=!0),DEFAULT_CONFIG.search.fields.section&&this.containsTerm(e.searchableSection,t)&&(n.inSection=!0),DEFAULT_CONFIG.search.fields.contents&&this.containsTerm(e.searchableContents,t)&&(n.inContents=!0),!!(n.inTitle||n.inDesc||n.inSection||n.inContents)&&n}}const search=new FastSearch({searchInput:document.getElementById("search-input"),resultsContainer:document.getElementById("search-results"),json:`/index.json`})</script></div><aside aria-label="Scroll to Top"><button id=back-to-top type=button class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i></button></aside></div><div id=mask class="d-none position-fixed w-100 h-100 z-1"></div></body></html>
|
||||
`;
|
||||
}).join('');
|
||||
|
||||
this.resultsContainer.innerHTML = searchItems;
|
||||
}
|
||||
|
||||
|
||||
checkFieldsForMatch(item, term) {
|
||||
const matches = {
|
||||
inTitle: false,
|
||||
inDesc: false,
|
||||
inSection: false,
|
||||
inContents: false
|
||||
};
|
||||
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.title && this.containsTerm(item.searchableTitle, term)) {
|
||||
matches.inTitle = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.description && this.containsTerm(item.searchableDesc, term)) {
|
||||
matches.inDesc = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.section && this.containsTerm(item.searchableSection, term)) {
|
||||
matches.inSection = true;
|
||||
}
|
||||
|
||||
if (DEFAULT_CONFIG.search.fields.contents && this.containsTerm(item.searchableContents, term)) {
|
||||
matches.inContents = true;
|
||||
}
|
||||
|
||||
|
||||
if (matches.inTitle || matches.inDesc || matches.inSection || matches.inContents) {
|
||||
return matches;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
const search = new FastSearch({
|
||||
searchInput: document.getElementById('search-input'),
|
||||
resultsContainer: document.getElementById('search-results'),
|
||||
json: `\/index.json`
|
||||
});
|
||||
|
||||
</script>
|
||||
</div>
|
||||
|
||||
<aside aria-label="Scroll to Top">
|
||||
<button id="back-to-top" type="button" class="btn btn-lg btn-box-shadow">
|
||||
<i class="fas fa-angle-up"></i>
|
||||
</button>
|
||||
</aside>
|
||||
</div>
|
||||
|
||||
<div id="mask" class="d-none position-fixed w-100 h-100 z-1"></div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,10 +1,26 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Homelab on Comprofix</title><link>https://comprofix.com/tags/homelab/</link><description>Recent content in Homelab on Comprofix</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sat, 06 Sep 2025 13:28:05 +1000</lastBuildDate><atom:link href="https://comprofix.com/tags/homelab/index.xml" rel="self" type="application/rss+xml"/><item><title>Continuous Integration & Continuous Deployment</title><link>https://comprofix.com/post/2024-09-21-websitedeployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-21-websitedeployment/</guid><description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
|
||||
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
|
||||
<h3 id="why-use-cicd" id=why-use-cicd>
|
||||
|
||||
<span class="me-2">Why use CI/CD?</span>
|
||||
<a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
|
||||
|
||||
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description></item><item><title>Reset and Restart</title><link>https://comprofix.com/post/2024-09-05-resetrestart/</link><pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/post/2024-09-05-resetrestart/</guid><description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
|
||||
<p>But the website has been more of a play ground for experimenting and testing.</p>
|
||||
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Homelab on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/homelab/</link>
|
||||
<description>Recent content in Homelab on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/homelab/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Continuous Integration & Continuous Deployment</title>
|
||||
<link>http://localhost:1313/post/2024-09-21-websitedeployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-21-websitedeployment/</guid>
|
||||
<description><p>Since the reset of the website, I have been working on getting it to auto build and deploy using <a href="https://docs.gitea.com/usage/actions/overview">Gitea Actions</a>. Which is similar and compatible to <a href="https://github.com/features/actions">GitHub Actions</a></p>
<p>Before implementing the action it was a manual process which required using docker commands to login, build and push the image to the container registry.</p>
<h3 id="why-use-cicd" id=why-use-cicd>
 
 <span class="me-2">Why use CI/CD?</span>
 <a href="#why-use-cicd" class="anchor text-muted"><i class="fas fa-hashtag"></i></a>
 
</h3><p>It takes the manual process steps away and does them for you, helping you to avoid missing any steps and avoiding errors. This also makes the interaction seamless and automated.</p></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Reset and Restart</title>
|
||||
<link>http://localhost:1313/post/2024-09-05-resetrestart/</link>
|
||||
<pubDate>Thu, 05 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/post/2024-09-05-resetrestart/</guid>
|
||||
<description><p>It&rsquo;s time to reset the website and start building my blog again. I have had this domain for a number of years and it has always been used for my E-Mail.</p>
<p>But the website has been more of a play ground for experimenting and testing.</p>
<p>I am now hoping to get into the habit of writing more blog posts as I document my journey as I experiment with my HomeLab.</p></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||
@@ -1 +1,61 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tags on Comprofix</title><link>https://comprofix.com/tags/</link><description>Recent content in Tags on Comprofix</description><generator>Hugo</generator><language>en</language><atom:link href="https://comprofix.com/tags/index.xml" rel="self" type="application/rss+xml"/><item><title>Cd</title><link>https://comprofix.com/tags/cd/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/cd/</guid><description/></item><item><title>Ci</title><link>https://comprofix.com/tags/ci/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/ci/</guid><description/></item><item><title>Continuous Deployment</title><link>https://comprofix.com/tags/continuous-deployment/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/continuous-deployment/</guid><description/></item><item><title>Continuous Integration</title><link>https://comprofix.com/tags/continuous-integration/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/continuous-integration/</guid><description/></item><item><title>Docker</title><link>https://comprofix.com/tags/docker/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/docker/</guid><description/></item><item><title>Git</title><link>https://comprofix.com/tags/git/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/git/</guid><description/></item><item><title>Homelab</title><link>https://comprofix.com/tags/homelab/</link><pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate><guid>https://comprofix.com/tags/homelab/</guid><description/></item></channel></rss>
|
||||
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
|
||||
<channel>
|
||||
<title>Tags on Comprofix</title>
|
||||
<link>http://localhost:1313/tags/</link>
|
||||
<description>Recent content in Tags on Comprofix</description>
|
||||
<generator>Hugo</generator>
|
||||
<language>en</language>
|
||||
<lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
|
||||
<atom:link href="http://localhost:1313/tags/index.xml" rel="self" type="application/rss+xml" />
|
||||
<item>
|
||||
<title>Cd</title>
|
||||
<link>http://localhost:1313/tags/cd/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/tags/cd/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Ci</title>
|
||||
<link>http://localhost:1313/tags/ci/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/tags/ci/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Continuous Deployment</title>
|
||||
<link>http://localhost:1313/tags/continuous-deployment/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/tags/continuous-deployment/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Continuous Integration</title>
|
||||
<link>http://localhost:1313/tags/continuous-integration/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/tags/continuous-integration/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Docker</title>
|
||||
<link>http://localhost:1313/tags/docker/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/tags/docker/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Git</title>
|
||||
<link>http://localhost:1313/tags/git/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/tags/git/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
<item>
|
||||
<title>Homelab</title>
|
||||
<link>http://localhost:1313/tags/homelab/</link>
|
||||
<pubDate>Sat, 21 Sep 2024 00:00:00 +0000</pubDate>
|
||||
<guid>http://localhost:1313/tags/homelab/</guid>
|
||||
<description></description>
|
||||
</item>
|
||||
</channel>
|
||||
</rss>
|
||||
|
||||