feat(build): add CI
This commit is contained in:
parent
f1acf9df38
commit
588356729f
|
@ -0,0 +1,105 @@
|
|||
include:
|
||||
- local: /.gitlab/ci-tools.yml
|
||||
- local: /.gitlab/ci-rules.yml
|
||||
|
||||
stages:
|
||||
- status-pre
|
||||
- build
|
||||
- image
|
||||
- publish
|
||||
- status-post
|
||||
|
||||
# build jobs
|
||||
build-node:
|
||||
stage: build
|
||||
extends:
|
||||
- .build-node
|
||||
|
||||
script:
|
||||
- make ci
|
||||
|
||||
artifacts:
|
||||
when: always
|
||||
expire_in: 1 day
|
||||
paths:
|
||||
- out/
|
||||
|
||||
cache:
|
||||
key: "${CI_COMMIT_REF_SLUG}"
|
||||
policy: pull-push
|
||||
paths:
|
||||
- node_modules/
|
||||
- out/api
|
||||
- out/cache
|
||||
- out/tmp
|
||||
|
||||
# publish jobs
|
||||
publish-npm:
|
||||
stage: publish
|
||||
extends:
|
||||
- .build-node
|
||||
- .deploy-tags
|
||||
|
||||
dependencies:
|
||||
- build-node
|
||||
script:
|
||||
- npm publish
|
||||
|
||||
# commit status
|
||||
climate-pending:
|
||||
stage: status-pre
|
||||
extends:
|
||||
- .build-climate
|
||||
|
||||
script:
|
||||
- cc-test-reporter before-build
|
||||
|
||||
climate-success:
|
||||
stage: status-post
|
||||
extends:
|
||||
- .build-climate
|
||||
|
||||
dependencies:
|
||||
- build-node
|
||||
script:
|
||||
- make upload-climate
|
||||
|
||||
github-pending:
|
||||
stage: status-pre
|
||||
extends:
|
||||
- .build-curl
|
||||
script:
|
||||
- ./scripts/github-status.sh pending
|
||||
|
||||
github-failure:
|
||||
stage: status-post
|
||||
extends:
|
||||
- .build-curl
|
||||
when: on_failure
|
||||
script:
|
||||
- ./scripts/github-status.sh failure
|
||||
|
||||
github-success:
|
||||
stage: status-post
|
||||
extends:
|
||||
- .build-curl
|
||||
when: on_success
|
||||
script:
|
||||
- ./scripts/github-status.sh success
|
||||
|
||||
sonar-success:
|
||||
stage: status-post
|
||||
extends:
|
||||
- .build-sonar
|
||||
|
||||
when: on_success
|
||||
script:
|
||||
- make node_modules
|
||||
- sonar-scanner
|
||||
-Dsonar.projectKey=ssube_salty-dog
|
||||
-Dsonar.projectVersion=${CI_COMMIT_REF_SLUG}
|
||||
-Dsonar.organization=ssube-github
|
||||
-Dsonar.sources=src/,test/
|
||||
-Dsonar.host.url=https://sonarcloud.io
|
||||
-Dsonar.login=${SONAR_SECRET}
|
||||
-Dsonar.typescript.lcov.reportPaths=out/coverage/lcov.info
|
|
@ -0,0 +1,7 @@
|
|||
.deploy-branches:
|
||||
except:
|
||||
- tags
|
||||
|
||||
.deploy-tags:
|
||||
only:
|
||||
- tags
|
|
@ -0,0 +1,66 @@
|
|||
.build-base:
|
||||
image: docker.artifacts.apextoaster.com/apextoaster/base:1.5
|
||||
tags:
|
||||
- platform:k8s
|
||||
- runner:shared
|
||||
|
||||
.build-aws:
|
||||
extends:
|
||||
- .build-base
|
||||
|
||||
.build-curl:
|
||||
extends:
|
||||
- .build-base
|
||||
|
||||
.build-climate:
|
||||
image: docker.artifacts.apextoaster.com/apextoaster/code-climate:0.6
|
||||
tags:
|
||||
- platform:k8s
|
||||
- runner:shared
|
||||
allow_failure: false
|
||||
variables:
|
||||
CI_BRANCH: "${CI_COMMIT_REF_NAME}"
|
||||
GIT_BRANCH: "${CI_COMMIT_REF_NAME}"
|
||||
GIT_COMMIT_SHA: "${CI_COMMIT_SHA}"
|
||||
|
||||
.build-docker:
|
||||
image: docker.artifacts.apextoaster.com/apextoaster/docker:20.10
|
||||
services:
|
||||
- docker.artifacts.apextoaster.com/apextoaster/docker-dind:20.10
|
||||
tags:
|
||||
- platform:k8s
|
||||
- runner:shared
|
||||
allow_failure: false
|
||||
|
||||
before_script:
|
||||
- mkdir ${HOME}/.docker
|
||||
- echo "${DOCKER_SECRET}" | base64 -d > ${HOME}/.docker/config.json
|
||||
script:
|
||||
- ${CI_PROJECT_DIR}/scripts/docker-build.sh --push
|
||||
after_script:
|
||||
- rm -rfv ${HOME}/.docker
|
||||
|
||||
variables:
|
||||
DOCKER_CERT_PATH: "/shared/docker/client"
|
||||
DOCKER_DRIVER: overlay2
|
||||
DOCKER_HOST: tcp://localhost:2376
|
||||
DOCKER_TLS_CERTDIR: "/shared/docker"
|
||||
DOCKER_TLS_VERIFY: 1
|
||||
IMAGE_ROOT: "${CI_PROJECT_DIR}"
|
||||
|
||||
.build-node:
|
||||
image: docker.artifacts.apextoaster.com/apextoaster/node:16.6
|
||||
tags:
|
||||
- platform:k8s
|
||||
- runner:shared
|
||||
allow_failure: false
|
||||
|
||||
before_script:
|
||||
- echo "${NPM_SECRET}" | base64 -d > ${HOME}/.npmrc
|
||||
|
||||
.build-sonar:
|
||||
image: docker.artifacts.apextoaster.com/apextoaster/sonar-scanner:4.4
|
||||
tags:
|
||||
- platform:k8s
|
||||
- runner:shared
|
||||
allow_failure: false
|
|
@ -0,0 +1,7 @@
|
|||
#! /bin/sh
|
||||
|
||||
PROJECT="${ROOT_PATH}"
|
||||
PARENT="$(dirname "${PROJECT}")"
|
||||
PROJECT_PATH="$(basename "${PARENT}")/$(basename "${PROJECT}")"
|
||||
|
||||
echo "${PROJECT_PATH}"
|
|
@ -0,0 +1,27 @@
|
|||
#! /bin/bash
|
||||
|
||||
IMAGE_PUSH="${1:---skip}"
|
||||
IMAGE_DEFAULT="${2:---skip}"
|
||||
|
||||
IMAGE_NAME="${CI_PROJECT_PATH}"
|
||||
IMAGE_TAG="$(echo "${CI_COMMIT_TAG:-${CI_COMMIT_REF_SLUG}}" | sed -r 's/[^-_a-zA-Z0-9\\.]/-/g')"
|
||||
|
||||
IMAGE_SHORT="${IMAGE_NAME}:${IMAGE_TAG}"
|
||||
IMAGE_FULL="${IMAGE_NAME}:${IMAGE_TAG}-${IMAGE_ARCH}"
|
||||
|
||||
echo "Building image: ${IMAGE_FULL}"
|
||||
|
||||
docker build -f "Dockerfile.${IMAGE_ARCH}" -t "${IMAGE_FULL}" . || (echo "Failed to build image!" && exit 1)
|
||||
|
||||
if [[ "${IMAGE_PUSH}" == "--push" ]];
|
||||
then
|
||||
echo "Pushing image: ${IMAGE_FULL}"
|
||||
docker push "${IMAGE_FULL}" || (echo "Failed to push image!" && exit 1)
|
||||
fi
|
||||
|
||||
if [[ "${IMAGE_DEFAULT}" == "--default" ]];
|
||||
then
|
||||
echo "Pushing image (default architecture): ${IMAGE_SHORT}"
|
||||
docker tag "${IMAGE_FULL}" "${IMAGE_SHORT}"
|
||||
docker push "${IMAGE_SHORT}" || (echo "Failed to push image!" && exit 1)
|
||||
fi
|
|
@ -0,0 +1,19 @@
|
|||
#! /bin/sh
|
||||
|
||||
STATUS="${1}"
|
||||
CI_COMMIT_SHA="${CI_COMMIT_SHA:-$(git rev-parse HEAD)}"
|
||||
|
||||
STATUS_BODY="$(cat <<EOF
|
||||
{
|
||||
"state": "${STATUS}",
|
||||
"target_url": "${CI_PIPELINE_URL}",
|
||||
"description": "CI pipeline ${STATUS}!",
|
||||
"context": "gitlab/build"
|
||||
}
|
||||
EOF
|
||||
)"
|
||||
|
||||
printf "Reporting status for %s...\n%s" "${CI_COMMIT_SHA}" "${STATUS_BODY}"
|
||||
printf "%s" "${STATUS_BODY}" | curl -d @- \
|
||||
-H "Authorization: token $(printf "%s" "${GITHUB_SECRET}" | base64 -d)" \
|
||||
-i "https://api.github.com/repos/${CI_PROJECT_PATH}/statuses/${CI_COMMIT_SHA}"
|
|
@ -0,0 +1,68 @@
|
|||
#! /bin/sh
|
||||
|
||||
mkdir -p ./out/test/examples
|
||||
|
||||
EXAMPLES="$(find ./test/examples -name '*.yml')"
|
||||
|
||||
for example in ${EXAMPLES};
|
||||
do
|
||||
echo "Testing: ${example}"
|
||||
|
||||
USE_RULES="$(grep '# test rules' "${example}" | sed 's/# test rules \(.*\)/\1/')"
|
||||
[ -z "${USE_RULES}" ] && echo "Test example must have '# test rules' pragma" && exit 1
|
||||
|
||||
USE_TAGS="$(grep '# test tags' "${example}" | sed 's/# test tags \(.*\)/\1/')"
|
||||
[ -z "${USE_TAGS}" ] && echo "Test example must have '# test tags' pragma" && exit 1
|
||||
|
||||
EXPECTED_STATUS="$(grep '# test exit-status' "${example}" | sed 's/# test exit-status \([0-9]*\)/\1/')"
|
||||
[ -z "${EXPECTED_STATUS}" ] && EXPECTED_STATUS=0
|
||||
|
||||
echo "Using rules: ${USE_RULES}"
|
||||
echo "Using tags: ${USE_TAGS}"
|
||||
echo "Expected status: ${EXPECTED_STATUS}"
|
||||
|
||||
STDOUT_PATH=./out/${example}-stdout.log
|
||||
STDERR_PATH=./out/${example}-stderr.log
|
||||
|
||||
node out/src/index.js \
|
||||
--config-path ./docs \
|
||||
--config-name config-stderr.yml \
|
||||
--count \
|
||||
--rules "rules/${USE_RULES}.yml" \
|
||||
--tag "${USE_TAGS}" \
|
||||
--source "${example}" \
|
||||
1> ${STDOUT_PATH} \
|
||||
2> ${STDERR_PATH}
|
||||
|
||||
ACTUAL_STATUS=$?
|
||||
echo "Test status: ${ACTUAL_STATUS}"
|
||||
|
||||
if [ -s ${STDOUT_PATH} ];
|
||||
then
|
||||
echo "Test output:"
|
||||
echo "==="
|
||||
echo ""
|
||||
tail -n5 ${STDOUT_PATH}
|
||||
echo ""
|
||||
echo "==="
|
||||
fi
|
||||
|
||||
if [ -s ${STDERR_PATH} ];
|
||||
then
|
||||
echo "Test errors:"
|
||||
echo "==="
|
||||
echo ""
|
||||
tail -n5 ${STDERR_PATH}
|
||||
echo ""
|
||||
echo "==="
|
||||
fi
|
||||
|
||||
if [ "${ACTUAL_STATUS}" != "${EXPECTED_STATUS}" ];
|
||||
then
|
||||
echo "Exit status does not match! (expected ${EXPECTED_STATUS}, got ${ACTUAL_STATUS})"
|
||||
echo "Failed in: ${example}"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
echo "All examples passed."
|
Loading…
Reference in New Issue