.circleci/config.yml
version: 2.1
commands:
mkdir_working_directory:
steps:
- run:
name: Initialize working directory
working_directory: /
command: |
sudo mkdir -p /go/src/github.com/piotrkowalczuk/charon
sudo chmod -R 777 /go/src/github.com/piotrkowalczuk/charon
executors:
python-executor:
docker:
- image: circleci/python:3
working_directory: /go/src/github.com/piotrkowalczuk/charon
java-executor:
docker:
- image: circleci/openjdk:8
working_directory: /go/src/github.com/piotrkowalczuk/charon
golang-executor:
docker:
- image: circleci/golang
working_directory: /go/src/github.com/piotrkowalczuk/charon
jobs:
setup_golang:
executor: golang-executor
steps:
- checkout
- restore_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
- run:
name: Install dep
command: |
go get -u github.com/golang/dep/cmd/dep
- run:
name: Install dependencies
command: dep ensure -vendor-only
- save_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
paths:
- "vendor"
test_golang:
docker:
- image: circleci/golang
- image: circleci/postgres:9.6-alpine
environment:
POSTGRES_USER: test
POSTGRES_DB: test
working_directory: /go/src/github.com/piotrkowalczuk/charon
steps:
- checkout
- restore_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
- run:
name: Install tools
command: |
bash ./.circleci/scripts/get_tool.sh github.com/golang/protobuf/protoc-gen-go v1.2.0
go get -u google.golang.org/grpc
go get -u golang.org/x/tools/cmd/goimports
go get -u github.com/codeclimate/test-reporter
bash ./.circleci/scripts/install_protoc.sh
- run:
name: Generate protobuf
command: bash ./.circleci/scripts/generate.sh golang
- run:
name: Check generated code for mismatch
command: git diff --exit-code ./pb
- run:
name: Code Climate (before build)
command: test-reporter before-build
- run:
name: Run tests
environment:
CHAROND_POSTGRES_ADDRESS: "postgres://test@localhost/test?sslmode=disable"
command: |
mkdir -p /tmp/test-results/golang
make test
cp results.xml /tmp/test-results/golang/results.xml
test-reporter format-coverage -d -t=gocov cover.out
- run:
name: Code Climate (after build)
command: |
cp cover.out c.out
test-reporter after-build --coverage-input-type=gocov
- store_test_results:
path: /tmp/test-results
- store_artifacts:
path: /tmp/test-results
- save_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
paths:
- "vendor"
lint_protobuf:
executor: golang-executor
steps:
- checkout
- restore_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
- run:
name: Install protoc
command: bash ./.circleci/scripts/install_protoc.sh
- run:
name: Install command line tools
command: |
go get -u github.com/ckaznocha/protoc-gen-lint
- run:
name: Lint protobuf
command: bash ./.circleci/scripts/generate.sh lint
build_golang:
executor: golang-executor
steps:
- checkout
- restore_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
- run:
name: Build
command: |
make build
- store_artifacts:
path: ./bin
- persist_to_workspace:
root: ./
paths:
- bin
build_docker:
docker:
- image: docker:18.06.0-ce-git
steps:
- checkout
- attach_workspace:
at: ./
- setup_remote_docker:
docker_layer_caching: true
version: 18.06.0-ce
- run:
name: Docker build
command: |
docker build --build-arg VCS_REF=${VCS_REF} --build-arg BUILD_DATE=`date -u +"%Y-%m-%dT%H:%M:%SZ"` -t piotrkowalczuk/charon:${CIRCLE_TAG:-latest} .
- run:
name: Docker save
command: |
docker save -o ./docker-image.tar piotrkowalczuk/charon:${CIRCLE_TAG:-latest}
- persist_to_workspace:
root: ./
paths:
- docker-image.tar
publish_docker:
docker:
- image: docker:18.06.0-ce-git
steps:
- attach_workspace:
at: ./
- setup_remote_docker:
docker_layer_caching: true
version: 18.06.0-ce
- run:
name: Docker load
command: |
docker load < ./docker-image.tar
- run:
name: Docker login
command: |
docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
- run:
name: Docker push
command: |
docker push piotrkowalczuk/charon:${CIRCLE_TAG:-latest}
generate_java:
executor: java-executor
steps:
- mkdir_working_directory
- checkout
- restore_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
- run:
name: Install protoc
command: bash ./.circleci/scripts/install_protoc.sh
- run:
environment:
GOPATH: "/go"
name: Generate protobuf
command: bash ./.circleci/scripts/generate.sh java
generate_python:
executor: python-executor
steps:
- mkdir_working_directory
- checkout
- restore_cache:
key: v1-golang-dependency-{{ checksum "Gopkg.lock" }}
- run:
name: Install python packages
command: |
python -m venv ./venv
. venv/bin/activate
pip install grpcio grpcio-tools twine
- run:
name: Install protoc
command: bash ./.circleci/scripts/install_protoc.sh
- run:
name: Generate protobuf
environment:
GOPATH: "/go"
command: |
. venv/bin/activate
bash ./.circleci/scripts/generate.sh python
- save_cache:
key: v1-python-dependency-{{ .Branch }}-{{ .Revision }}
paths:
- "venv"
- "publish/python/github"
publish_python:
executor: python-executor
steps:
- mkdir_working_directory
- checkout
- run:
name: Init VERSION.txt file
command: make version
- restore_cache:
keys:
- v1-python-dependency-{{ .Branch }}-{{ .Revision }}
- run:
name: Create package
command: |
cd publish/python
python setup.py sdist
python setup.py bdist_wheel
- run:
name: Upload to pypi
command: |
. ./venv/bin/activate
twine upload ./publish/python/dist/*
workflows:
version: 2
generate:
jobs:
- setup_golang:
filters:
tags:
only: /.*/
- test_golang:
context: codeclimate-charon
requires:
- setup_golang
filters:
tags:
only: /.*/
- lint_protobuf:
requires:
- setup_golang
filters:
tags:
only: /.*/
- build_golang:
requires:
- test_golang
filters:
tags:
only: /.*/
- build_docker:
requires:
- build_golang
filters:
tags:
only: /.*/
- publish_docker:
context: hub.docker.com
requires:
- build_docker
filters:
branches:
only: master
tags:
only: /^(v)?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/
- generate_python:
requires:
- lint_protobuf
filters:
tags:
only: /.*/
- generate_java:
requires:
- lint_protobuf
filters:
tags:
only: /.*/
- publish_python:
context: twine
requires:
- build_golang
- generate_python
filters:
branches:
ignore: /.*/
tags:
only: /^(v)?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(-(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(\.(0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\+[0-9a-zA-Z-]+(\.[0-9a-zA-Z-]+)*)?$/