mirror of
https://github.com/semaphoreui/semaphore.git
synced 2024-12-17 22:20:11 +01:00
67954b95aa
Since packr have been deprecated in favor of go:embed for quite some time now I have replaced it with plain go:embed functionality which makes it more future proof. The only downside is that go:embed can use relativ paths only, that's why I have moved the web/dist folder into api/public. Besides that I have refactored the static asset handling which includes basic last modification and cache control headers to improve the cache cache behavior for static assets.
289 lines
8.7 KiB
YAML
289 lines
8.7 KiB
YAML
# Semaphore Tasks
|
|
# These tasks should be used to build and develop Semaphore
|
|
#
|
|
# Tasks without a `desc:` field are intended mainly to be called
|
|
# internally by other tasks and therefore are not listed when running `task` or `task -l`
|
|
version: '3'
|
|
|
|
vars:
|
|
docker_namespace: semaphoreui
|
|
docker_image: semaphore
|
|
|
|
|
|
|
|
tasks:
|
|
all:
|
|
desc: Install, Compile, Test and Build Semaphore for local architecture
|
|
cmds:
|
|
- task: deps
|
|
- task: compile
|
|
- task: test
|
|
- task: build:local
|
|
vars:
|
|
GOOS: ''
|
|
GOARCH: ''
|
|
|
|
deps:
|
|
desc: Install all dependencies (except dredd requirements)
|
|
cmds:
|
|
- task: deps:tools
|
|
- task: deps:be
|
|
- task: deps:fe2
|
|
|
|
deps:be:
|
|
desc: Vendor application dependencies
|
|
cmds:
|
|
- go mod vendor
|
|
|
|
deps:fe2:
|
|
desc: Installs npm requirements for front end from package.json
|
|
dir: web
|
|
cmds:
|
|
- npm install
|
|
# - npm audit fix
|
|
|
|
deps:integration:
|
|
desc: Installs requirements for integration testing with dredd
|
|
dir: web
|
|
cmds:
|
|
- npm install dredd@13.1.2
|
|
# - npm audit fix
|
|
|
|
deps:tools:
|
|
desc: Installs tools needed
|
|
dir: web
|
|
vars:
|
|
GORELEASER_VERSION: "0.183.0"
|
|
GOLINTER_VERSION: "1.46.2"
|
|
cmds:
|
|
- go install github.com/snikch/goodman/cmd/goodman@latest
|
|
- go install github.com/go-swagger/go-swagger/cmd/swagger@v0.29.0
|
|
- '{{ if ne OS "windows" }} sh -c "curl -L https://github.com/goreleaser/goreleaser/releases/download/v{{ .GORELEASER_VERSION }}/goreleaser_$(uname -s)_$(uname -m).tar.gz | tar -xz -C $(go env GOPATH)/bin goreleaser"{{ else }} {{ end }}'
|
|
- '{{ if ne OS "windows" }} chmod +x $(go env GOPATH)/bin/goreleaser{{ else }} {{ end }}'
|
|
- '{{ if eq OS "windows" }} echo "NOTICE: You must download goreleaser manually to build this application https://github.com/goreleaser/goreleaser/releases "{{ else }}:{{ end }}'
|
|
# - '{{ if ne OS "windows" }} sh -c "curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v{{ .GOLINTER_VERSION }}"{{ else }}{{ end }}'
|
|
- '{{ if eq OS "windows" }} echo "NOTICE: You need to install golangci-lint manually to build this application https://github.com/golangci/golangci-lint#install"{{ else }}{{ end }}'
|
|
|
|
compile:
|
|
desc: Generates compiled frontend and backend resources (must be in this order)
|
|
cmds:
|
|
- task: compile:fe2
|
|
- task: compile:be
|
|
|
|
compile:fe2:
|
|
desc: Build vue.js project
|
|
dir: web
|
|
sources:
|
|
- src/*.*
|
|
- src/**/*.*
|
|
- public/index.html
|
|
- public/favicon.ico
|
|
- package.json
|
|
- package-lock.json
|
|
- babel.config.js
|
|
- vue.config.js
|
|
generates:
|
|
- ../api/public/css/*.css
|
|
- ../api/public/js/*.js
|
|
- ../api/public/index.html
|
|
- ../api/public/favicon.ico
|
|
cmds:
|
|
- npm run build
|
|
|
|
compile:be:
|
|
desc: Generate the version
|
|
cmds:
|
|
- go run util/version_gen/generator.go {{ if .TAG }}{{ .TAG }}{{ else }}{{ if .SEMAPHORE_VERSION }}{{ .SEMAPHORE_VERSION }}{{ else }}{{ .BRANCH }}-{{ .SHA }}-{{ .TIMESTAMP }}{{ if .DIRTY }}-dirty{{ end }}{{ end }}{{end}}
|
|
vars:
|
|
TAG:
|
|
sh: git name-rev --name-only --tags --no-undefined HEAD 2>/dev/null | sed -n 's/^\([^^~]\{1,\}\)\(\^0\)\{0,1\}$/\1/p'
|
|
BRANCH:
|
|
sh: git rev-parse --abbrev-ref HEAD
|
|
DIRTY:
|
|
# We must exclude the package-lock file as npm install can change it!
|
|
sh: git diff --exit-code --stat -- . ':(exclude)web/package-lock.json' ':(exclude)web/package.json' || true
|
|
SHA:
|
|
sh: git log --pretty=format:'%h' -n 1
|
|
TIMESTAMP:
|
|
sh: date +%s
|
|
|
|
compile:api:hooks:
|
|
dir: ./.dredd/hooks
|
|
cmds:
|
|
- go build -o ../compiled_hooks{{ if eq OS "windows" }}.exe{{ end }}
|
|
|
|
build:
|
|
desc: Build a full set of release binaries and packages
|
|
cmds:
|
|
- task: release
|
|
|
|
build:local:
|
|
desc: Build a binary for the current architecture
|
|
dir: cli
|
|
cmds:
|
|
- env CGO_ENABLED=0 GOOS={{ .GOOS }} GOARCH={{ .GOARCH }} go build -o ../bin/semaphore{{ if eq OS "windows" }}.exe{{ end }}
|
|
|
|
release:
|
|
desc: creates a release without performing validations or publishing artifacts
|
|
cmds:
|
|
- goreleaser --snapshot --rm-dist
|
|
|
|
release:prod:
|
|
cmds:
|
|
- goreleaser
|
|
|
|
lint:
|
|
cmds:
|
|
- task: lint:be
|
|
|
|
lint:be:
|
|
# --errors
|
|
cmds:
|
|
- golangci-lint run --disable goconst --timeout 240s ./...
|
|
|
|
test:
|
|
cmds:
|
|
- task: test:be
|
|
|
|
test:be:
|
|
desc: Run go code tests
|
|
cmds:
|
|
- go vet ./...
|
|
- swagger validate ./api-docs.yml
|
|
- go test -v -coverprofile=coverage.out ./...
|
|
|
|
test:api:
|
|
desc: test the api with dredd
|
|
cmds:
|
|
- ./web/node_modules/.bin/dredd --config .dredd/dredd.yml
|
|
|
|
ci:artifacts:
|
|
cmds:
|
|
- rsync -a bin/ $CIRCLE_ARTIFACTS/
|
|
|
|
# docker(-compose) commands
|
|
dc:dev:
|
|
desc: build and start a development stack using docker-compose
|
|
cmds:
|
|
- task: docker
|
|
vars:
|
|
context: dev
|
|
args: build semaphore_dev
|
|
compose: true
|
|
- task: dc:up
|
|
vars:
|
|
context: dev
|
|
|
|
# convenience function to build and start a production like stack
|
|
dc:prod:
|
|
desc: build and start a production like stack using docker-compose
|
|
cmds:
|
|
- task: docker
|
|
vars:
|
|
context: prod
|
|
args: build semaphore
|
|
compose: true
|
|
- task: dc:up
|
|
vars:
|
|
context: prod
|
|
|
|
dc:up:
|
|
desc: start a docker-compose instance, requires context
|
|
cmds:
|
|
- task: docker
|
|
vars:
|
|
compose: true
|
|
args: up --abort-on-container-exit
|
|
prefix: "{{ .prefix }}"
|
|
context: "{{ .context }}"
|
|
|
|
dc:build:
|
|
desc: build a set of docker-compose containers, requires context
|
|
cmds:
|
|
- task: docker
|
|
vars:
|
|
compose: true
|
|
args: build
|
|
context: "{{ .context }}"
|
|
|
|
dc:down:
|
|
desc: down a docker-compose instance, requires context
|
|
cmds:
|
|
- task: docker
|
|
vars:
|
|
compose: true
|
|
args: down
|
|
context: "{{ .context }}"
|
|
|
|
dc:stop:
|
|
desc: stop a docker-compose instance, requires context
|
|
cmds:
|
|
- task: docker
|
|
vars:
|
|
compose: true
|
|
args: stop
|
|
context: "{{ .context }}"
|
|
|
|
docker:build:
|
|
desc: Build an image for Semaphore, requires context
|
|
vars:
|
|
tag: "{{ if .tag }}{{ .tag }}{{ else }}latest{{ end }}"
|
|
cmds:
|
|
- task: docker
|
|
vars:
|
|
context: "{{ .context }}"
|
|
action: build
|
|
tag: "{{ .tag }}"
|
|
args: -t "{{ .docker_namespace }}/{{ .docker_image }}:{{ .tag }}" .
|
|
|
|
deps:docker:
|
|
desc: Install docker testing dependencies. These must be installed explicitly and are not included in the general deps task.
|
|
status:
|
|
- test -f /usr/local/bin/goss
|
|
- test -f /usr/local/bin/dgoss
|
|
- test -f /usr/local/bin/hadolint
|
|
cmds:
|
|
- sudo curl -L https://github.com/aelsabbahy/goss/releases/download/v0.3.5/goss-linux-amd64 -o /usr/local/bin/goss
|
|
- sudo chmod +rx /usr/local/bin/goss
|
|
- sudo curl -L https://raw.githubusercontent.com/aelsabbahy/goss/v0.3.5/extras/dgoss/dgoss -o /usr/local/bin/dgoss
|
|
- sudo chmod +rx /usr/local/bin/dgoss
|
|
- sudo curl -L https://github.com/hadolint/hadolint/releases/download/v2.10.0/hadolint-Linux-x86_64 -o /usr/local/bin/hadolint
|
|
- sudo chmod +rx /usr/local/bin/hadolint
|
|
|
|
docker:test:
|
|
desc: Test docker containers by building them, running tests and deleting
|
|
deps: ['deps:docker']
|
|
cmds:
|
|
- task: docker:lint
|
|
vars:
|
|
context: "{{ .context }}"
|
|
- task: docker:build
|
|
vars:
|
|
tag: "{{ .context }}-test"
|
|
- task: docker:goss
|
|
- docker rmi "{{ .docker_namespace }}/{{ .docker_image }}:{{ .context }}-test"
|
|
|
|
docker:goss:
|
|
dir: "deployment/docker/{{ .context}}"
|
|
deps: ['deps:docker']
|
|
cmds:
|
|
- GOSS_FILES_STRATEGY='cp' dgoss run -it "{{ .docker_namespace }}/{{ .docker_image }}:{{ .context }}-test"
|
|
|
|
docker:lint:
|
|
desc: hadolint a dockerfile. Ignores version pinning warning
|
|
dir: "deployment/docker/{{ .context}}"
|
|
cmds:
|
|
- hadolint Dockerfile --ignore DL3018
|
|
|
|
docker:push:
|
|
desc: push a docker image to a repo. Defaults to the official docker hub
|
|
cmds:
|
|
- docker push {{ .docker_namespace }}/{{ .docker_image }}:{{ .tag }}
|
|
|
|
# templated command to reduce code duplication
|
|
docker:
|
|
vars:
|
|
docker_root: deployment/docker/
|
|
cmds:
|
|
- docker{{ if .compose }}-compose{{ end }} {{ if .action }}{{ .action }}{{ end }} -f {{ .docker_root }}{{ .context }}/{{ if .compose }}docker-compose{{ if .prefix }}{{ .prefix }}{{ end }}.yml{{ else }}Dockerfile{{ if .prefix }}{{ .prefix }}{{ end }}{{ end }} {{if .args }}{{ .args }}{{ end }}
|