| 知乎专栏 |
Java 缓存设置
image: maven:3.5.0-jdk-8
variables:
MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"
cache:
paths:
- .m2/repository/
- target/
stages:
- build
- test
- package
build:
stage: build
script: mvn compile
unittest:
stage: test
script: mvn test
package:
stage: package
script: mvn package
artifacts:
paths:
- target/java-project-0.0.1-SNAPSHOT.jar
Node 缓存设置
cache:
paths:
- node_modules
- dist
# variables:
# GIT_STRATEGY: clone
# GIT_STRATEGY: fetch
# GIT_CHECKOUT: "false"
stages:
- build
- test
- deploy
build-job:
stage: build
only:
- master
- testing
- development
script:
- echo "Compiling the code..."
# - cnpm cache verify
- cnpm install
- cnpm run build:stage
# - cnpm run build:prod
- echo "Compile complete."
test-job:
stage: test
variables:
GIT_STRATEGY: none
only:
- master
- testing
- development
script:
- echo "Running unit tests..."
- sed -i 's#192.168.20.180#192.168.30.4#g' dist/umi.*.js
- ls dist/*
# - rm -rf *.tar.gz
# - tar zcvf www.netkiller.cn.$(date -u +%Y-%m-%d.%H%M%S).tar.gz dist
# - ls *.tar.gz
- echo "Test complete."
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- dist/*
# - ./*.tar.gz
deploy-test-job:
stage: deploy
variables:
GIT_STRATEGY: none
only:
- testing
- development
script:
- echo "Deploying application..."
- rsync -auzv dist/* www@192.168.30.10:/opt/www.netkiller.cn/
- echo "Application successfully deployed."
deploy-prod-job:
stage: deploy
only:
- master
script:
- echo "Deploying application..."
- rsync -auzv --delete dist/* www@192.168.30.10:/opt/www.netkiller.cn/
- echo "Application successfully deployed."
缓存在所有流水线间是共享的,如果同时有两个JOB在跑,缓存就可能受到影响,这时可以使用 cache key 解决。
对每个分支的每个 job 使用不同的 cache :
cache:
key: ${CI_COMMIT_REF_SLUG}
每个分支的每个 job 使用不同的 stage:
cache:
key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
分支之间需要共享 cache,但是 pipeline 中的 job 之间的 cache 是相互独立的:
cache:
key: "$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG"
缓存只在相同 CI_PIPELINE_ID 中共享
cache:
key: ${CI_PIPELINE_ID}
当定义了全局 cahce 后,想在 job 中禁用 Cache
cache:
paths:
- node_modules
- dist
job:
cache: {}
定义 stages
stages: - build - test - deploy
dependencies 可以设置 job 的依赖关系
image: mileschou/php-testing-base:7.0
stages:
- build
- test
- deploy
build_job:
stage: build
script:
- composer install
cache:
untracked: true
artifacts:
paths:
- vendor/
test_job:
stage: test
script:
- php vendor/bin/codecept run
dependencies:
- build_job
deploy_job:
stage: deploy
script:
- echo Deploy OK
only:
- release
when: manual
job1:
variables:
FOLDERS: src test docs
script:
- |
for FOLDER in $FOLDERS
do
echo "The path is root/${FOLDER}"
done
使用 export 列出所有环境变量
build-job:
image: maven:3.8.2-openjdk-17
stage: build
# variables:
# accessKeyId: 123456
# accessSecret: 654321
tags:
- docker
before_script:
- export
- cat src/main/resources/application.properties
script:
- mvn clean package -Dmaven.test.skip=true
- ls target/*.jar
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- target/*.jar
$ export 21declare -x CI="true" 22declare -x CI_API_V4_URL="http://192.168.30.5/api/v4" 23declare -x CI_BUILDS_DIR="/builds" 24declare -x CI_BUILD_BEFORE_SHA="213825d0cfd133aadb2648b0c1236f834e98972b" 25declare -x CI_BUILD_ID="4705" 26declare -x CI_BUILD_NAME="build-job" 27declare -x CI_BUILD_REF="61fe2acb56474b4b2ffb289de2c7d93afe514354" 28declare -x CI_BUILD_REF_NAME="development" 29declare -x CI_BUILD_REF_SLUG="development" 30declare -x CI_BUILD_STAGE="build" 31declare -x CI_BUILD_TOKEN="[MASKED]" 32declare -x CI_COMMIT_AUTHOR="neo <neo@t.com>" 33declare -x CI_COMMIT_BEFORE_SHA="213825d0cfd133aadb2648b0c1236f834e98972b" 34declare -x CI_COMMIT_BRANCH="development" 35declare -x CI_COMMIT_DESCRIPTION="" 36declare -x CI_COMMIT_MESSAGE="更新.gitlab-ci.yml文件" 37declare -x CI_COMMIT_REF_NAME="development" 38declare -x CI_COMMIT_REF_PROTECTED="true" 39declare -x CI_COMMIT_REF_SLUG="development" 40declare -x CI_COMMIT_SHA="61fe2acb56474b4b2ffb289de2c7d93afe514354" 41declare -x CI_COMMIT_SHORT_SHA="61fe2acb" 42declare -x CI_COMMIT_TIMESTAMP="2021-09-18T07:00:58+00:00" 43declare -x CI_COMMIT_TITLE="更新.gitlab-ci.yml文件" 44declare -x CI_CONCURRENT_ID="0" 45declare -x CI_CONCURRENT_PROJECT_ID="0" 46declare -x CI_CONFIG_PATH=".gitlab-ci.yml" 47declare -x CI_DEFAULT_BRANCH="development" 48declare -x CI_DEPENDENCY_PROXY_GROUP_IMAGE_PREFIX="192.168.30.5:80/neo/dependency_proxy/containers" 49declare -x CI_DEPENDENCY_PROXY_PASSWORD="[MASKED]" 50declare -x CI_DEPENDENCY_PROXY_SERVER="192.168.30.5:80" 51declare -x CI_DEPENDENCY_PROXY_USER="gitlab-ci-token" 52declare -x CI_DISPOSABLE_ENVIRONMENT="true" 53declare -x CI_JOB_ID="4705" 54declare -x CI_JOB_IMAGE="maven:3.8.2-openjdk-17" 55declare -x CI_JOB_JWT="[MASKED]" 56declare -x CI_JOB_NAME="build-job" 57declare -x CI_JOB_STAGE="build" 58declare -x CI_JOB_STARTED_AT="2021-09-18T07:01:07Z" 59declare -x CI_JOB_STATUS="running" 60declare -x CI_JOB_TOKEN="[MASKED]" 61declare -x CI_JOB_URL="http://192.168.30.5/neo/alertmanager-webhook/-/jobs/4705" 62declare -x CI_NODE_TOTAL="1" 63declare -x CI_PAGES_DOMAIN="example.com" 64declare -x CI_PAGES_URL="http://neo.example.com/alertmanager-webhook" 65declare -x CI_PIPELINE_CREATED_AT="2021-09-18T07:00:58Z" 66declare -x CI_PIPELINE_ID="1866" 67declare -x CI_PIPELINE_IID="100" 68declare -x CI_PIPELINE_SOURCE="push" 69declare -x CI_PIPELINE_URL="http://192.168.30.5/neo/alertmanager-webhook/-/pipelines/1866" 70declare -x CI_PROJECT_CLASSIFICATION_LABEL="" 71declare -x CI_PROJECT_DIR="/builds/neo/alertmanager-webhook" 72declare -x CI_PROJECT_ID="23" 73declare -x CI_PROJECT_NAME="alertmanager-webhook" 74declare -x CI_PROJECT_NAMESPACE="neo" 75declare -x CI_PROJECT_PATH="neo/alertmanager-webhook" 76declare -x CI_PROJECT_PATH_SLUG="neo-alertmanager-webhook" 77declare -x CI_PROJECT_REPOSITORY_LANGUAGES="java" 78declare -x CI_PROJECT_ROOT_NAMESPACE="neo" 79declare -x CI_PROJECT_TITLE="Alertmanager Webhook" 80declare -x CI_PROJECT_URL="http://192.168.30.5/neo/alertmanager-webhook" 81declare -x CI_PROJECT_VISIBILITY="public" 82declare -x CI_REGISTRY_PASSWORD="[MASKED]" 83declare -x CI_REGISTRY_USER="gitlab-ci-token" 84declare -x CI_REPOSITORY_URL="http://gitlab-ci-token:[MASKED]@192.168.30.5/neo/alertmanager-webhook.git" 85declare -x CI_RUNNER_DESCRIPTION="development" 86declare -x CI_RUNNER_EXECUTABLE_ARCH="linux/amd64" 87declare -x CI_RUNNER_ID="23" 88declare -x CI_RUNNER_REVISION="58ba2b95" 89declare -x CI_RUNNER_SHORT_TOKEN="GP-ozvd6" 90declare -x CI_RUNNER_TAGS="docker" 91declare -x CI_RUNNER_VERSION="14.2.0" 92declare -x CI_SERVER="yes" 93declare -x CI_SERVER_HOST="192.168.30.5" 94declare -x CI_SERVER_NAME="GitLab" 95declare -x CI_SERVER_PORT="80" 96declare -x CI_SERVER_PROTOCOL="http" 97declare -x CI_SERVER_REVISION="2da7c857960" 98declare -x CI_SERVER_URL="http://192.168.30.5" 99declare -x CI_SERVER_VERSION="14.2.1" 100declare -x CI_SERVER_VERSION_MAJOR="14" 101declare -x CI_SERVER_VERSION_MINOR="2" 102declare -x CI_SERVER_VERSION_PATCH="1" 103declare -x FF_CMD_DISABLE_DELAYED_ERROR_LEVEL_EXPANSION="false" 104declare -x FF_DISABLE_UMASK_FOR_DOCKER_EXECUTOR="false" 105declare -x FF_ENABLE_BASH_EXIT_CODE_CHECK="false" 106declare -x FF_GITLAB_REGISTRY_HELPER_IMAGE="true" 107declare -x FF_NETWORK_PER_BUILD="false" 108declare -x FF_SCRIPT_SECTIONS="false" 109declare -x FF_SKIP_DOCKER_MACHINE_PROVISION_ON_CREATION_FAILURE="true" 110declare -x FF_SKIP_NOOP_BUILD_STAGES="true" 111declare -x FF_USE_DIRECT_DOWNLOAD="true" 112declare -x FF_USE_DYNAMIC_TRACE_FORCE_SEND_INTERVAL="false" 113declare -x FF_USE_FASTZIP="false" 114declare -x FF_USE_LEGACY_KUBERNETES_EXECUTION_STRATEGY="false" 115declare -x FF_USE_NEW_BASH_EVAL_STRATEGY="false" 116declare -x FF_USE_POWERSHELL_PATH_RESOLVER="false" 117declare -x FF_USE_WINDOWS_LEGACY_PROCESS_STRATEGY="true" 118declare -x GITLAB_CI="true" 119declare -x GITLAB_FEATURES="" 120declare -x GITLAB_USER_EMAIL="neo@t.com" 121declare -x GITLAB_USER_ID="2" 122declare -x GITLAB_USER_LOGIN="neo" 123declare -x GITLAB_USER_NAME="neo" 124declare -x HOME="/root" 125declare -x HOSTNAME="runner-gp-ozvd6-project-23-concurrent-0" 126declare -x JAVA_HOME="/usr/java/openjdk-17" 127declare -x JAVA_VERSION="17" 128declare -x LANG="C.UTF-8" 129declare -x MAVEN_HOME="/usr/share/maven" 130declare -x OLDPWD="/" 131declare -x PATH="/usr/java/openjdk-17/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" 132declare -x PWD="/builds/neo/alertmanager-webhook" 133declare -x SHLVL="1"
job:
variables:
DEPLOY_VARIABLE: "default-deploy"
rules:
- if: $CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH
variables: # Override DEPLOY_VARIABLE defined
DEPLOY_VARIABLE: "deploy-production" # at the job level.
- if: $CI_COMMIT_REF_NAME =~ /feature/
variables:
IS_A_FEATURE: "true" # Define a new variable.
script:
- echo "Run script with $DEPLOY_VARIABLE as an argument"
- echo "Run another script if $IS_A_FEATURE exists"
例子
build-job:
stage: build
image: registry.ejiayou.com/share/maven:3.8.6-openjdk-8
variables:
VERSION: -SNAPSHOT
rules:
- if: $CI_COMMIT_BRANCH == master
variables:
VERSION: ".RELEASE"
- if: $CI_COMMIT_BRANCH == grey
variables:
VERSION: ".RELEASE"
before_script:
- rm -rf /root/.m2/repository/com/other/*
- sed -i "s/\"dev\"/\"${CI_COMMIT_BRANCH}\"/" ${MODULE}/src/main/resources/log4j2.xml
- sed -i "s/2\.3\.7\.RELEASE/2\.7\.7/" ${MODULE}/pom.xml
script:
- mvn -U -T 1C clean package -Densd.version=$VERSION
after_script:
- md5sum ${MODULE}/target/*.jar
only:
- dev
- test
- grey
- master
tags:
- kubernetes
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- ${MODULE}/target/*.jar
before_script: 在 pipeline 运行前执行脚本
after_script: 在 pipeline 完成之后执行脚本
cache:
paths:
- node_modules
- dist
before_script:
- cnpm install
stages:
- build
- test
- deploy
build-dev-job:
stage: build
only:
- development
script:
- npm run build:dev
build-test-job:
stage: build
only:
- testing
script:
- npm run build:stage
build-prod-job:
stage: build
only:
- master
script:
- npm run build:prod
test-job:
stage: test
variables:
GIT_STRATEGY: none
script:
- echo "Running unit tests..."
- find dist/
- echo "Test complete."
deploy-dev-job:
stage: deploy
variables:
GIT_STRATEGY: none
only:
- development
script:
- echo "Deploying application..."
- rsync -auzv --delete dist/* www@192.168.30.11:/opt/netkiller.cn/admin.netkiller.cn/
- echo "Application successfully deployed."
deploy-test-job:
stage: deploy
variables:
GIT_STRATEGY: none
only:
- testing
script:
- echo "Deploying application..."
- rsync -auzv --delete dist/* www@192.168.30.10:/opt/netkiller.cn/admin.netkiller.cn/
- echo "Application successfully deployed."
deploy-prod-job:
stage: deploy
variables:
GIT_STRATEGY: none
only:
- master
script:
- echo "Deploying application..."
- rsync -auzv --delete dist/* www@139.16.10.12:/opt/netkiller.cn/admin.netkiller.cn/
- echo "Application successfully deployed."
script:
- (if [ "$flag" == "true" ]; then kubectl apply -f demo1 --record=true; else kubectl apply -f demo2 --record=true; fi);
deploy-dev:
image: maven
environment: dev
tags:
- kubectl
script:
- if [ "$flag" == "true" ]; then MODULE="demo1"; else MODULE="demo2"; fi
- kubectl apply -f ${MODULE} --record=true
release-job:
stage: release
tags:
- shell
only:
- master
script:
- |
echo -e "
@sfzito:registry=http://${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/
//${CI_SERVER_HOST}/api/v4/projects/${CI_PROJECT_ID}/packages/npm/:_authToken=${CI_JOB_TOKEN}
" > .npmrc
- cnpm publish
when: manual
script: |
if [ "$flag" == "true" ]; then
kubectl apply -f demo1 --record=true
else
kubectl apply -f demo2 --record=true
fi
deploy-dev:
image: testimage
environment: dev
tags:
- kubectl
script:
- >
if [ "$flag" == "true" ]; then
kubectl apply -f demo1 --record=true
else
kubectl apply -f demo2 --record=true
fi
only 用于匹配分支
deploy_job:
stage: deploy
script:
- echo Deploy OK
only:
- master
when: manual
only 可是使用正则表达式,还可能与 except 一同使用,用于排除分支
job:
# use regexp
only:
- /^issue-.*$/
# use special keyword
except:
- branches
使用关键字
job:
# use special keywords
only:
- tags
- triggers
only和except允许使用特殊的关键字:
only: # 只对 feature/.* 开头 和 以 feature-.* 开头分支有效
- /^feature\/.*$/
- /^feature-.*$/
- /^hotfix\/.*$/
- /^hotfix-.*$/
匹配 feature / hotfix 分支
deploy-feature-job:
stage: deploy
variables:
GIT_STRATEGY: none
HOST: 192.168.30.14
# DOCKER_HOST: unix:///var/run/docker.sock mvn clean install docker:build
environment:
name: feature
url: https://api.netkiller.cn
only:
- /^feature\/.*/
tags:
- shell
before_script:
- mvn docker:build -DpushImage
- rm -rf *.sql.gz
- mysqldump -hmysql.netkiller.cn test | gzip > test.$(date -u +%Y-%m-%d.%H:%M:%S).sql.gz
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- ./*.sql.gz
script:
- scp src/main/docker/docker-compose.yaml www@$HOST:/opt/netkiller.cn/api.netkiller.cn/
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml up"
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml restart"
when: manual
deploy-hotfix-job:
stage: deploy
variables:
GIT_STRATEGY: none
HOST: 192.168.30.14
environment:
name: hotfix
url: https://api.netkiller.cn
only:
- /^hotfix\/.*/
tags:
- shell
before_script:
- mvn docker:build -DpushImage
- rm -rf *.sql.gz
- mysqldump -hmysql.netkiller.cn test | gzip > test.$(date -u +%Y-%m-%d.%H:%M:%S).sql.gz
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- ./*.sql.gz
script:
- scp src/main/docker/docker-compose.yaml www@$HOST:/opt/netkiller.cn/api.netkiller.cn/
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml up"
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml restart"
when: manual
保留 api.netkiller.cn/target/*.jar 文件
cache:
# untracked: true
paths:
- api.netkiller.cn/target/
stages:
- build
- test
- deploy
- database
build-job:
stage: build
before_script:
- wechat -t 1 api.netkiller.cn $CI_COMMIT_AUTHOR 在 $CI_COMMIT_BRANCH 分支提交了代码 $CI_COMMIT_MESSAGE 正在构建中
- voice $(echo "$CI_COMMIT_AUTHOR" | cut -d ' ' -f1) 在 API 项目 $CI_COMMIT_BRANCH 分支提交了代码,正在构建中
- if [ "$CI_PIPELINE_SOURCE" == "schedule" ]; then mvn clean; fi
after_script:
- wechat -t 1 api.netkiller.cn $CI_COMMIT_AUTHOR 在 $CI_COMMIT_BRANCH 分支代码完成编译和打包
script:
- mvn -T 1C -Dmaven.test.skip=true package
- md5sum */target/*.jar
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- api.netkiller.cn/target/*.jar
所有git没有追踪的文件视为构建物
artifacts: untracked: true
设置当一个job运行失败之后并不影响后续的CI构建过程
job1: stage: build script: - execute_script_that_will_fail job2: stage: test script: - execute_script_that_will_succeed allow_failure: true job3: stage: deploy script: - deploy_to_staging
when: 可以是on_success,on_failure,always或者manual
when可以设置以下值:
services: - mysql variables: # Configure mysql service (https://hub.docker.com/_/mysql/) MYSQL_DATABASE: hello_world_test MYSQL_ROOT_PASSWORD: mysql connect: image: mysql script: - echo "SELECT 'OK';" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
在 gitlab-runner register 的时候会提示:Please enter the gitlab-ci tags for this runner (comma separated):
如果你输入了标签就需要在 Pipeline 中设置 tags 否则 Pipeline 将不运行。
only:
- master
tags:
- ansible
# This file is a template, and might need editing before it works on your project.
# This is a sample GitLab CI/CD configuration file that should run without any modifications.
# It demonstrates a basic 3 stage CI/CD pipeline. Instead of real tests or scripts,
# it uses echo commands to simulate the pipeline execution.
#
# A pipeline is composed of independent jobs that run scripts, grouped into stages.
# Stages run in sequential order, but jobs within stages run in parallel.
#
# For more information, see: https://docs.gitlab.com/ee/ci/yaml/README.html#stages
stages: # List of stages for jobs, and their order of execution
- build
- test
- deploy
build-job: # This job runs in the build stage, which runs first.
stage: build
tags:
- neo
script:
- echo "Compiling the code..."
- echo "Compile complete."
unit-test-job: # This job runs in the test stage.
stage: test # It only starts when the job in the build stage completes successfully.
tags:
- neo
script:
- echo "Running unit tests... This will take about 60 seconds."
- sleep 60
- echo "Code coverage is 90%"
lint-test-job: # This job also runs in the test stage.
stage: test # It can run at the same time as unit-test-job (in parallel).
script:
- echo "Linting code... This will take about 10 seconds."
- sleep 10
- echo "No lint issues found."
deploy-job: # This job runs in the deploy stage.
stage: deploy # It only runs when *both* jobs in the test stage complete successfully.
script:
- echo "Deploying application..."
- echo "Application successfully deployed."
job-name:
script:
- echo "i am potato"
rules:
- if: '$CI_COMMIT_BRANCH != "potato"'
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "schedule"'
when: never
- if: '$CI_PIPELINE_SOURCE == "push"'
when: never
- when: always
job:
script: "echo Hello, Rules!"
rules:
- if: '$CI_MERGE_REQUEST_TARGET_BRANCH_NAME == "master"'
when: always
- if: '$VAR =~ /pattern/'
when: manual
- when: on_success
include:
- local: '.gitlab-ci-development.yml'
rules:
- if: '$CI_COMMIT_BRANCH == "development"'
- local: '.gitlab-ci-staging.yml'
rules:
- if: '$CI_COMMIT_BRANCH == "staging"'
include:
- local: builds.yml
rules:
- exists:
- file.md
include: 'configs/*.yml' # This matches all `.yml` files in `configs` and any subfolder in it. include: 'configs/**.yml' # This matches all `.yml` files only in subfolders of `configs`. include: 'configs/**/*.yml'
demo1-deploy-dev:
extends: .deploy-dev
only:
variables: [ $flag == "true" ]
variables:
MODULE: demo1
demo2-deploy-dev:
extends: .deploy-dev
only:
variables: [ $flag == "false" ]
variables:
MODULE: demo2
.deploy-dev:
image: testimage
environment: dev
tags:
- kubectl
script:
- kubectl apply -f ${MODULE} --record=true
cache:
untracked: true
stages:
- build
# - test
- deploy
build development:
stage: build
tags:
- cloud
only:
- development
except:
- feature
script:
- mvn -T 1C -Dmaven.test.skip=true clean package
# when: manual
# unit-test-job:
# stage: test
# script:
# - echo "Running unit tests... This will take about 60 seconds."
# - echo "Code coverage is 90%"
# lint-test-job:
# stage: test
# script:
# - echo "Linting code... This will take about 10 seconds."
# - echo "No lint issues found."
deploy development:
stage: deploy
tags:
- cloud
only:
- development
script:
- \cp -f auth/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f gateway/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f modules/*/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
after_script:
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment up
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment restart
when: manual
gateway-dev:
extends: .deploy-dev
# only:
# variables: [ $flag == "true" ]
variables:
MODULE: gateway
environment:
url: https://${MODULE}.netkiller.cn
script:
- \cp -f ${MODULE}/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
auth-dev:
extends: .deploy-dev
variables:
MODULE: auth
script:
- \cp -f ${MODULE}/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
queue-dev:
extends: .deploy-dev
variables:
MODULE: incar
script:
- \cp -f modules/queue/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
ms-dev:
extends: .deploy-dev
variables:
MODULE: ms
script:
- \cp -f modules/ms/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
system-dev:
extends: .deploy-dev
variables:
MODULE: system
script:
- \cp -f modules/system/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
job-dev:
extends: .deploy-dev
variables:
MODULE: job
script:
- \cp -f modules/job/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
.deploy-dev:
stage: deploy
tags:
- cloud
only:
- development
environment:
name: development
when: manual
# before_script:
# - mvn -T 1C -Dmaven.test.skip=true clean package
# - python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment ps
after_script:
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment up ${MODULE}
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment restart ${MODULE}
stages:
- build
- test
- deploy
- release
release_job:
stage: release
image: registry.gitlab.com/gitlab-org/release-cli:latest
tags:
- docker
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created manually
script:
- echo 'Running the release job.'
release:
name: 'Release $CI_COMMIT_TAG'
tag_name: '$CI_COMMIT_TAG'
description: 'Release created using the release-cli.'
![]() |
before_script: - echo "Execute scripts which are required to bootstrap the application. !" after_script: - echo "Clean up activity can be done here !." stages: - build - test - package - deploy variables: MAVEN_CLI_OPTS: "--batch-mode" MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository" cache: paths: - .m2/repository/ - target/ build: stage: build image: maven:latest script: - mvn $MAVEN_CLI_OPTS clean compile test: stage: test image: maven:latest script: - mvn $MAVEN_CLI_OPTS test package: stage: package image: maven:latest script: - mvn $MAVEN_CLI_OPTS package artifacts: paths: [target/test-0.0.1.war] deploy_test: stage: deploy script: - echo "######## To be defined ########" environment: staging deploy_prod: stage: deploy script: - echo "######## To be defined ########" only: - master environment: production
#image: java:8
#image: maven:latest
image: maven:3.5.0-jdk-8
stages:
- build
- test
- package
build:
stage: build
script: mvn compile
unittest:
stage: test
script: mvn test
package:
stage: package
script: mvn package
artifacts:
paths:
- target/java-project-0.0.1-SNAPSHOT.jar
cache:
untracked: true
stages:
- build
- test
- deploy
build-job:
stage: build
tags:
- shell
script:
- mvn clean package -Dmaven.test.skip=true
- ls target/*.jar
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- target/*.jar
test-job:
stage: test
variables:
GIT_STRATEGY: none
only:
- tags
- testing
script:
- mvn test
deploy-job:
stage: deploy
variables:
GIT_STRATEGY: none
HOST: 192.168.30.14
environment:
name: development
url: https://api.netkiller.cn
only:
- development
tags:
- shell
before_script:
- rm -rf *.sql.gz
- mysqldump -hmysql.netkiller.cn test | gzip > test.$(date -u +%Y-%m-%d.%H:%M:%S).sql.gz
# after_script:
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- ./*.sql.gz
script:
- rsync -auzv target/*.jar www@$HOST:/opt/netkiller.cn/api.netkiller.cn/
- ssh -f -C -q www@$HOST "pkill java; sleep 5; java -jar /opt/netkiller.cn/api.netkiller.cn/alertmanager-0.0.1.jar >/dev/null 2>&1 &"
cache:
untracked: true
stages:
- build
- test
- deploy
build-job:
stage: build
tags:
- shell
script:
- mvn clean package -Dmaven.test.skip=true
- ls target/*.jar
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- target/*.jar
test-job:
stage: test
variables:
GIT_STRATEGY: none
only:
- tags
- testing
script:
- mvn test
deploy-job:
stage: deploy
variables:
GIT_STRATEGY: none
HOST: 192.168.30.14
environment:
name: development
url: https://api.netkiller.cn
only:
- development
tags:
- shell
before_script:
- rm -rf *.sql.gz
- mysqldump -hmysql.netkiller.cn test | gzip > test.$(date -u +%Y-%m-%d.%H:%M:%S).sql.gz
# after_script:
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- ./*.sql.gz
script:
- rsync -auzv target/*.jar www@$HOST:/opt/netkiller.cn/api.netkiller.cn/
- rsync -auzv src/main/docker/development/docker-compose.yaml www@$HOST:/opt/netkiller.cn/api.netkiller.cn/
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml up -d api"
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml restart api"
cache:
untracked: true
stages:
- build
- test
- deploy
build-job:
image: maven:3.8.2-openjdk-17
stage: build
tags:
- docker
script:
- mvn clean package -Dmaven.test.skip=true
- ls target/*.jar
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- target/*.jar
test-job:
image: maven:3.8.2-openjdk-17
stage: test
variables:
GIT_STRATEGY: none
tags:
- docker
script:
- mvn test
deploy-job:
stage: deploy
variables:
GIT_STRATEGY: none
HOST: 192.168.30.14
environment:
name: development
url: https://api.netkiller.cn
only:
- development
tags:
- shell
before_script:
# - DOCKER_HOST=unix:///var/run/docker.sock mvn clean install docker:build
- mvn docker:build -DpushImage
# - mvn docker:push
- rm -rf *.sql.gz
- mysqldump -hmysql.netkiller.cn test | gzip > test.$(date -u +%Y-%m-%d.%H:%M:%S).sql.gz
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- ./*.sql.gz
script:
- scp src/main/docker/docker-compose.yaml www@$HOST:/opt/netkiller.cn/api.netkiller.cn/
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml up"
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml restart"
cache:
paths:
- node_modules
# - dist
stages:
- build
# - test
- deploy
build-job:
stage: build
script:
- npm install
# - yarn install
# - yarn run build
# unit-test-job:
# stage: test
# script:
# - yarn run test
# lint-test-job:
# stage: test
# script:
# - yarn run lint
deploy-job:
stage: deploy
script:
- rsync -auzv --delete * www@192.168.30.10:/opt/netkiller.cn/www.netkiller.cn/
- ssh www@192.168.0.10 "sudo pm2 --update-env restart /opt/netkiller.cn/www.netkiller.cn/main.js"
build site:
image: node:6
stage: build
script:
- npm install --progress=false
- npm run build
artifacts:
expire_in: 1 week
paths:
- dist
unit test:
image: node:6
stage: test
script:
- npm install --progress=false
- npm run unit
deploy:
image: alpine
stage: deploy
script:
- apk add --no-cache rsync openssh
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" >> ~/.ssh/id_dsa
- chmod 600 ~/.ssh/id_dsa
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
- rsync -rav --delete dist/ user@server.com:/your/project/path/
cache:
# key: $CI_COMMIT_REF_SLUG
paths:
- .pytest_cache
- __pycache__
stages:
- build
- test
- report
build-job:
stage: build
tags:
- shell
script:
- pip3 install -r requirements.txt
unit-test-job:
stage: test
tags:
- shell
before_script:
- wechat -t 2 开始接口自动化测试
after_script:
- wechat -t 2 接口自动化测试完成
script:
- cd api_test
- pytest --no-header --tb=no --alluredir=/dev/shm/allure-results --clean-alluredir | wechat -t 2 --stdin
# - wechat -t 2 "$(cat output.log)"
# lint-test-job:
# stage: test
# tags:
# - shell
# script:
# - pip3 install pylint
# - pylint -j 4 api_test/*
report-job:
stage: report
tags:
- shell
after_script:
- wechat -t 2 测试报告 http://test.netkiller.cn/test/index.html
script:
- allure generate /dev/shm/allure-results -o /dev/shm/allure-report --clean
- lrsync '/dev/shm/allure-report/*' www@test.netkiller.cn:/opt/netkiller.cn/test.netkiller.cn/test/
cache:
untracked: true
stages:
- build
- test
- deploy
build-job:
image: maven:3.8.2-openjdk-17
stage: build
tags:
- docker
script:
- mvn clean package -Dmaven.test.skip=true
- ls target/*.jar
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- target/*.jar
test-job:
image: maven:3.8.2-openjdk-17
stage: test
variables:
GIT_STRATEGY: none
tags:
- docker
script:
- mvn test
deploy-job:
stage: deploy
variables:
GIT_STRATEGY: none
HOST: 192.168.30.14
DOCKER_HOST: unix:///var/run/docker.sock mvn clean install docker:build
environment:
name: development
url: https://api.netkiller.cn
only:
- development
tags:
- shell
before_script:
- mvn docker:build -DpushImage
# - mvn docker:push
- rm -rf *.sql.gz
- mysqldump -hmysql.netkiller.cn test | gzip > test.$(date -u +%Y-%m-%d.%H:%M:%S).sql.gz
artifacts:
name: "$CI_PROJECT_NAME"
paths:
- ./*.sql.gz
script:
- scp src/main/docker/docker-compose.yaml www@$HOST:/opt/netkiller.cn/api.netkiller.cn/
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml up"
- ssh www@$HOST "sudo docker-compose -f /opt/netkiller.cn/api.netkiller.cn/docker-compose.yaml restart"
.gitlab-ci.yml
cache:
key: ${CI_COMMIT_REF_SLUG}
# untracked: true
paths:
- dist
stages:
- build
# - test
- deploy
# - docker
build-job:
stage: build
tags:
- feature
only:
- split
except:
- development
script:
# - mvn -T 1C -Dmaven.test.skip=true clean package
- mvn -Dmaven.test.skip=true clean package
include:
- '.gitlab-ci-docker.yml'
- local: '.gitlab-ci-development.yml'
rules:
- if: '$CI_COMMIT_BRANCH == "development"'
- local: '.gitlab-ci-staging.yml'
rules:
- if: '$CI_COMMIT_BRANCH == "staging"'
.gitlab-ci-development.yml
build development:
stage: build
# tags:
# - cloud
only:
- development
except:
- feature
before_script:
- rm -rf dist && mkdir -p dist
script:
- mvn -T 1C -Dmaven.test.skip=true clean package
# - mvnd clean package
after_script:
- find . \( ! -path "*/common/*" -a ! -path "*/lib/*" -a ! -path "./dist/*" -a ! -path "./api/*" \) -type f -name "*.jar" -exec \cp -af {} dist \;
- find dist/ -type f -name "*.jar" -exec md5sum {} \;
# when: manual
all-in-one:
stage: deploy
# tags:
# - cloud
only:
- development
script:
# - \cp -af auth/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
# - \cp -af gateway/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
# - \cp -af modules/*/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
# - \cp -af visual/*/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -af dist/*.jar /opt/netkiller.cn/cloud.netkiller.cn
after_script:
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment up auth incar ms system job activiti chain gateway
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment restart up auth incar ms system job activiti chain gateway
when: manual
gateway:
extends: .deploy-dev
# only:
# variables: [ $flag == "true" ]
variables:
MODULE: gateway
environment:
url: https://${MODULE}.netkiller.cn
script:
- \cp -af dist/${MODULE}.jar /opt/netkiller.cn/cloud.netkiller.cn
auth:
extends: .deploy-dev
variables:
MODULE: auth
script:
- \cp -af dist/${MODULE}.jar /opt/netkiller.cn/cloud.netkiller.cn
incar:
extends: .deploy-dev
variables:
MODULE: incar
script:
- \cp -af modules/incar/src/main/resources/CFCA /opt/netkiller.cn/cloud.netkiller.cn/
- \cp -af dist/incar.jar /opt/netkiller.cn/cloud.netkiller.cn
ms:
extends: .deploy-dev
variables:
MODULE: ms
script:
- \cp -af dist/ms.jar /opt/netkiller.cn/cloud.netkiller.cn
system:
extends: .deploy-dev
variables:
MODULE: system
script:
- \cp -af dist/system.jar /opt/netkiller.cn/cloud.netkiller.cn
job:
extends: .deploy-dev
variables:
MODULE: job
script:
- \cp -af dist/job.jar /opt/netkiller.cn/cloud.netkiller.cn
activiti:
extends: .deploy-dev
variables:
MODULE: activiti
script:
- \cp -af dist/activiti.jar /opt/netkiller.cn/cloud.netkiller.cn
chain:
extends: .deploy-dev
variables:
MODULE: chain
script:
- \cp -af dist/chain.jar /opt/netkiller.cn/cloud.netkiller.cn
msg:
extends: .deploy-dev
variables:
MODULE: msg
script:
- \cp -af dist/msg.jar /opt/netkiller.cn/cloud.netkiller.cn
xxl-job-admin:
extends: .deploy-dev
variables:
MODULE: xxl-job-admin
script:
- \cp -af dist/xxl-job-admin.jar /opt/netkiller.cn/cloud.netkiller.cn
ev:
extends: .deploy-dev
variables:
MODULE: ev
script:
- \cp -af dist/ev.jar /opt/netkiller.cn/cloud.netkiller.cn
sfapi:
extends: .deploy-dev
variables:
MODULE: sfapi
script:
- \cp -af dist/sfapi.jar /opt/netkiller.cn/cloud.netkiller.cn
.deploy-dev:
stage: deploy
# tags:
# - cloud
only:
- development
environment:
name: development
when: manual
# before_script:
# - mvn -T 1C -Dmaven.test.skip=true clean package
after_script:
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment up ${MODULE}
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment restart ${MODULE}
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment ps ${MODULE}
.gitlab-ci-staging.yml
staging build:
stage: build
only:
- staging
except:
- feature
before_script:
- rm visual/report-platform/src/main/resources/bootstrap.yml
- rm visual/report-platform/src/main/resources/bootstrap-stage.yml
# - mv visual/report-platform/src/main/resources/bootstrap-stage.yml visual/report-platform/src/main/resources/bootstrap.yml
- ls visual/report-platform/src/main/resources/
script:
- mvn -T 1C -Dmaven.test.skip=true clean package
staging:
stage: deploy
only:
- staging
script:
- \cp -f auth/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f gateway/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f modules/*/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f visual/*/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
after_script:
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e stage up
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e stage restart
when: manual
report:
extends: .deploy-template
variables:
MODULE: report
environment:
url: https://report.netkiller.cn
script:
- wechat -t 3 report.netkiller.cn $CI_COMMIT_AUTHOR Stage 环境「正在部署」
- rsync -auzv visual/report-platform/target/*.jar docker@$HOST:/opt/netkiller.cn/cloud.netkiller.cn/
gateway:
extends: .deploy-template
# only:
# variables: [ $flag == "true" ]
variables:
MODULE: gateway
environment:
url: https://${MODULE}.netkiller.cn
script:
- \cp -f ${MODULE}/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
auth:
extends: .deploy-template
variables:
MODULE: auth
script:
- \cp -f ${MODULE}/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
incar:
extends: .deploy-template
variables:
MODULE: incar
script:
- \cp -f modules/incar/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
ms:
extends: .deploy-template
variables:
MODULE: ms
script:
- \cp -f modules/ms/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
system:
extends: .deploy-template
variables:
MODULE: system
script:
- \cp -f modules/system/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
job:
extends: .deploy-template
variables:
MODULE: job
script:
- \cp -f modules/job/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
.deploy-template:
stage: deploy
variables:
HOST: uat.netkiller.cn
# tags:
# - cloud
only:
- staging
environment:
name: staging
when: manual
before_script:
- ssh docker@$HOST "sqldump stage -z"
- wechat -t 3 ${MODULE}.netkiller.cn $CI_COMMIT_AUTHOR Stage 环境「备份数据库」
# - ssh docker@$HOST "mdump stage -z"
# - ssh docker@$HOST "cp /opt/netkiller.cn/api.netkiller.cn/admin.jar /opt/backup/admin.$(date +%Y-%m-%d.%H:%M:%S).jar"
# - rm -rf *.json.gz
# - redis-dump -h 192.168.30.10 -d '0' | gzip > redis.db0.$(date +%Y-%m-%d.%H:%M:%S).json.gz
# - ssh docker@$HOST "sudo docker-compose -f /opt/netkiller.cn/ops.netkiller.cn/docker-compose.yaml exec -it redis redis-cli -n 0 flushdb"
after_script:
# - md5sum admin/target/*.jar
- ssh docker@$HOST "md5sum /opt/netkiller.cn/cloud.netkiller.cn/*.jar"
- ssh docker@$HOST "python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e stage up ${MODULE}"
- ssh docker@$HOST "python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e stage restart ${MODULE}"
- ssh docker@$HOST "python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e stage ps"
- wechat -t 3 ${MODULE}.netkiller.cn $CI_COMMIT_AUTHOR Stage 环境「完成部署」
.gitlab-ci-feature.yml
build-feature-job:
stage: build
tags:
- feature
only:
- feature
except:
- feature
script:
- mvn -T 1C -Dmaven.test.skip=true clean package
# when: manual
# unit-test-job:
# stage: test
# script:
# - echo "Running unit tests... This will take about 60 seconds."
# - echo "Code coverage is 90%"
# lint-test-job:
# stage: test
# script:
# - echo "Linting code... This will take about 10 seconds."
# - echo "No lint issues found."
deploy-feature-job:
stage: build
tags:
- cloud
# variables:
# HOST: 192.168.30.7
environment:
name: feature
url: https://api.netkiller.cn
only:
# - /^feature\/.*/
- feature
before_script:
- mvn -T 1C -Dmaven.test.skip=true clean package
after_script:
# - python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment up
- python3 /opt/netkiller.cn/ops.netkiller.cn/docker.py -e experiment restart
- wechat -t 1 cloud.netkiller.cn $CI_COMMIT_AUTHOR 在 $CI_COMMIT_BRANCH 部署完毕
# - voice 环境部署完成
script:
- \cp -f auth/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f gateway/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f modules/*/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
- \cp -f visual/*/target/*.jar /opt/netkiller.cn/cloud.netkiller.cn
# - cp -r admin/src/main/resources/CFCA /opt/netkiller.cn/api.netkiller.cn/
# when: manual