知乎专栏 |
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