# This file is a template, and might need editing before it works on your project.
image: git.huoys.com:9999/docker-image/golang
variables:
CI_REPOSITORY_NAME: git.huoys.com/${CI_PROJECT_PATH}
CI_DOCKER_ROOTDIR: "build"
stages:
- build
- update
- deploy
.env_init: &env_init |
KUBECONFIG="/etc/kubernetes/dev.conf"
DOCKER_IMAGE="${CI_REGISTRY_IMAGE}"
DOCKER_IMAGE_TAG="alpha-${CI_PIPELINE_IID}"
# Fix tag
if [[ -n "${CI_COMMIT_TAG}" ]]; then
KUBECONFIG="/etc/kubernetes/online.conf"
DOCKER_IMAGE="ssoor/${CI_PROJECT_NAME}"
DOCKER_IMAGE_TAG="${CI_COMMIT_TAG}"
fi
# Fix master
if [[ "${CI_COMMIT_REF_NAME}" == "master" ]]; then
KUBECONFIG="/etc/kubernetes/test.conf"
DOCKER_IMAGE="ssoor/${CI_PROJECT_NAME}"
DOCKER_IMAGE_TAG="bata-${CI_PIPELINE_IID}"
fi
project_check:
stage: build
script:
- setup_golang
- go fmt $(go list ./... | grep -v /vendor/)
- go vet $(go list ./... | grep -v /vendor/)
- go test -race $(go list ./... | grep -v /vendor/)
only:
- tags
- branches
project_compile:
stage: build
script:
- setup_golang
- mkdir -p ${CI_DOCKER_ROOTDIR}
- cp -rf conf ${CI_DOCKER_ROOTDIR}
- CGO_ENABLED=0 go build -ldflags '-extldflags "-static"' -ldflags '-X main.Build=${DOCKER_IMAGE_TAG}' -o ${CI_DOCKER_ROOTDIR}/${CI_PROJECT_NAME}
artifacts:
paths:
- ${CI_DOCKER_ROOTDIR}/
only:
- tags
- test
- master
update_image:
tags:
- docker
stage: update
image: git.huoys.com:9999/docker-image/docker-stable
variables:
GIT_STRATEGY: none
DOCKER_HOST: tcp://172.13.0.52:2375
DOCKER_DRIVER: overlay2
script:
# 生成服务定义
- SRV_IMAGE='alpine'
- SRV_WORKDIR="/${CI_PROJECT_NAME}"
# 安装 timezone 数据包
- BUILD_IMAGE_SCRIPT='apk add --no-cache tzdata'
# 生成镜像
- docker_build ${DOCKER_IMAGE}:${DOCKER_IMAGE_TAG} "./${CI_PROJECT_NAME}"
- docker_build ${DOCKER_IMAGE}:latest "./${CI_PROJECT_NAME}"
dependencies:
- project_compile
only:
- tags
- test
- master
deploy_k8s:
tags:
- kubectl
stage: deploy
variables:
GIT_STRATEGY: fetch
script:
# 获取命名空间
- KUBE_NAMESPACE=`kubectl -n istio-system get configmap ci-deploy -o template --template={{.data.namespace}}` && echo "Use namespace ${KUBE_NAMESPACE}"
# 更新镜像
- helm template .helm/hallgo --name=hall-go --set image.repository="${DOCKER_IMAGE}:${DOCKER_IMAGE_TAG}" | kubectl -n ${KUBE_NAMESPACE} apply -f -
- helm template .helm/publisher --name=publisher --set image.repository="${DOCKER_IMAGE}:${DOCKER_IMAGE_TAG}" | kubectl -n ${KUBE_NAMESPACE} apply -f -
# 更新时区
- kubectl -n ${KUBE_NAMESPACE} set env deployment/hall-go TZ="Asia/Bangkok"
- kubectl -n ${KUBE_NAMESPACE} set env deployment/publisher TZ="Asia/Bangkok"
only:
- test
- tags
- master
environment:
name: $CI_COMMIT_REF_NAME$CI_COMMIT_TAG
# --------------------------------------------------------------------------
.golang_init: &golang_init |
function setup_golang() {
mkdir -p $GOPATH/src/$(dirname $CI_REPOSITORY_NAME)
ln -svf $CI_PROJECT_DIR $GOPATH/src/$CI_REPOSITORY_NAME
cd $GOPATH/src/$CI_REPOSITORY_NAME
}
.docker_init: &docker_init |
function docker_setup() {
if ! docker info &>/dev/null; then
if [ -z "$DOCKER_HOST" -a "$KUBERNETES_PORT" ]; then
export DOCKER_HOST='tcp://localhost:2375'
fi
fi
if [[ -n "$CI_REGISTRY_USER" ]]; then
echo "Logging to GitLab Container Registry with CI credentials..."
docker login -u ssoor -p '123456.' docker.io
docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
echo ""
fi
}
function docker_build() {
docker_setup
_l_ROOTFS=${CI_DOCKER_ROOTDIR}
_l_DEPLOY_IMAGE=${SRV_IMAGE:-alpine}
_l_DEPLOY_WORKDIR=${SRV_WORKDIR}
_l_DEPLOY_ENVIRONMENT=${SRV_ENVIRONMENT}
_l_DEPLOY_SCRIPT=${BUILD_IMAGE_SCRIPT}
_l_DEPLOY_ENTRYPOINT=${BUILD_IMAGE_ENTRYPOINT}
_param_TAG=${1}
_param_CMD=${2}
if [[ -z "${_param_TAG}" ]]; then
echo "Building respository address is not null" >&2
exit -1
fi
# if [[ -d "${_param_MERGEDIR}" ]]; then
# cp -rf "${_param_MERGEDIR}"/* "${_l_ROOTFS}/"
# if [[ $? -ne 0 ]]; then
# echo "Copy Dockerfile-based dir ${_param_MERGEDIR} to ${_l_ROOTFS} failed" >&2
# exit -1
# fi
# fi
DOCKER_ARGS=""
DOCKER_FILE="${_l_ROOTFS}/.dockerfile"
echo "FROM ${_l_DEPLOY_IMAGE}" >> ${DOCKER_FILE}
echo "WORKDIR ${_l_DEPLOY_WORKDIR}" >> ${DOCKER_FILE}
echo "COPY . ." >> ${DOCKER_FILE}
if [[ -n "${_l_DEPLOY_ENVIRONMENT}" ]]; then
echo "ENV ${_l_DEPLOY_ENVIRONMENT}" >> ${DOCKER_FILE}
fi
if [[ -n "${_l_DEPLOY_SCRIPT}" ]]; then
echo "RUN ${_l_DEPLOY_SCRIPT}" >> ${DOCKER_FILE}
fi
if [[ -n "${_l_DEPLOY_ENTRYPOINT}" ]]; then
echo "ENTRYPOINT ${_l_DEPLOY_ENTRYPOINT}" >> ${DOCKER_FILE}
fi
echo "CMD ${_param_CMD}" >> ${DOCKER_FILE}
echo "Building Dockerfile-based application..."
cat "${DOCKER_FILE}"
docker build ${DOCKER_ARGS} -t "${_param_TAG}" -f "${DOCKER_FILE}" "${_l_ROOTFS}"
echo "Pushing [${_param_TAG}] to GitLab Container Registry..."
docker push "${_param_TAG}"
echo ""
}
before_script:
- *env_init
- *golang_init
- *docker_init
Gitlab-CI 结合 kubernetes 编译部署 .gitlab-ci.yml 文件示例
猜你喜欢
转载自blog.csdn.net/kunyus/article/details/90670438
今日推荐
周排行