14
Dockerfile
|
@ -1,4 +1,16 @@
|
|||
FROM xena/christine.website:1.1-47-g3228e3b
|
||||
FROM xena/go:1.10 AS build
|
||||
COPY . /root/go/src/github.com/Xe/site
|
||||
RUN CGO_ENABLED=0 GOBIN=/root go install github.com/Xe/site/cmd/site
|
||||
|
||||
FROM xena/alpine
|
||||
EXPOSE 5000
|
||||
RUN apk add --no-cache bash
|
||||
COPY --from=build /root/site /site/site
|
||||
COPY ./static2 /site/static
|
||||
COPY ./templates /site/templates
|
||||
COPY ./blog /site/blog
|
||||
COPY ./css /site/css
|
||||
COPY ./run.sh /site/run.sh
|
||||
|
||||
HEALTHCHECK CMD curl --fail http://127.0.0.1:5000 || exit 1
|
||||
CMD /site/run.sh
|
||||
|
|
36
box.rb
|
@ -1,36 +0,0 @@
|
|||
from "xena/go:1.10"
|
||||
|
||||
### Copy files
|
||||
run "mkdir -p /site"
|
||||
|
||||
def put(file)
|
||||
copy "./#{file}", "/site/#{file}"
|
||||
end
|
||||
|
||||
files = [
|
||||
"gops.go",
|
||||
"hash.go",
|
||||
"html.go",
|
||||
"main.go",
|
||||
"rss.go",
|
||||
"run.sh",
|
||||
"templates",
|
||||
"blog",
|
||||
"rice-box.go"
|
||||
]
|
||||
|
||||
files.each { |x| put x }
|
||||
|
||||
copy "vendor/", "/root/go/src/"
|
||||
|
||||
### Build
|
||||
run "cd /site && go build -v"
|
||||
|
||||
### Cleanup
|
||||
run %q[ rm -rf /root/go /site/backend /root/sdk /site/*.go ]
|
||||
run %q[ rm -rf /usr/local/bin/go* ]
|
||||
|
||||
cmd "/site/run.sh"
|
||||
|
||||
flatten
|
||||
tag "xena/christine.website"
|
|
@ -12,7 +12,6 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/GeertJohan/go.rice"
|
||||
"github.com/Xe/jsonfeed"
|
||||
"github.com/Xe/ln"
|
||||
"github.com/gorilla/feeds"
|
||||
|
@ -135,17 +134,12 @@ func Build() (*Site, error) {
|
|||
|
||||
sort.Sort(sort.Reverse(s.Posts))
|
||||
|
||||
cb, err := rice.FindBox("css")
|
||||
resumeData, err := ioutil.ReadFile("./static/resume/resume.md")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
sb, err := rice.FindBox("static")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.Resume = template.HTML(blackfriday.Run(sb.MustBytes("resume/resume.md")))
|
||||
s.Resume = template.HTML(blackfriday.Run(resumeData))
|
||||
|
||||
for _, item := range s.Posts {
|
||||
itime, _ := time.Parse("2006-01-02", item.Date)
|
||||
|
@ -174,8 +168,8 @@ func Build() (*Site, error) {
|
|||
s.mux.HandleFunc("/blog.atom", s.createAtom)
|
||||
s.mux.HandleFunc("/blog.json", s.createJsonFeed)
|
||||
s.mux.HandleFunc("/blog/", s.showPost)
|
||||
s.mux.Handle("/static/", http.StripPrefix("/static/", http.FileServer(sb.HTTPBox())))
|
||||
s.mux.Handle("/css/", http.StripPrefix("/css/", http.FileServer(cb.HTTPBox())))
|
||||
s.mux.Handle("/css/", http.FileServer(http.Dir(".")))
|
||||
s.mux.Handle("/static/", http.FileServer(http.Dir(".")))
|
||||
|
||||
return s, nil
|
||||
}
|
80
mage.go
|
@ -1,80 +0,0 @@
|
|||
// +build mage
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/magefile/mage/mg"
|
||||
)
|
||||
|
||||
func do(cmd string, args ...string) {
|
||||
shouldWork(context.Background(), nil, wd, cmd, args...)
|
||||
}
|
||||
|
||||
// Setup installs the tools that other parts of the build process depend on.
|
||||
func Setup(ctx context.Context) {
|
||||
// go tools
|
||||
do("go", "get", "-u", "-v", "github.com/GeertJohan/go.rice/rice")
|
||||
|
||||
do("git", "remote", "add", "dokku", "dokku@minipaas.xeserv.us")
|
||||
}
|
||||
|
||||
// Generate runs all of the code generation.
|
||||
func Generate(ctx context.Context) {
|
||||
shouldWork(ctx, nil, wd, "rice", "embed-go")
|
||||
}
|
||||
|
||||
// Docker creates the docker image xena/christine.website using box(1).
|
||||
func Docker() {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
mg.Deps(Generate)
|
||||
|
||||
shouldWork(ctx, nil, wd, "box", "box.rb")
|
||||
}
|
||||
|
||||
// Deploy does the work needed to deploy this image to the dokku server.
|
||||
func Deploy(ctx context.Context) error {
|
||||
mg.Deps(Docker)
|
||||
|
||||
tag, err := gitTag()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
do("docker", "tag", "xena/christine.website", "xena/christine.website:"+tag)
|
||||
do("docker", "push", "xena/christine.website:"+tag)
|
||||
|
||||
const dockerfileTemplate = `FROM xena/christine.website:${VERSION}
|
||||
EXPOSE 5000
|
||||
RUN apk add --no-cache bash
|
||||
CMD /site/run.sh`
|
||||
data := os.Expand(dockerfileTemplate, func(inp string) string {
|
||||
switch inp {
|
||||
case "VERSION":
|
||||
return tag
|
||||
default:
|
||||
return "<unknown arg " + inp + ">"
|
||||
}
|
||||
})
|
||||
|
||||
os.Remove("Dockerfile")
|
||||
fout, err := os.Create("Dockerfile")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fmt.Fprintln(fout, data)
|
||||
fout.Close()
|
||||
|
||||
do("git", "add", "Dockerfile")
|
||||
do("git", "commit", "-m", "Dockerfile: update for deployment of version "+tag)
|
||||
do("git", "push", "dokku", "master")
|
||||
do("git", "push")
|
||||
|
||||
return nil
|
||||
}
|
|
@ -1,75 +0,0 @@
|
|||
// +build mage
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"strings"
|
||||
|
||||
"github.com/jtolds/qod"
|
||||
"github.com/pkg/errors"
|
||||
)
|
||||
|
||||
var wd string
|
||||
|
||||
func init() {
|
||||
lwd, err := os.Getwd()
|
||||
qod.ANE(err)
|
||||
|
||||
wd = lwd
|
||||
}
|
||||
|
||||
// must end in a slash
|
||||
const pkgBase = "github.com/Xe/site/"
|
||||
|
||||
func output(cmd string, args ...string) (string, error) {
|
||||
c := exec.Command(cmd, args...)
|
||||
c.Env = os.Environ()
|
||||
c.Stderr = os.Stderr
|
||||
b, err := c.Output()
|
||||
if err != nil {
|
||||
return "", errors.Wrapf(err, `failed to run %v %q`, cmd, args)
|
||||
}
|
||||
return string(b), nil
|
||||
}
|
||||
|
||||
func gitTag() (string, error) {
|
||||
s, err := output("git", "describe", "--tags")
|
||||
if err != nil {
|
||||
ee, ok := errors.Cause(err).(*exec.ExitError)
|
||||
if ok && ee.Exited() {
|
||||
// probably no git tag
|
||||
return "dev", nil
|
||||
}
|
||||
return "", err
|
||||
}
|
||||
|
||||
return strings.TrimSuffix(s, "\n"), nil
|
||||
}
|
||||
|
||||
func shouldWork(ctx context.Context, env []string, dir string, cmdName string, args ...string) {
|
||||
loc, err := exec.LookPath(cmdName)
|
||||
qod.ANE(err)
|
||||
|
||||
cmd := exec.CommandContext(ctx, loc, args...)
|
||||
cmd.Dir = dir
|
||||
cmd.Env = append(env, os.Environ()...)
|
||||
|
||||
cmd.Stdout = os.Stdout
|
||||
cmd.Stderr = os.Stderr
|
||||
|
||||
log.Printf("starting process, env: %v, pwd: %s, cmd: %s, args: %v", env, dir, loc, args)
|
||||
err = cmd.Run()
|
||||
qod.ANE(err)
|
||||
}
|
||||
|
||||
func goBuild(ctx context.Context, env []string, dir string, pkgname string) {
|
||||
shouldWork(ctx, env, dir, "go", "build", "-v", pkgBase+pkgname)
|
||||
}
|
||||
|
||||
func goInstall(ctx context.Context, env []string, pkgname string) {
|
||||
shouldWork(ctx, nil, wd, "go", "install", pkgBase+pkgname)
|
||||
}
|
365
rice-box.go
|
@ -0,0 +1,7 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
docker build .
|
||||
git push dokku master
|
|
@ -0,0 +1,6 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
set -x
|
||||
|
||||
git remote add dokku dooku@minipaas.xeserv.us:christine
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
Before Width: | Height: | Size: 3.0 KiB After Width: | Height: | Size: 3.0 KiB |
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.1 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 6.1 KiB |
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.5 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.7 KiB After Width: | Height: | Size: 2.7 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 5.9 KiB |
Before Width: | Height: | Size: 144 KiB After Width: | Height: | Size: 144 KiB |
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 89 KiB |
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 41 KiB |