Files
gitlab-ci/ci/.gitlab-ci.yml
2022-09-19 09:55:06 +07:00

151 lines
4.0 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# полный реферерс тут
# https://docs.gitlab.com/ee/ci/yaml/index.html
# а тут доступные переменные
# https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
image: docker:20.10.16
variables:
REGISTRY: hub.bildme.ru
GITLAB: git.bildme.ru
IMAGE_NAME: $REGISTRY/$CI_PROJECT_PATH:latest
RELEASE_NAME: go-site
VERSION: 0.0.7
PACKAGE_REGISTRY_URL: https://${GITLAB}/api/v4/projects/${CI_PROJECT_ID}/packages/generic/${RELEASE_NAME}/${VERSION}
DOCKER_SERVER: 192.168.9.199
stages:
- test
- build
- push
- deploy-stage
- test-stage
- release
.rules: &rules
rules:
- if: $CI_COMMIT_TAG
when: never
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
test_code:
stage: test
image: golang:latest
<<: *rules
script:
- cd app
- CGO_ENABLED=0 GOOS=linux GO111MODULE=auto go test
tags:
- docker
build_main:
stage: build
image: golang:latest
<<: *rules
script:
- cd app
- CGO_ENABLED=0 GOOS=linux GO111MODULE=auto go build -a -ldflags="-X 'main.Version=v${VERSION}'" -installsuffix cgo -o go-site .
artifacts:
paths:
- app/go-site
tags:
- docker
push_image:
stage: push
<<: *rules
before_script:
- docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN $REGISTRY
script:
- docker build -t $IMAGE_NAME .
- docker push $IMAGE_NAME
tags:
- docker
deploy_stage:
stage: deploy-stage
image: hub.realmanual.ru/pub/openssh-client:latest
<<: *rules
before_script:
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan ${DOCKER_SERVER} >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- ssh root@${DOCKER_SERVER} "docker rm -f main-go; docker pull hub.bildme.ru/firstgroup/go-site && docker run -d --rm --name main-go -p 3000:3000 hub.bildme.ru/firstgroup/go-site:latest"
environment:
name: stage
url: http://${DOCKER_SERVER}:3000/
tags:
- docker
test_stage:
stage: test-stage
image: alpine
<<: *rules
script:
- apk --no-cache add curl
- "[ $(curl -sw '%{http_code}' --connect-timeout 2 'http://${DOCKER_SERVER}:3000/health' -o /dev/null) -ne 200 ] && exit 0 || exit 1"
tags:
- docker
package:
stage: release
<<: *rules
before_script:
- apk add curl
script:
- FILE_NAME=${RELEASE_NAME}
- cd app
- 'curl --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file ${FILE_NAME} ${PACKAGE_REGISTRY_URL}/${FILE_NAME}'
when:
manual
release:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
<<: *rules
script:
- echo "Release ${RELEASE_NAME}"
release:
name: 'Release $VERSION'
description: 'Release $VERSION'
tag_name: '$VERSION'
ref: '$CI_COMMIT_SHA'
assets:
links:
- name: '${RELEASE_NAME}'
url: '${PACKAGE_REGISTRY_URL}/${RELEASE_NAME}'
when:
manual
deploy_prod:
stage: release
image: hub.realmanual.ru/pub/openssh-client:latest
<<: *rules
before_script:
- eval $(ssh-agent -s)
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- ssh-keyscan ${DOCKER_SERVER} >> ~/.ssh/known_hosts
- chmod 644 ~/.ssh/known_hosts
script:
- ssh root@${DOCKER_SERVER} "docker rm -f main-go; docker pull hub.bildme.ru/firstgroup/go-site && docker run -d --rm --name main-go -p 3000:3000 hub.bildme.ru/firstgroup/go-site:latest"
environment:
name: production
url: http://${DOCKER_SERVER}:3000/
tags:
- docker
when:
manual
### Что можно добавить ?
### - версионирование тегов
### - возможность откатываться назад на версию (на нужную версию через ввод переменной)
### - тестирование кода линтером перед деплоем
### - возможность деплоя на два окружения (сценарий, когда сначала на стейдж, потом в ручную по тригеру на прод)