9 Commits

Author SHA1 Message Date
11fc74b35d chore: update for production
Some checks failed
Build and Deploy Production / deploy (push) Has been cancelled
Build and Deploy Production / build-and-push (push) Has been cancelled
2025-09-06 18:34:30 +10:00
352766d8e6 chore: update develop to pull always
All checks were successful
Build and Deploy Development / build-and-push (push) Successful in 3m41s
Build and Deploy Development / deploy (push) Successful in 1m31s
2025-09-06 18:17:26 +10:00
2702e74ac5 chore: update Dockerfile for fresh build
All checks were successful
Build and Deploy Development / build-and-push (push) Successful in 2m6s
Build and Deploy Development / deploy (push) Successful in 12s
2025-09-06 17:57:19 +10:00
03c8e07f87 chore: update Dockerfile for fresh build
Some checks failed
Build and Deploy Development / build-and-push (push) Failing after 40s
Build and Deploy Development / deploy (push) Has been skipped
2025-09-06 17:54:48 +10:00
f65407f86a chore: add favicons
All checks were successful
Build and Deploy Development / build-and-push (push) Successful in 3m0s
Build and Deploy Development / deploy (push) Successful in 21s
2025-09-06 16:30:43 +10:00
d9585f2037 fix: update env develop hostname
All checks were successful
Build and Deploy Development / build-and-push (push) Successful in 3m27s
Build and Deploy Development / deploy (push) Successful in 16s
2025-09-06 15:56:16 +10:00
6271d5dfcc fix: update workflow yml
All checks were successful
Build and Deploy Development / build-and-push (push) Successful in 3m36s
Build and Deploy Development / deploy (push) Successful in 28s
2025-09-06 15:45:27 +10:00
d0a79302d4 fix: update workflow yml
Some checks failed
Build and Deploy Development / build-and-push (push) Successful in 52s
Build and Deploy Development / deploy (push) Failing after 15s
2025-09-06 15:42:20 +10:00
c4bd7bac2d fix: update workflow yml
Some checks failed
Build and Deploy Development / build-and-push (push) Successful in 1m4s
Build and Deploy Development / deploy (push) Failing after 10s
2025-09-06 15:23:06 +10:00
55 changed files with 39056 additions and 1123 deletions

View File

@ -1,4 +1,4 @@
IMAGE_TAG=develop IMAGE_TAG=develop
CONTAINER_NAME=comprofix-develop CONTAINER_NAME=comprofix-develop
HUGO_BASEURL=https://dev.comprofix.com HUGO_BASEURL=https://dev.comprofix.com
HOSTNAME=comprofix.com HOSTNAME=dev.comprofix.com

View File

@ -7,7 +7,9 @@ on:
jobs: jobs:
build-and-push: build-and-push:
runs-on: ubuntu-latest runs-on: homelab-latest
container:
image: catthehacker/ubuntu:act-latest
env: env:
DOCKER_REGISTRY: git.comprofix.com DOCKER_REGISTRY: git.comprofix.com
IMAGE_NAME: mmckinnon/comprofix.com IMAGE_NAME: mmckinnon/comprofix.com
@ -33,7 +35,7 @@ jobs:
HUGO_BASEURL=https://dev.comprofix.com/ HUGO_BASEURL=https://dev.comprofix.com/
deploy: deploy:
runs-on: ubuntu-latest runs-on: homelab-latest
needs: build-and-push needs: build-and-push
env: env:
DEPLOY_USER: administrator DEPLOY_USER: administrator
@ -47,6 +49,9 @@ jobs:
mkdir -p ~/.ssh mkdir -p ~/.ssh
eval $(ssh-agent -s) eval $(ssh-agent -s)
ssh-add <(echo "${{ secrets.SSH_PRIVATE_KEY }}") ssh-add <(echo "${{ secrets.SSH_PRIVATE_KEY }}")
echo "HOST *" > ~/.ssh/config
echo "StrictHostKeyChecking no" >> ~/.ssh/config
echo "nameserver 10.10.10.1" > /etc/resolv.conf
echo "Uploading docker-compose.yml and .env.develop..." echo "Uploading docker-compose.yml and .env.develop..."
scp docker-compose.yml $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH scp docker-compose.yml $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH
@ -55,5 +60,5 @@ jobs:
echo "Deploying development container..." echo "Deploying development container..."
ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$DEPLOY_HOST " ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$DEPLOY_HOST "
cd $DEPLOY_PATH cd $DEPLOY_PATH
docker compose --env-file .env up -d docker compose --env-file .env up -d --pull always
" "

View File

@ -3,7 +3,7 @@ name: Build and Deploy Production
on: on:
push: push:
tags: tags:
- "v*" - "v*.*.*"
jobs: jobs:
build-and-push: build-and-push:
@ -22,13 +22,19 @@ jobs:
username: ${{ secrets.REGISTRY_USERNAME }} username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_TOKEN }} password: ${{ secrets.REGISTRY_TOKEN }}
- name: Build and push Docker image - name: Extract version from tag
id: vars
run: echo "VERSION=${GITHUB_REF_NAME}" >> $GITHUB_ENV
- name: Build and push Docker images
uses: docker/build-push-action@v6 uses: docker/build-push-action@v6
with: with:
context: . context: .
file: ./Dockerfile file: ./Dockerfile
push: true push: true
tags: ${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.ref_name }} tags: |
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:latest
${{ env.DOCKER_REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.VERSION }}
build-args: | build-args: |
HUGO_BASEURL=https://comprofix.com/ HUGO_BASEURL=https://comprofix.com/
@ -50,10 +56,16 @@ jobs:
echo "Uploading docker-compose.yml and .env.production..." echo "Uploading docker-compose.yml and .env.production..."
scp docker-compose.yml $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH scp docker-compose.yml $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH
scp .env.production $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/.env
# Replace IMAGE_TAG in .env.production with the current VERSION
sed "s/^IMAGE_TAG=.*/IMAGE_TAG=${{ env.VERSION }}/" .env.production > .env.production.new
scp .env.production.new $DEPLOY_USER@$DEPLOY_HOST:$DEPLOY_PATH/.env.production
echo "Deploying production container..." echo "Deploying production container..."
ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$DEPLOY_HOST " ssh -o StrictHostKeyChecking=no $DEPLOY_USER@$DEPLOY_HOST "
cd $DEPLOY_PATH cd $DEPLOY_PATH
docker compose --env-file .env up -d docker compose --env-file .env.production down --remove-orphans
docker compose --env-file .env.production pull --ignore-pull-failures
docker compose --env-file .env.production up -d
" "

View File

@ -13,10 +13,10 @@ COPY . /src
# Build site with optional baseURL override # Build site with optional baseURL override
RUN if [ -z "$HUGO_BASEURL" ]; then \ RUN if [ -z "$HUGO_BASEURL" ]; then \
echo "Building site using baseURL from hugo.toml"; \ echo "Building site using baseURL from hugo.toml"; \
hugo --minify --gc --enableGitInfo; \ hugo --minify --gc --enableGitInfo --destination /build; \
else \ else \
echo "Building site with HUGO_BASEURL=$HUGO_BASEURL"; \ echo "Building site with HUGO_BASEURL=$HUGO_BASEURL"; \
hugo --minify --gc --enableGitInfo --baseURL "$HUGO_BASEURL"; \ hugo --minify --gc --enableGitInfo --destination /build --baseURL "$HUGO_BASEURL"; \
fi fi
# Optional: fallback 404 page for multi-language sites # Optional: fallback 404 page for multi-language sites
@ -28,4 +28,4 @@ RUN if [ -z "$HUGO_BASEURL" ]; then \
FROM hugomods/hugo:nginx FROM hugomods/hugo:nginx
# Copy built static site # Copy built static site
COPY --from=builder /src/public /site COPY --from=builder /build /site

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 264 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span>404 Page not found</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<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> <meta
<i class="fas fa-search fa-fw"></i> name="viewport"
</button> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
<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> <meta property="og:url" content="http://localhost:1313/404.html">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a> <meta property="og:site_name" content="Comprofix">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a> <meta property="og:title" content="404 Page not found">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta property="og:locale" content="en">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a> <meta property="og:type" content="website">
<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>© <meta name="twitter:card" content="summary">
<time>2025</time> <meta name="twitter:title" content="404 Page not found">
<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> <meta itemprop="name" content="404 Page not found">
<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> <title>
<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> 404 Page not found |
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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&#39;ve misplaced that URL or it&#39;s pointing to something that doesn&#39;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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 Jekylls 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). <!doctype html>
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 Jekylls 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). <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
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 Jekylls 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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>HOME</span></a></li><li class=nav-item><a href=/categories/ class=nav-link><i class="fa-fw fas fa-stream"></i> </head>
<span>CATEGORIES</span></a></li><li class=nav-item><a href=/tags/ class=nav-link><i class="fa-fw fas fa-tags"></i> <html lang="en">
<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> <head>
<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> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<i class="fas fa-adjust"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</button> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
<span class=icon-border></span> <meta name="mobile-web-app-capable" content="yes">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta
</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> name="viewport"
</span><span>About</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
<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> <meta property="og:url" content="http://localhost:1313/about/">
<search id=search class="align-items-center ms-3 ms-lg-0"><i class="fas fa-search fa-fw"></i> <meta property="og:site_name" content="Comprofix">
<input class=form-control id=search-input type=search aria-label=search autocomplete=off placeholder=Search...> <meta property="og:title" content="About">
</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&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><h2 id=features id=features><span class=me-2>Features</span> <meta property="og:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls 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).
<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> Follow the posts in the demo site to quickly set up a free personal blog!">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a> <meta property="og:locale" content="en">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-deployment/>continuous deployment</a> <meta property="og:type" content="article">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta property="article:published_time" content="2023-04-20T00:00:00+00:00">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a> <meta property="article:modified_time" content="2023-04-20T00:00:00+00:00">
<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>© <meta name="twitter:card" content="summary">
<time>2025</time> <meta name="twitter:title" content="About">
<a href=https://comprofix.com>Comprofix</a>. <meta name="twitter:description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls 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).
<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> Follow the posts in the demo site to quickly set up a free personal blog!">
<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> <meta itemprop="name" content="About">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/docker/>docker</a> <meta itemprop="description" content="Chirpy is a blog theme originally based on Jekyll. Due to Jekylls 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).
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> Follow the posts in the demo site to quickly set up a free personal blog!">
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),` <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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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&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>
<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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

File diff suppressed because it is too large Load Diff

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/categories/>Categories</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>gitea</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/categories/gitea/">
</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> <meta property="og:site_name" content="Comprofix">
Gitea <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta name="twitter:title" content="Gitea">
<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 <meta itemprop="name" content="Gitea">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>© <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<time>2025</time> <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<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> <title>
<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> Gitea |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> </title>
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
<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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Gitea on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/categories/gitea/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Gitea on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/categories/>Categories</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>homelab</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/categories/homelab/">
</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> <meta property="og:site_name" content="Comprofix">
Homelab <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a> <meta name="twitter:title" content="Homelab">
<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> <meta itemprop="name" content="Homelab">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<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 <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time> <title>
<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> Homelab |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> </title>
<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> <link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),` <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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Homelab on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/categories/homelab/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Homelab on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt; <language>en</language>
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt; <lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <atom:link href="http://localhost:1313/categories/homelab/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

File diff suppressed because it is too large Load Diff

View File

@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt; <language>en</language>
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt; <lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;&lt;a href="https://github.com/cotes2020/jekyll-theme-chirpy"&gt;Chirpy&lt;/a&gt; is a blog theme originally based on &lt;a href="https://jekyllrb.com/"&gt;Jekyll&lt;/a&gt;. Due to Jekyll&amp;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 &lt;a href="https://github.com/geekifan/hugo-theme-chirpy"&gt;hugo-theme-chirpy&lt;/a&gt; project migrated the Chirpy theme to &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).&lt;/p&gt; <atom:link href="http://localhost:1313/index.xml" rel="self" type="application/rss+xml" />
&lt;p&gt;Follow the posts in the demo site to quickly set up a free personal blog!&lt;/p&gt;</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> <item>
<title>Continuous Integration &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;&lt;a href=&#34;https://github.com/cotes2020/jekyll-theme-chirpy&#34;&gt;Chirpy&lt;/a&gt; is a blog theme originally based on &lt;a href=&#34;https://jekyllrb.com/&#34;&gt;Jekyll&lt;/a&gt;. Due to Jekyll&amp;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 &lt;a href=&#34;https://github.com/geekifan/hugo-theme-chirpy&#34;&gt;hugo-theme-chirpy&lt;/a&gt; project migrated the Chirpy theme to &lt;a href=&#34;https://gohugo.io/&#34;&gt;Hugo&lt;/a&gt; with minimal adaptations. All features of Chirpy are available in hugo-theme-chirpy (though some functionalities may operate differently within the Hugo framework).&lt;/p&gt;&#xA;&lt;p&gt;Follow the posts in the demo site to quickly set up a free personal blog!&lt;/p&gt;</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>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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;
})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Posts on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/post/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Posts on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt; <language>en</language>
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt; <lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <atom:link href="http://localhost:1313/post/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/tags/>Tags</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>cd</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/tags/cd/">
</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> <meta property="og:site_name" content="Comprofix">
cd <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta name="twitter:title" content="Cd">
<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 <meta itemprop="name" content="Cd">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>© <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<time>2025</time> <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<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> <title>
<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> Cd |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> </title>
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
<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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Cd on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/tags/cd/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Cd on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/tags/>Tags</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>ci</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/tags/ci/">
</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> <meta property="og:site_name" content="Comprofix">
ci <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta name="twitter:title" content="Ci">
<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 <meta itemprop="name" content="Ci">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>© <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<time>2025</time> <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<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> <title>
<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> Ci |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> </title>
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
<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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Ci on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/tags/ci/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Ci on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/tags/>Tags</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>continuous deployment</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/tags/continuous-deployment/">
</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> <meta property="og:site_name" content="Comprofix">
continuous deployment <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta name="twitter:title" content="Continuous Deployment">
<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 <meta itemprop="name" content="Continuous Deployment">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>© <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<time>2025</time> <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<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> <title>
<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> Continuous Deployment |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> </title>
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
<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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Continuous Deployment on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/tags/continuous-deployment/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Continuous Deployment on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/tags/>Tags</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>continuous integration</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/tags/continuous-integration/">
</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> <meta property="og:site_name" content="Comprofix">
continuous integration <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta name="twitter:title" content="Continuous Integration">
<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 <meta itemprop="name" content="Continuous Integration">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>© <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<time>2025</time> <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<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> <title>
<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> Continuous Integration |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> </title>
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
<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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Continuous Integration on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/tags/continuous-integration/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Continuous Integration on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/tags/>Tags</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>docker</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/tags/docker/">
</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> <meta property="og:site_name" content="Comprofix">
docker <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta name="twitter:title" content="Docker">
<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 <meta itemprop="name" content="Docker">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>© <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<time>2025</time> <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<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> <title>
<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> Docker |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> </title>
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
<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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Docker on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/tags/docker/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Docker on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/tags/>Tags</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>git</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/tags/git/">
</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> <meta property="og:site_name" content="Comprofix">
git <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> <meta name="twitter:title" content="Git">
<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 <meta itemprop="name" content="Git">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>© <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<time>2025</time> <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
<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> <title>
<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> Git |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> </title>
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),`
<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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Git on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/tags/git/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Git on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

View File

@ -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 | <!doctype html>
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&amp;family=Source+Sans+Pro:wght@400;600;700;900&amp;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> <head><script src="/livereload.js?mindelay=10&amp;v=2&amp;port=1313&amp;path=livereload" data-no-instant defer></script>
<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> <link rel="stylesheet" href="http://localhost:1313/css/main.min.f77a4050bafcd273d43d6737e174f344bd91a213d9bc92b097cb31fc7dbe1cb9.css">
<span>ARCHIVES</span></a></li><li class=nav-item><a href=/about/ class=nav-link><i class="fa-fw fas fa-info-circle"></i> </head>
<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> <html lang="en">
<i class="fas fa-adjust"></i>
</button> <head>
<span class=icon-border></span> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<a href=https://git.comprofix.com/mmckinnon aria-label=custom target=_blank rel="noopener noreferrer"><i class="fab fa-git-alt"></i> <meta name="theme-color" media="(prefers-color-scheme: light)" content="#f7f7f7">
</a><a href=https://twitter.com/mckinnon81 aria-label=twitter target=_blank rel="noopener noreferrer"><i class="fab fa-twitter"></i> <meta name="theme-color" media="(prefers-color-scheme: dark)" content="#1b1b1e">
</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> <meta name="mobile-web-app-capable" content="yes">
</span><span><a href=https://comprofix.com/tags/>Tags</a></span> <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<span>homelab</span></nav><button type=button id=sidebar-trigger class="btn btn-link" aria-label=Sidebar> <meta
<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> name="viewport"
<i class="fas fa-search fa-fw"></i> content="width=device-width, user-scalable=no, initial-scale=1, shrink-to-fit=no, viewport-fit=cover"
</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...> <meta property="og:url" content="http://localhost:1313/tags/homelab/">
</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> <meta property="og:site_name" content="Comprofix">
homelab <meta property="og:title" content="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> <meta property="og:locale" content="en">
<span class="dash flex-grow-1"></span> <meta property="og:type" content="website">
<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> <meta name="twitter:card" content="summary">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/ci/>ci</a> <meta name="twitter:title" content="Homelab">
<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> <meta itemprop="name" content="Homelab">
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/git/>git</a> <meta itemprop="datePublished" content="2024-09-21T00:00:00+00:00">
<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 <meta itemprop="dateModified" content="2024-09-21T00:00:00+00:00">
flex-lg-row justify-content-lg-between align-items-lg-center pb-lg-3"><p>©
<time>2025</time> <title>
<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> Homelab |
<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> Comprofix
<a class="post-tag btn btn-outline-primary" href=https://comprofix.com/tags/continuous-integration/>continuous integration</a> </title>
<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> <link rel="apple-touch-icon" sizes="180x180" href="/img/favicons/apple-touch-icon.png">
<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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;"):""}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>`),` <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&amp;family=Source&#43;Sans&#43;Pro:wght@400;600;700;900&amp;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 &amp; 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 &amp; 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, "&amp;")
.replace(/</g, "&lt;")
.replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
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"> <article class="px-1 px-sm-2 px-lg-4 px-xl-0">
<header> <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"> <div class="post-meta d-flex flex-column flex-sm-row text-muted mt-1 mb-1">
${t} ${categories}
${n} ${tags}
</div> </div>
</header> </header>
<p>${this.escapeHtml(e.contents)}</p> <p>${this.escapeHtml(item.contents)}</p>
</article> </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>

View File

@ -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 &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href="https://docs.gitea.com/usage/actions/overview"&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href="https://github.com/features/actions"&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt; <?xml version="1.0" encoding="utf-8" standalone="yes"?>
&lt;p&gt;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.&lt;/p&gt; <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
&lt;h3 id="why-use-cicd" id=why-use-cicd&gt; <channel>
<title>Homelab on Comprofix</title>
&lt;span class="me-2"&gt;Why use CI/CD?&lt;/span&gt; <link>http://localhost:1313/tags/homelab/</link>
&lt;a href="#why-use-cicd" class="anchor text-muted"&gt;&lt;i class="fas fa-hashtag"&gt;&lt;/i&gt;&lt;/a&gt; <description>Recent content in Homelab on Comprofix</description>
<generator>Hugo</generator>
&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt; <language>en</language>
&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt; <lastBuildDate>Sat, 21 Sep 2024 00:00:00 +0000</lastBuildDate>
&lt;p&gt;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.&lt;/p&gt;</description></item></channel></rss> <atom:link href="http://localhost:1313/tags/homelab/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>Continuous Integration &amp; 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>&lt;p&gt;Since the reset of the website, I have been working on getting it to auto build and deploy using &lt;a href=&#34;https://docs.gitea.com/usage/actions/overview&#34;&gt;Gitea Actions&lt;/a&gt;. Which is similar and compatible to &lt;a href=&#34;https://github.com/features/actions&#34;&gt;GitHub Actions&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;&#xA;&lt;h3 id=&#34;why-use-cicd&#34; id=why-use-cicd&gt;&#xA; &#xA; &lt;span class=&#34;me-2&#34;&gt;Why use CI/CD?&lt;/span&gt;&#xA; &lt;a href=&#34;#why-use-cicd&#34; class=&#34;anchor text-muted&#34;&gt;&lt;i class=&#34;fas fa-hashtag&#34;&gt;&lt;/i&gt;&lt;/a&gt;&#xA; &#xA;&lt;/h3&gt;&lt;p&gt;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.&lt;/p&gt;</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>&lt;p&gt;It&amp;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.&lt;/p&gt;&#xA;&lt;p&gt;But the website has been more of a play ground for experimenting and testing.&lt;/p&gt;&#xA;&lt;p&gt;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.&lt;/p&gt;</description>
</item>
</channel>
</rss>

File diff suppressed because it is too large Load Diff

View File

@ -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>