Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Go tutorial and reference #723

Merged
merged 67 commits into from
Nov 27, 2024
Merged
Show file tree
Hide file tree
Changes from 40 commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
e74cf0c
Go tutorial and reference
javierdelapuente Oct 2, 2024
90de295
Merge branch 'main' into go-tutorial
javierdelapuente Oct 2, 2024
5e9bcc8
Run pipeline
javierdelapuente Oct 3, 2024
f00280e
minor improvements to the go docs
javierdelapuente Oct 3, 2024
26731a0
Merge branch 'main' into go-tutorial
javierdelapuente Oct 3, 2024
c454a84
Add --fail to all curl commands
javierdelapuente Oct 4, 2024
cd58c67
Merge branch 'go-tutorial' of github.com:javierdelapuente/rockcraft i…
javierdelapuente Oct 4, 2024
6215c1d
tutorial fixes
javierdelapuente Oct 4, 2024
db4666b
Replace second part of the tutorial with a new endpoint
javierdelapuente Oct 4, 2024
42166ce
Add missing space
javierdelapuente Oct 4, 2024
cbce355
update to ubuntu 24.04
javierdelapuente Oct 4, 2024
c810f0f
minor corrections
javierdelapuente Oct 4, 2024
4a97758
shorten line
javierdelapuente Oct 4, 2024
87db8a2
Fixes and improvements
javierdelapuente Oct 8, 2024
73b9e13
Merge branch 'main' into go-tutorial
javierdelapuente Oct 8, 2024
8e4f4b3
Apply suggestions from code review
javierdelapuente Oct 9, 2024
fb1062a
Merge branch 'main' into go-tutorial
javierdelapuente Oct 9, 2024
a529914
Remove unneeded go mod tidy
javierdelapuente Oct 9, 2024
5527e67
Run ci
javierdelapuente Oct 9, 2024
a4fc3d1
Replace you with we and remove Ubuntu version dependency
javierdelapuente Oct 10, 2024
f1a3f93
go mod init before creating the main.go file
javierdelapuente Oct 10, 2024
5784740
go-framework and typo
javierdelapuente Oct 10, 2024
19d83ea
Run docker as a regular user
javierdelapuente Oct 10, 2024
db56bc7
Link to pebble docs in the first occurrence
javierdelapuente Oct 10, 2024
3c8603c
quote sudo
javierdelapuente Oct 10, 2024
e0ba7da
intermediate cleanup -> stop the application
javierdelapuente Oct 10, 2024
6c7da80
add next steps part
javierdelapuente Oct 10, 2024
d845408
Merge branch 'main' into go-tutorial
javierdelapuente Oct 10, 2024
0d69b10
typo
javierdelapuente Oct 10, 2024
12750a2
Merge branch 'main' into go-tutorial
javierdelapuente Oct 14, 2024
4f61ced
Merge branch 'main' into go-tutorial
javierdelapuente Oct 15, 2024
e84fe5f
Apply suggestions from code review
javierdelapuente Oct 17, 2024
7a92aa6
Merge branch 'main' into go-tutorial
javierdelapuente Oct 17, 2024
b7f5653
update link as the other tutorials
javierdelapuente Oct 18, 2024
b22fabf
suggestions from code review
javierdelapuente Oct 22, 2024
1e9d175
Merge branch 'main' into go-tutorial
javierdelapuente Oct 23, 2024
16eb379
Update docs/reference/extensions/go-framework.rst
javierdelapuente Oct 23, 2024
79d8765
Merge branch 'main' into go-tutorial
javierdelapuente Oct 24, 2024
7aca5d7
Merge branch 'main' into go-tutorial
javierdelapuente Nov 7, 2024
d5fb848
Suggestion for rewording about the http server create by the go app
javierdelapuente Nov 12, 2024
4e5f93f
Merge branch 'main' into go-tutorial
javierdelapuente Nov 14, 2024
ef88a60
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
b83026d
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
6993978
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
e61d3df
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
1e343c5
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
c6759cd
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
c548bd2
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
a686246
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
f48f04a
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
82746c9
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
f489aeb
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
581a7c3
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
5a27628
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
2a8e6a8
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
4666ce7
Address comments in code review
javierdelapuente Nov 14, 2024
a0b3214
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
5960832
Update docs/tutorial/go.rst
javierdelapuente Nov 14, 2024
c0c3293
experimental in the beginning of the tutorial. minor rearrangement
javierdelapuente Nov 16, 2024
60a8503
Add information about the estimated time and skills required acquired
javierdelapuente Nov 16, 2024
72dd047
remove note on amd64 and the bare base
javierdelapuente Nov 16, 2024
07e663a
Merge branch 'main' into go-tutorial
javierdelapuente Nov 21, 2024
8eaeca9
Update docs/tutorial/go.rst
javierdelapuente Nov 21, 2024
dea57fc
Update docs/tutorial/go.rst
javierdelapuente Nov 21, 2024
b8e9675
Merge branch 'main' into go-tutorial
javierdelapuente Nov 21, 2024
626f295
Merge branch 'main' into go-tutorial
javierdelapuente Nov 25, 2024
6104436
Merge branch 'main' into go-tutorial
javierdelapuente Nov 27, 2024
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
71 changes: 71 additions & 0 deletions docs/reference/extensions/go-framework.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
.. _go-framework-reference:

go-framework
----------------

The Go extension streamlines the process of building Go application
rocks.

The extension builds and copies the Go binary file to the rock.
By default, the base ``bare`` is used, to generate a lightweight image.


.. note::
The Go extension is compatible with the ``bare`` and ``[email protected]``
bases.

Project requirements
====================

To use the ``go-framework`` extension, there must be a ``go.mod`` file
in the root directory of the project.


``parts`` > ``go-framework/install-app`` > ``organize``
=========================================================

If the main package is in the base directory and the rockcraft name
attribute is equal to the go module name, the name of the binary will
be selected correctly, otherwise you will need to adjust it.

You can use this field to specify a different binary to be used as the
main application, without having to override the service command. For example,
if your Go application contains a ``main`` package in the directory
``cmd/anotherserver``, the name of the binary will be ``anotherserver``
and you can override the main application to use the binary with the
next snippet:

.. code-block:: yaml

parts:
go-framework/install-app:
organize:
bin/anotherserver: usr/local/bin/<rockcraft project name>
javierdelapuente marked this conversation as resolved.
Show resolved Hide resolved


``parts`` > ``go-framework/assets`` > ``stage``
=========================================================


Some files, if they exist in the project root, are included by
default in the rock in the ``/app`` directory. These include:
``migrate``, ``migrate.sh``, ``templates/`` and ``static/``.

You can customise the files to include by overriding the ``stage`` property
of the ``go-framework/assets`` part:

.. code-block:: yaml

parts:
go-framework/assets:
stage:
- app/migrate
- app/migrate.sh
- app/static
- app/another_file_or_directory


Useful links
============

- :ref:`build-a-rock-for-a-go-application`
1 change: 1 addition & 0 deletions docs/reference/extensions/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,4 @@ initiating a new rock.
flask-framework
django-framework
fastapi-framework
go-framework
8 changes: 8 additions & 0 deletions docs/reuse/tutorial/code/task.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,11 @@ execute: |
# [docs:install-docker]
sudo snap install docker
# [docs:install-docker-end]

# [docs:docker-regular-user]
sudo addgroup --system docker
sudo adduser $USER docker
newgrp docker
sudo snap disable docker
sudo snap enable docker
# [docs:docker-regular-user-end]
35 changes: 22 additions & 13 deletions docs/reuse/tutorial/setup.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
We recommend starting from a clean Ubuntu 22.04 installation. If you don't have
one available, you can create one using `Multipass`_:
We recommend starting from a clean Ubuntu installation. If we don't have
one available, we can create one using `Multipass`_:

.. tabs::

Expand All @@ -11,9 +11,9 @@ one available, you can create one using `Multipass`_:

snap services multipass

If you see the ``multipass`` service but it isn't "active", then you'll
need to run ``sudo snap start multipass``. On the other hand, if you get
an error saying ``snap "multipass" not found``, then you must install
If we see the ``multipass`` service but it isn't "active", then we'll
need to run ``sudo snap start multipass``. On the other hand, if we get
an error saying ``snap "multipass" not found``, then we must install
`Multipass <install-multipass_>`_:

.. code-block:: bash
Expand All @@ -30,11 +30,11 @@ one available, you can create one using `Multipass`_:
See `Multipass installation instructions <install-multipass_>`_, switch
to macOS in the drop down.

Then you can create the VM with the following command:
Then we can create the VM with the following command:

.. code-block:: text

multipass launch --disk 10G --name rock-dev 22.04
multipass launch --disk 10G --name rock-dev 24.04

Finally, once the VM is up, open a shell into it:

Expand All @@ -52,31 +52,40 @@ and initialised:
sudo snap install lxd
lxd init --auto

In order to create the rock, you'll need to install Rockcraft:
In order to create the rock, we'll need to install Rockcraft:

.. literalinclude:: /reuse/tutorial/code/task.yaml
:language: bash
:start-after: [docs:install-rockcraft]
:end-before: [docs:install-rockcraft-end]
:dedent: 2

We'll use Docker to run the rock. You can install it as a ``snap``:
We'll use Docker to run the rock. We can install it as a ``snap``:

.. literalinclude:: /reuse/tutorial/code/task.yaml
:language: bash
:start-after: [docs:install-docker]
:end-before: [docs:install-docker-end]
:dedent: 2

By default, Docker is only accessible with root privileges (``sudo``). We want
to be able to use Docker commands as a regular user:

.. literalinclude:: /reuse/tutorial/code/task.yaml
:language: bash
:start-after: [docs:docker-regular-user]
:end-before: [docs:docker-regular-user-end]
:dedent: 2

.. warning::
There is a `known connectivity issue with LXD and Docker
<lxd-docker-connectivity-issue_>`_. If you see a
<lxd-docker-connectivity-issue_>`_. If we see a
networking issue such as "*A network related operation failed in a context
of no network access*", make sure you apply one of the fixes suggested
of no network access*", make sure to apply one of the suggested fixes
`here <lxd-docker-connectivity-issue_>`_.

Note that you'll also need a text editor. You can either install one of your
choice or simply use one of the already existing editors in your Ubuntu
Note that we'll also need a text editor. We can either install one of our
choice or simply use one of the already existing editors in the Ubuntu
environment (like ``vi``).

.. _`lxd-docker-connectivity-issue`: https://documentation.ubuntu.com/lxd/en/latest/howto/network_bridge_firewalld/#prevent-connectivity-issues-with-lxd-and-docker
Expand Down
18 changes: 18 additions & 0 deletions docs/tutorial/code/go/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package main

import (
"fmt"
"log"
"net/http"
)

func helloWorldHandler(w http.ResponseWriter, req *http.Request) {
log.Printf("new hello world request")
fmt.Fprintln(w, "Hello, world!")
}

func main() {
log.Printf("starting hello world application")
http.HandleFunc("/", helloWorldHandler)
http.ListenAndServe(":8000", nil)
}
26 changes: 26 additions & 0 deletions docs/tutorial/code/go/main.go.time
javierdelapuente marked this conversation as resolved.
Show resolved Hide resolved
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package main

import (
"fmt"
"log"
"net/http"
"time"
)

func helloWorldHandler(w http.ResponseWriter, req *http.Request) {
log.Printf("new hello world request")
fmt.Fprintln(w, "Hello, world!")
}

func timeHandler(w http.ResponseWriter, req *http.Request) {
log.Printf("new time request")
now := time.Now()
fmt.Fprintln(w, now.Format(time.DateTime))
}

func main() {
log.Printf("starting hello world application")
http.HandleFunc("/", helloWorldHandler)
http.HandleFunc("/time", timeHandler)
http.ListenAndServe(":8000", nil)
}
109 changes: 109 additions & 0 deletions docs/tutorial/code/go/task.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
###########################################
# IMPORTANT
# Comments matter!
# The docs use the wrapping comments as
# markers for including said instructions
# as snippets in the docs.
###########################################
summary: Getting started with Go tutorial

environment:

execute: |
set -x
# [docs:install-go]
sudo snap install go --classic
# [docs:install-go-end]

# [docs:mod-init-go]
go mod init go-hello-world
# [docs:mod-init-go-end]

# [docs:go-build]
go build .
# [docs:go-build-end]

./go-hello-world &
retry -n 5 --wait 2 curl --fail localhost:8000

# [docs:curl-go]
curl --fail localhost:8000
# [docs:curl-go-end]

kill $!

# [docs:create-rockcraft-yaml]
rockcraft init --profile go-framework
# [docs:create-rockcraft-yaml-end]
sed -i "s/name: .*/name: go-hello-world/g" rockcraft.yaml

# [docs:pack]
ROCKCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS=true rockcraft pack
# [docs:pack-end]

# [docs:ls-rock]
ls *.rock -l --block-size=MB
# [docs:ls-rock-end]

# [docs:skopeo-copy]
rockcraft.skopeo --insecure-policy \
copy oci-archive:go-hello-world_0.1_amd64.rock \
docker-daemon:go-hello-world:0.1
# [docs:skopeo-copy-end]

# [docs:docker-images]
docker images go-hello-world:0.1
# [docs:docker-images-end]

# [docs:docker-run]
docker run --rm -d -p 8000:8000 \
--name go-hello-world go-hello-world:0.1
# [docs:docker-run-end]

retry -n 5 --wait 2 curl --fail localhost:8000
# [docs:curl-go-rock]
curl --fail localhost:8000
# [docs:curl-go-rock-end]
[ "$(curl localhost:8000)" = "Hello, world!" ]

# [docs:get-logs]
docker exec go-hello-world pebble logs go
# [docs:get-logs-end]

# [docs:stop-docker]
docker stop go-hello-world
docker rmi go-hello-world:0.1
# [docs:stop-docker-end]

## Part 2 of the tutorial
sed -i "s/version: .*/version: 0.2/g" rockcraft.yaml

cp main.go.time main.go

# [docs:docker-run-update]
ROCKCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS=true rockcraft pack
rockcraft.skopeo --insecure-policy \
copy oci-archive:go-hello-world_0.2_amd64.rock \
docker-daemon:go-hello-world:0.2
docker images go-hello-world:0.2
docker run --rm -d -p 8000:8000 \
--name go-hello-world go-hello-world:0.2
# [docs:docker-run-update-end]
retry -n 5 --wait 2 curl --fail localhost:8000

# [docs:curl-time]
curl --fail localhost:8000/time
# [docs:curl-time-end]
[ "$(curl localhost:8000/time)" != "Hello, world!" ]

# [docs:stop-docker-updated]
docker stop go-hello-world
docker rmi go-hello-world:0.2
# [docs:stop-docker-updated-end]

# [docs:cleanup]
# delete all the files created during the tutorial
rm go.mod rockcraft.yaml main.go go-hello-world \
go-hello-world_0.1_amd64.rock \
go-hello-world_0.2_amd64.rock
# [docs:cleanup-end]
Loading
Loading