Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions go/blog/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# Makefile for more convenient hugo setup


all: build

build:
-mkdir dist
cd hugo && hugo -d ../dist

clean:
rm -rf dist
72 changes: 72 additions & 0 deletions go/blog/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# Welcome to Blog Function in Go!

This template serves as an example of how to use [Hugo](https://gohugo.io/)
package as a static file generator for your website. It uses instanced Function
in go for the deployment. All the hugo content can be found in the `hugo/`
directory.

## How to use
The root directory will contain your standard Function with one addition -
`hugo/` directory.
This will contain all the hugo files needed. You will need to familiarize
yourself with [Hugo](https://gohugo.io/) in order to use it.

You can develop in a live server where changes happen instanteniously with hugo.
You can do this via command:

```bash
hugo server
```

Note: Look at different flag options in order to build all files, including
drafts etc. (`hugo server -D`) for example.


### Deploy your Function
Once you make your changes in the hugo files you will need to build static
files. You can achieve this via `hugo build` with target destination of `dist`
or whatever directory you choose in your `function.go`. You can do this via
the
following:

```bash
hugo build --destination ../dist
```

Now you can simply `func run` or `func deploy` with the host builder to either
expose your Function locally or on your cluster respectively.

Example of these commands (note that host builder is hidden behind a flag, you
need to enable
it first - this will become the default builder in the future)
```bash
export FUNC_ENABLE_HOST_BUILDER=1
func run --container=false --builder=host
```
Note: We are running without a container because the host builder builds on the
OS system
without a docker containarization app (func bundles up your Function in a
specific way as an archive file to make it into an image).

```bash
export FUNC_ENABLE_HOST_BUILDER=1
func deploy --builder=host
```

#### Convenient Makefile
A Makefile exists for your convenience! It has 2 simple targets - `build` and
`clean`. Once you've edited all hugo files to your liking, use `make build` to
generate the static files in the `dist` directory -- this takes care of the hugo
build step covered previously. The `clean` target is for cleaning out your files
from the `dist` directory in case you would need it.

### Cleanup
Use `make clean` once you want to get rid of all the generated files to have a
clean Functions root directory.

## GLHF!
- Found a mistake in the templates?
- Created a new project with Functions?

Share it with us on
[CNCF Slack](https://cloud-native.slack.com/archives/C04LKEZUXEE)!
17 changes: 17 additions & 0 deletions go/blog/function.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package function

import (
"net/http"
)

type Function struct {
fileserver http.Handler
}

func New() *Function {
return &Function{fileserver: http.FileServer(http.Dir("./dist"))}
}

func (f *Function) Handle(w http.ResponseWriter, r *http.Request) {
f.fileserver.ServeHTTP(w, r)
}
25 changes: 25 additions & 0 deletions go/blog/function_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package function

import (
"net/http"
"net/http/httptest"
"testing"
)

// TestHandle ensures that Handle executes without error and returns the
// HTTP 200 status code indicating no errors.
func TestHandle(t *testing.T) {
var (
f = New()
w = httptest.NewRecorder()
req = httptest.NewRequest("GET", "http://example.com/test", nil)
res *http.Response
)
f.Handle(w, req)
res = w.Result()
defer res.Body.Close()

if res.StatusCode != 200 {
t.Fatalf("unexpected response code: %v", res.StatusCode)
}
}
3 changes: 3 additions & 0 deletions go/blog/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module function

go 1.21
Empty file added go/blog/hugo/.hugo_build.lock
Empty file.
5 changes: 5 additions & 0 deletions go/blog/hugo/archetypes/default.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
+++
date = '{{ .Date }}'
draft = true
title = '{{ replace .File.ContentBaseName "-" " " | title }}'
+++
245 changes: 245 additions & 0 deletions go/blog/hugo/assets/assets/css/main.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
@import url('https://fonts.googleapis.com/css2?family=Literata:ital,opsz,wght@0,7..72,200..900;1,7..72,200..900&display=swap');
@import url('https://fonts.googleapis.com/css2?family=Red+Hat+Mono:ital,wght@0,300..700;1,300..700&display=swap');

body {
background-color: var(--bg-color) !important;
}

body, main {
height: 100%;
font-family: 'Literata', serif !important;
font-optical-sizing: auto;
font-style: normal;
font-size: .95em;
font-weight: normal;
}

::selection {
background: var(--secondary);
color: black;
}

.splash-screen {
height: 100%;
}

nav a, a {
text-decoration: none !important;
}

nav a:hover, a:hover {
text-decoration: underline !important;
}

a {
font-weight: 600;
color: var(--primary-variant) !important;
}

a:hover {
color: var(--primary) !important;
}

@media (min-width: 1200px) {
.container {
max-width: 720px !important;
}
}

table:not(.gist-data *) {
border-collapse: collapse;
margin-top: 1.5rem;
margin-bottom: 1.5rem;
}

@media (min-width: 1200px) {
table:not(.gist-data *) {
width: 100%;
}
}

th:not(.gist-data *),
td:not(.gist-data *) {
padding: .5rem;
text-align: left;
}

th:not(.gist-data *) {
font-weight: bold;
background-color: var(--bg-variant);
}

td:not(.gist-data *) {
border-bottom: 2px solid var(--bg-variant) !important;
}

ul > li:has(input[type=checkbox]) {
list-style-type: none;
}

code {
font-family: 'Red Hat Mono', serif !important;
}

code:not(.highlight *) {
color: var(--secondary);
font-weight: 600;
user-select: all;
}

.highlight > div {
padding: 0 1em;
}

.highlight > pre {
padding: 1em;
}

mark {
background-color: var(--primary-variant) !important;
}

kbd {
background-color: var(--bg-variant) !important;
font-family: 'Red Hat Mono', monospace !important;
font-weight: bold;
}

.post article h1,
.post article h2,
.post article h3,
.post article h4,
.post article h5,
.post article h6 {
font-size: 1.2rem;
margin: 24px 0 10px 0;
font-weight: bold;
}

.post article h1::before {
content: "# ";
color: var(--secondary);
}

.post article h2::before {
content: "## ";
color: var(--secondary);
}

.post article h3::before {
content: "### ";
color: var(--secondary);
}

.post article h4::before {
content: "#### ";
color: var(--secondary);
}

.post article h5::before {
content: "###### ";
color: var(--secondary);
}

.post article h6::before {
content: "###### ";
color: var(--secondary);
}

.breadcrumb-item+.breadcrumb-item::before {
color: #6c757d !important;
}

.tags a:hover {
background-color: var(--primary) !important;
color: #fff !important;
text-decoration: none !important;
}

.underline {
background-image: linear-gradient(to right, var(--secondary), var(--secondary));
background-position: bottom left;
background-repeat: no-repeat;
background-size: 100% 2px;
text-decoration: none !important;
}

figure {
box-sizing: border-box;
display: inline-block;
max-width: 100%;
width: 100%;
text-align: center;
}

figure img {
max-height: 500px;
max-width: 100%;
margin: 0 auto 0 auto;
}

figure h4 {
margin-bottom: 1em;
font-size: 0.85rem !important;
font-weight: lighter !important;
position: relative;
overflow: hidden;
opacity: 0.9;
}

figure h4::before {
content: '' !important;
}

/* Cool blockquote style from catalinred */
blockquote {
padding-left: 3rem !important;
position: relative;
overflow: hidden;

&::before,
&::after{
position: absolute;
color: #777;
}

&::before {
content: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='%23777777'><path d='M9.983 3v7.391C9.983 16.095 6.252 19.961 1 21l-.995-2.151C2.437 17.932 4 15.211 4 13H0V3h9.983zM24 3v7.391c0 5.704-3.748 9.571-9 10.609l-.996-2.151C16.437 17.932 18 15.211 18 13h-3.983V3H24z'/></svg>");
left: 15px;
}

&::after {
content: "";
left: 20px;
top: 25px;
width: 1px;
height: 100%;
background-color: currentColor;
}

p {
margin: 0;
}

p + p {
margin-top: 1rem;
}
}

.twitter-tweet, .instagram-media {
margin-right: auto !important;
margin-left: auto !important;
}

.post-summary {
margin: 0;
}

ul:has(input[type=checkbox]) {
margin-left: 0 !important;
padding-left: 0.5rem !important;
}

li > input[type=checkbox] {
margin-right: 0.2rem;
}
Loading
Loading