本文最后更新于:2023年4月21日 上午
gitlab的CI/CD
在日常开发过程中难免会因为某些原因需要做gitlab
的CI/CD
。总的来说这玩意其实并不复杂,如果没有做过这一块,很可能里面的一些东西搞不清楚,导致卡壳很久,浪费时间。经过一些学习,简单了解了其中的一些知识。其实复杂的可能是项目中找不到合适的docker镜像源、Runner机器、变量应该怎么编写等问题,其他的稍微查找下文档资料是可以明白的。
下面用一个简单的例子讲解里面各个点代表的什么意思,首先上一段.gitlab-ci.yml
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| variables: WORKSPACE: $CI_PROJECT_DIR IMAGE_ADDRESS: 'xxx/xxx:xxx' DOCKER_HOST: tcp://docker:2376 DOCKER_TLS_CERTDIR: "/certs" DOCKER_TLS_VERIFY: 1 DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client" IMAGE_TAG: "${CI_COMMIT_REF_SLUG}_${CI_COMMIT_SHORT_SHA}" default: interruptible: true
before_script: - xxx
after_script: - rm xxx stages: - build - deploy_test_env
build: stage: build only: - develop - master variables: GIT_STRATEGY: "fetch" services: - docker:dind image: ${IMAGE_ADDRESS} tags: - docker script: - echo "IMAGE_TAG:$IMAGE_TAG" - chmod +x ./build.sh - ./build.sh deploy-k8s: stage: deploy_test_env rules: - if : '$CI_PIPELINE_SOURCE != "web" && ($CI_COMMIT_REF_NAME =~ /develop/)' variables: YMLFILE: "xxx/xxx/values.yaml" APP: "xxxx-test" TEST_URL: "https://xxx.com" when: on_success - when: never extends: .devlop-script .devlop-script: stage: deploy_test_env image: xxx:xxx script: - echo "devlop-script" - echo "BUNCH:$CI_COMMIT_REF_NAME" - echo "IMAGE_TAG:$IMAGE_TAG" - echo "APP:$APP" - cd .. - if [ ! -d xxx ]; then - git clone --single-branch --branch develop https://xxx/xxx.git - else - cd xxx - git fetch https://gitlab-ci-token:${CI_GLOBAL_TOKEN}@gitlab.xxx.com/xxx/xxx/xxx.git - cd - - fi - cd xxx - yq -i eval ".global.tag.xxx |= \"${IMAGE_TAG}\"" ${YMLFILE} - git config --global user.email "${CI_GLOBAL_USER}@xxx.com" - git config --global user.name ${CI_GLOBAL_USER} - git commit -m "xxx:${IMAGE_TAG}" ${YMLFILE} || echo 1 - git push || git pull && git push
|
以下是一些不可被用于任务名的保留字:
关键字 |
是否必须 |
描述 |
image |
no |
使用的docker镜像 |
services |
no |
使用的docker服务 |
stages |
no |
定义构建场景 |
types |
no |
stages的别名(不建议使用) |
before_script |
no |
定义每个任务的脚本启动前所需执行的命令 |
after_script |
no |
定义每个任务的脚本执行结束后所需执行的命令 |
variables |
no |
定义构建变量 |
cache |
no |
定义哪些文件需要缓存,让后续执行可用 |
上面使用了 build.sh
,当然也可以直接编写脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #!/bin/sh
echo "Waiting for docker to be available" until docker info; do sleep 1; done echo "Docker is now available"
echo "========== start build script ==========" docker login -u ${DOCKER_USER} -p ${DOCKER_PASSWD} https://xxx.xxx.com if [ $? -ne 0 ]; then echo "docker login failed!!" exit 127 fi node -v if [ $CI_COMMIT_REF_NAME == "develop" ]; then yarn install yarn run build:test elif [ $CI_COMMIT_REF_NAME == "master" ]; then yarn install yarn run build:pro else echo "========== branch name is not develop or master, exit build script ==========" exit 127 # yarn install # yarn run build:test fi
echo "========== build docker image ==========" image_name="xxx.xxx.com:${IMAGE_TAG}" docker build -t ${image_name} . # 表示使用dockerfile来构建,注意后面的 '.' 会自动找目录下的dockerfile docker push ${image_name}
|
stages默认的5个阶段
- .pre
- build
- test
- deploy
- .post
when一些可能的取值
on_success
(默认):当早期阶段的所有任务都成功运行或者有配置allow_failure: true
.时运行当前任务
manual
:在Gitlab UI
中手动触发任务
always
:无论早期阶段的作业状态如何,都运行作业。也可用于workflow: rules
.
on_failure
:仅当至少一个早期阶段的作业失败时才运行该作业
delayed
:将作业的执行延迟 指定的持续时间
never
: 不要运行作业。只能在rules
节或中使用workflow: rules