refactor: replace make with mage
This commit removes the Makefile and uses mage to build the CV files and Docker images. Changes include: - All make targets are re-written in go in magefile.go - The spellcheck script is now written in go and is part of the magefile - Created mage.go to remove dependency on a mage binary - Updated CI pipelines to use mage - Removed unused Makefile - Removed unused spellcheck bash script - Cleaned up .gitignore - Updated .aspell/.aspell.en.pws NOTE: The updated pipeline for generating the docker image is untested for this MR.
This commit is contained in:
parent
64e3560d69
commit
5fd72b045a
10 changed files with 175 additions and 119 deletions
|
@ -1,4 +1,4 @@
|
||||||
personal_ws-1.1 en 50
|
personal_ws-1.1 en 52
|
||||||
Alertmanager
|
Alertmanager
|
||||||
Anglin
|
Anglin
|
||||||
Ansible
|
Ansible
|
||||||
|
|
3
.gitignore
vendored
3
.gitignore
vendored
|
@ -1,5 +1,2 @@
|
||||||
__output/*
|
__output/*
|
||||||
!__output/cv.pdf
|
!__output/cv.pdf
|
||||||
tags
|
|
||||||
notes.txt
|
|
||||||
aspell_output
|
|
||||||
|
|
|
@ -1,79 +0,0 @@
|
||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -euo pipefail
|
|
||||||
|
|
||||||
ASPELL_LANG='en_GB'
|
|
||||||
ASPELL_PERSONAL_WORDLIST='./.aspell/.aspell.en.pws'
|
|
||||||
DEFAULT_OUTPUT='aspell_output'
|
|
||||||
|
|
||||||
RED='\033[1;31m'
|
|
||||||
AMBER='\033[1;33m'
|
|
||||||
GREEN='\033[1;32m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
inputFile=''
|
|
||||||
outputFile=''
|
|
||||||
|
|
||||||
usage () {
|
|
||||||
echo "Usage:"
|
|
||||||
echo "spellcheck [OPTION]..."
|
|
||||||
echo
|
|
||||||
echo "Description:"
|
|
||||||
echo -e "\tspellcheck is a wrapper script that uses aspell to check the spelling of"
|
|
||||||
echo -e "\tall words in a file. Any detected spelling errors are printed to screen"
|
|
||||||
echo -e "\tand to an output file."
|
|
||||||
echo
|
|
||||||
echo "Options:"
|
|
||||||
echo -e "\t-i\tinput file for spell checking."
|
|
||||||
echo -e "\t-o\toutput file where list of spelling errors are written to."
|
|
||||||
echo -e "\t\tThe default output file is ${DEFAULT_OUTPUT}."
|
|
||||||
echo -e "\t-h\tprints usage."
|
|
||||||
echo
|
|
||||||
echo -e "Examples:"
|
|
||||||
echo -e "\tspellcheck -i my_file.txt -o output.txt"
|
|
||||||
echo -e "\tspellcheck -i my_file"
|
|
||||||
}
|
|
||||||
|
|
||||||
validate_args() {
|
|
||||||
if [ -z "$inputFile" ]; then
|
|
||||||
echo -e "${RED}ERROR: ${NC}Option '-i' is not set or is empty."
|
|
||||||
usage
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$outputFile" ]; then
|
|
||||||
echo -e "${AMBER}WARNING: ${NC}Option '-o' is not set or is empty. The output file will be set to ${DEFAULT_OUTPUT}"
|
|
||||||
outputFile=${DEFAULT_OUTPUT}
|
|
||||||
fi
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
spellcheck() {
|
|
||||||
cat ${inputFile} | aspell -d ${ASPELL_LANG} -p ${ASPELL_PERSONAL_WORDLIST} list > ${outputFile}
|
|
||||||
|
|
||||||
let spellingErrors=$( cat ${outputFile} | wc -l )
|
|
||||||
if [ $spellingErrors -gt 0 ]; then
|
|
||||||
echo
|
|
||||||
echo -e "${RED}ERROR: ${NC}The following spelling errors were found in ${inputFile}:"
|
|
||||||
cat ${outputFile}
|
|
||||||
return 1
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
echo -e "${GREEN}INFO: ${NC}No spelling errors found."
|
|
||||||
fi
|
|
||||||
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
while getopts 'i:o:h' flag; do
|
|
||||||
case "${flag}" in
|
|
||||||
i) inputFile=${OPTARG} ;;
|
|
||||||
o) outputFile=${OPTARG} ;;
|
|
||||||
h) usage && exit 0 ;;
|
|
||||||
*) usage && exit 2 ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
validate_args || exit 1
|
|
||||||
spellcheck || exit 1
|
|
|
@ -27,13 +27,13 @@
|
||||||
test:spellcheck:
|
test:spellcheck:
|
||||||
before_script:
|
before_script:
|
||||||
- apt-get update
|
- apt-get update
|
||||||
- apt-get -y install aspell make
|
- apt-get -y install aspell aspell-en
|
||||||
extends:
|
extends:
|
||||||
- .cv-test-rules
|
- .cv-test-rules
|
||||||
image: ubuntu:18.04
|
- .use-cv-builder
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- make spellcheck
|
- go run mage.go spellcheck
|
||||||
|
|
||||||
test:pdf:
|
test:pdf:
|
||||||
artifacts:
|
artifacts:
|
||||||
|
@ -45,7 +45,7 @@ test:pdf:
|
||||||
- .cv-test-rules
|
- .cv-test-rules
|
||||||
stage: test
|
stage: test
|
||||||
script:
|
script:
|
||||||
- make clean pdf
|
- go run mage.go pdf
|
||||||
|
|
||||||
publish:pdf:
|
publish:pdf:
|
||||||
extends:
|
extends:
|
||||||
|
@ -62,7 +62,7 @@ publish:pdf:
|
||||||
- git config --global user.name "${GITLAB_USER_NAME}"
|
- git config --global user.name "${GITLAB_USER_NAME}"
|
||||||
stage: publish
|
stage: publish
|
||||||
script:
|
script:
|
||||||
- make clean pdf
|
- go run mage.go pdf
|
||||||
- git checkout master
|
- git checkout master
|
||||||
- git add __output/cv.pdf
|
- git add __output/cv.pdf
|
||||||
- 'git commit -m "auto: [skip ci] update CV."'
|
- 'git commit -m "auto: [skip ci] update CV."'
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
services:
|
services:
|
||||||
- docker:19.03.12-dind
|
- docker:19.03.12-dind
|
||||||
before_script:
|
before_script:
|
||||||
- apk add --no-cache make
|
- apk add --no-cache go
|
||||||
|
|
||||||
.dockerfile-lint:
|
.dockerfile-lint:
|
||||||
stage: test
|
stage: test
|
||||||
|
@ -29,7 +29,7 @@
|
||||||
stage: publish
|
stage: publish
|
||||||
extends: .docker-build-setup
|
extends: .docker-build-setup
|
||||||
before_script:
|
before_script:
|
||||||
- apk add --no-cache make
|
- apk add --no-cache go
|
||||||
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
|
- docker login -u ${CI_REGISTRY_USER} -p ${CI_REGISTRY_PASSWORD} ${CI_REGISTRY}
|
||||||
after_script:
|
after_script:
|
||||||
- docker logout ${CI_REGISTRY}
|
- docker logout ${CI_REGISTRY}
|
||||||
|
@ -55,11 +55,11 @@ test:docker:build:
|
||||||
- .dockerbuild-test
|
- .dockerbuild-test
|
||||||
- .docker-test-rules
|
- .docker-test-rules
|
||||||
script:
|
script:
|
||||||
- make image
|
- go run mage.go image
|
||||||
|
|
||||||
publish:docker-image:
|
publish:docker-image:
|
||||||
extends:
|
extends:
|
||||||
- .docker-publish-pre-post
|
- .docker-publish-pre-post
|
||||||
- .docker-publish-rules
|
- .docker-publish-rules
|
||||||
script:
|
script:
|
||||||
- make publish
|
- go run mage.go publishImage
|
||||||
|
|
27
Makefile
27
Makefile
|
@ -1,27 +0,0 @@
|
||||||
DOCKERFILE = ./docker/Dockerfile
|
|
||||||
IMAGE_NAME ?= cv-builder
|
|
||||||
IMAGE_TAG ?= latest
|
|
||||||
OUTPUT_DIR = __output/
|
|
||||||
CV_DATA_FILE = ./data/cv.json
|
|
||||||
|
|
||||||
.PHONY: all image publish tex pdf clean
|
|
||||||
|
|
||||||
all: pdf
|
|
||||||
|
|
||||||
image:
|
|
||||||
@docker build -f $(DOCKERFILE) -t $(IMAGE_NAME):$(IMAGE_TAG) .
|
|
||||||
|
|
||||||
publish: image
|
|
||||||
@docker push $(IMAGE_NAME):$(IMAGE_TAG)
|
|
||||||
|
|
||||||
spellcheck:
|
|
||||||
@./.gitlab/ci/bin/spellcheck -i $(CV_DATA_FILE)
|
|
||||||
|
|
||||||
tex:
|
|
||||||
@go run .
|
|
||||||
|
|
||||||
pdf: tex
|
|
||||||
@mtxrun --path=$(OUTPUT_DIR) --script context cv.tex
|
|
||||||
|
|
||||||
clean:
|
|
||||||
@rm -rf $(OUTPUT_DIR)
|
|
2
go.mod
2
go.mod
|
@ -1,3 +1,5 @@
|
||||||
module gitlab.com/dananglin/cv
|
module gitlab.com/dananglin/cv
|
||||||
|
|
||||||
go 1.12
|
go 1.12
|
||||||
|
|
||||||
|
require github.com/magefile/mage v1.10.0
|
||||||
|
|
2
go.sum
Normal file
2
go.sum
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
github.com/magefile/mage v1.10.0 h1:3HiXzCUY12kh9bIuyXShaVe529fJfyqoVM42o/uom2g=
|
||||||
|
github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
|
13
mage.go
Normal file
13
mage.go
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/magefile/mage/mage"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
os.Exit(mage.Main())
|
||||||
|
}
|
148
magefile.go
Normal file
148
magefile.go
Normal file
|
@ -0,0 +1,148 @@
|
||||||
|
// +build mage
|
||||||
|
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/magefile/mage/mg"
|
||||||
|
"github.com/magefile/mage/sh"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
aspellLang string = "en_GB"
|
||||||
|
aspellPersonalWordlist string = "./.aspell/.aspell.en.pws"
|
||||||
|
cvJsonDataFile string = "./data/cv.json"
|
||||||
|
defaultImageName string = "cv-builder"
|
||||||
|
defaultImageTag string = "latest"
|
||||||
|
dockerfile string = "./docker/Dockerfile"
|
||||||
|
outputDir string = "./__output"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Default sets the default target.
|
||||||
|
var Default = Pdf
|
||||||
|
|
||||||
|
// SpellCheck checks the CV JSON file for spelling errors. If there are any
|
||||||
|
// misspelt words found the function returns a list of those words in an error.
|
||||||
|
// Any error found while gathering the list is returned.
|
||||||
|
// This function depends on the aspell program.
|
||||||
|
func SpellCheck() error {
|
||||||
|
fmt.Printf("Reading data from %s...\n", cvJsonDataFile)
|
||||||
|
|
||||||
|
data, err := ioutil.ReadFile(cvJsonDataFile)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to read data from %s, %s", cvJsonDataFile, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// declare the aspell command and its standard input pipe.
|
||||||
|
cmd := exec.Command("aspell", "-d", aspellLang, "-p", aspellPersonalWordlist, "list")
|
||||||
|
stdin, err := cmd.StdinPipe()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// write the CV data to standard input for piping.
|
||||||
|
go func() {
|
||||||
|
defer stdin.Close()
|
||||||
|
io.WriteString(stdin, string(data))
|
||||||
|
}()
|
||||||
|
|
||||||
|
// run aspell and get the list of mispelt words (if any).
|
||||||
|
// (the output is a string.)
|
||||||
|
fmt.Println("Running aspell...")
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
list := strings.Split(string(out), "\n")
|
||||||
|
if list[len(list)-1] == "" {
|
||||||
|
list = list[:len(list)-1]
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(list) > 0 {
|
||||||
|
var b strings.Builder
|
||||||
|
errMsg := fmt.Sprintf("the following spelling errors were found in %s:", cvJsonDataFile)
|
||||||
|
b.WriteString(errMsg)
|
||||||
|
|
||||||
|
for _, v := range list {
|
||||||
|
s := "\n- " + v
|
||||||
|
b.WriteString(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
return fmt.Errorf(b.String())
|
||||||
|
} else {
|
||||||
|
fmt.Println("No spelling errors were found.")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tex takes the CV data file and generates the output tex file from
|
||||||
|
// template.
|
||||||
|
func Tex() error {
|
||||||
|
fmt.Println("Generating the tex file...")
|
||||||
|
mg.Deps(Clean)
|
||||||
|
|
||||||
|
gocmd := mg.GoCmd()
|
||||||
|
return sh.Run(gocmd, "run", ".")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pdf takes the output tex file generated by the Tex target and
|
||||||
|
// generates the output PDF file.
|
||||||
|
func Pdf() error {
|
||||||
|
mg.Deps(Tex)
|
||||||
|
|
||||||
|
pathArg := "--path=" + outputDir
|
||||||
|
|
||||||
|
fmt.Println("Generating the PDF file...")
|
||||||
|
return sh.Run("mtxrun", pathArg, "--script", "context", "cv.tex")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Image builds the CV builder docker image.
|
||||||
|
func Image() error {
|
||||||
|
image := imageName()
|
||||||
|
|
||||||
|
return sh.Run("docker", "build", "-f", dockerfile, "-t", image, ".")
|
||||||
|
}
|
||||||
|
|
||||||
|
// PublishImage publishes the CV builder docker image
|
||||||
|
// to the docker registry.
|
||||||
|
func PublishImage() error {
|
||||||
|
mg.Deps(Image)
|
||||||
|
|
||||||
|
image := imageName()
|
||||||
|
return sh.Run("docker", "push", image)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean removes the directory where the output files
|
||||||
|
// are generated.
|
||||||
|
func Clean() error {
|
||||||
|
if err := sh.Rm(outputDir); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// imageName generates the docker image name from the environment
|
||||||
|
// variables IMAGE_NAME and IMAGE_TAG. Default vaules will be used
|
||||||
|
// if these variables are not set or empty.
|
||||||
|
func imageName() string {
|
||||||
|
name := os.Getenv("IMAGE_NAME")
|
||||||
|
if len(name) == 0 {
|
||||||
|
name = defaultImageName
|
||||||
|
}
|
||||||
|
|
||||||
|
tag := os.Getenv("IMAGE_TAG")
|
||||||
|
if len(tag) == 0 {
|
||||||
|
tag = defaultImageTag
|
||||||
|
}
|
||||||
|
|
||||||
|
return name + ":" + tag
|
||||||
|
}
|
Loading…
Reference in a new issue