使用gitlab-ci 完成持续集成和持续部署
安装gitlab-runner
1.添加yum仓库
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
2.安装指定版本
yum install gitlab-runner-12.9.0-1
向gitlab 注册gitlab-runner
gitlab-runner register
根据提示信息添加对应的值
项目仓库添加.gitlab-ci.yml
采用引用模板的方式实现,这样方便调试,对开发影响不大,不用每次改动都通知开发进行变更.gitlab-ci.yml 文件
在gitlab 项目下添加.gitlab-ci.yml 文件内容如下
include:
- remote: 'http://xxx/test/ci-templates/raw/master/java.gitlab-ci.yml'
java.gitlab-ci.yml文件内容如下:
image: xxxx/xxx/maven-docker-kubectl:v0.0.1
include:
- remote: 'http://xxxx/xxx/ci-templates/raw/master/java.gitlab-cd.yml'
stages:
- rebase
- build
- deploy
variables:
MAVEN_CLI_OPTS: "-s /usr/local/maven/conf/settings_v1.xml"
MAVEN_OPTS: "-Dnexus-host=xxx.com -Dmaven.test.skip=true -DpushImage"
MAVEN_TEST_OPTS: "-Dmaven.test.skip=true -DpushImage -Dskywalking.collector.backend_service=127.0.0.1:11800"
DINGDING_TOKEN: "xxx"
DINGDING_KEYWORKD: "."
PROJECT_NAME: ${CI_PROJECT_NAME}
GIT_BRANCH: "${CI_COMMIT_REF_NAME}"
PROJECT_URL: "${CI_PROJECT_URL}/-/jobs/${CI_JOB_ID}"
VARIABLES_FILE: ./variables.txt
rebase:
stage: rebase
script:
- git rebase origin/master || ( dingtalk ${DINGDING_TOKEN} ${DINGDING_KEYWORKD} "Git rebase 失败了" ${PROJECT_NAME} ${GIT_BRANCH} ${PROJECT_URL} ;exit -1)
only:
- /^feature.*$/i
- /^fix.*$/i
test_build:
stage: build
script:
- dirName=$(find cloud-* -type f -name "pom.xml"|awk -F'/' '{print $1}')
- export appName=$(echo ${dirName}|tr '[A-Z]' '[a-z]')
- echo "export appName=$appName" > $VARIABLES_FILE
- export imageRepo="xxx.com/xxx/${appName}"
- export imageName=$(echo ${imageRepo}|tr '[A-Z]' '[a-z]')
- echo "export imageName=$imageName" >> $VARIABLES_FILE
- export imageTag=${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA:0:8}-$(date +%Y%m%d%H%M)
- export imageTag=$(echo ${imageTag}|tr '[A-Z]' '[a-z]')
- echo "export imageTag=$imageTag" >> $VARIABLES_FILE
- cat $VARIABLES_FILE
- cd ${dirName}
- mvn clean package docker:build $MAVEN_TEST_OPTS -Dversion_tag=$imageTag
artifacts:
paths:
- $VARIABLES_FILE
except:
- /^feature.*$/i
- /^fix.*$/i
build:
stage: build
script:
- dirName=$(find cloud-* -type f -name "pom.xml"|awk -F'/' '{print $1}')
- export appName=$(echo ${dirName}|tr '[A-Z]' '[a-z]')
- echo "export appName=$appName" > $VARIABLES_FILE
- export imageRepo="xxx.com/xxx/${appName}"
- export imageName=$(echo ${imageRepo}|tr '[A-Z]' '[a-z]')
- echo "export imageName=$imageName" >> $VARIABLES_FILE
- export imageTag=${CI_COMMIT_REF_NAME}-${CI_COMMIT_SHA:0:8}-$(date +%Y%m%d%H%M)
- export imageTag=$(echo ${imageTag}|tr '[A-Z]' '[a-z]')
- echo "export imageTag=$imageTag" >> $VARIABLES_FILE
- cat $VARIABLES_FILE
- cd ${dirName}
- mvn $MAVEN_CLI_OPTS clean package docker:build $MAVEN_OPTS -Dversion_tag=$imageTag
artifacts:
paths:
- $VARIABLES_FILE
only:
- /^feature.*$/i
- /^fix.*$/i
java.gitalb-cd.yaml 文件内容如下:
test:
stage: deploy
script:
- source $VARIABLES_FILE
- echo "$appName $imageName $imageTag"
- kubectl --kubeconfig=/.kube/config-dev -n test set image deploy/${appName} ${appName}=${imageName}:${imageTag}
needs:
- job: test_build
when: manual
except:
- /^feature.*$/i
- /^fix.*$/i
preline_deploy:
stage: deploy
script:
- kubectl --kubeconfig=/.kube/config-pre -n test set image deploy/${appName} ${appName}=${imageName}:${imageTag}
needs:
- job: build
when: manual
only:
- /^feature.*$/i
- /^fix.*$/i