一、GitLab CI/CD
-
• gitlab-CI gitlab8.0之后自带的一个持续集成系统,当每一次push到gitlab的时候,都会触发一次脚本执行。然后脚本内容包括测试、编译,部署等操作内容。
-
• gitlab-CI的脚本执行,需要自定义安装对应gitlab-runner来执行,代码push之后,webhook检测到代码变化,就会触发gitlab-CI,分配到各个runner来运行相应的脚本script。
二、对比点
分支可配置性
-
• 使用Gitlab-CI,新创建的分支无需任何一步配置即可立即使用CI管道中定义的作业
-
• Jenkina 2基本gitlab的多分支流水线可以实现,相对配置来说gitlab更加方便
拉取请求支持
-
• GitLab与其CI平台紧密集成,可以方便查看每个打开和关闭的请求运行和完成管道。
-
• Jenkins没有与源代码管理系统进一步集成
权限管理
-
• 由于GitLab与CI深度整合,权限可以统一管理。
-
• Jenkins中需要单独管理权限控制,且权限复杂。
存储库交互
-
• GitLab CI是Git存储库的管理器固定组件
-
• Jenkins可以支持多种代码存储库的支持,同时多种插件可配置。
插件管理
-
• GitLab是开放式的,把多种功能集成到一起,不需要依赖插件。
-
• Jenkins的功能插件很多,更新维护成本高。插件更新及容易导致任务不可用。
总结:
-
1. 开发人员在使用gitbucket+jenkins,部署任务需要登录到jenkins上查看,目前jenkins没有做到按项目权限划分。使用jenkins查看任务构建状态不太方便找到。
-
2. gitlab-ci是把构建任务绑定在项目分支上,每一次提交都有新的构建任务触发,构建任务和代码目录相对应,更直观的能够看到构建状况。
-
3. 目前jenkins做了CI和CD两部分工作,假如开发人员只想做CI,那是不是GitLab-CI更方便开发人员测试,当需要发布时候在告知运维做CD同步。
测试研发生产Argo CDGitLab-CI
三、GitLab-CI的使用
-
1. GitLab-CI Runner介绍
-
• GitLab-CI Runner是一个开源项目,用于运行作业并将结果发送给GitLab。
-
• 与GitLab-CI结合使用,GitLab-CI是GitLab随附的用于协调作业的开源支持集成服务。
-
• GitLab-CI Runner是用go语言编写的,可以在linux,mac和window操作系统上运行。
-
• 容器部署需要使用最少Docker V1.13.0版本。
-
• GitLab-CI Runner 版本应与GitLab版本同步。
-
• 可以根据需要配置任意数量的Runner。
-
1. GitLab-CI Runner特点
作业运行控制:同时执行多个作业
作业运行环境:Linux、macOS、Windows、Docker、Kubernetes
-
1. GitLab-CI Runner类型与状态
类型:
-
•
-
• shared 共享类型,运行在整个平台项目的作业(gitlab)
-
• group 项目组类型,运行特定group下的所有项目作业(group)
-
• specific 项目类型,运行指定的项目作业(project)
状态:
-
•
-
• locked 锁定状态,无法运行项目作业
-
• paused 暂停状态,暂时不会接受新的作业
-
1. Runner的安装
Linux
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
sudo chmod +x /usr/local/bin/gitlab-runner
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
Docker
sudo docker run -d --name gitlab-runner --restart always -v /srv/gitlab-runner/config:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock gitlab/gitlab-runner:latest
k8s
runner-configmap.yaml
apiVersion: v1
data:
REGISTER_NON_INTERACTIVE: "true"
REGISTER_LOCKED: "false"
METRICS_SERVER: "0.0.0.0:9100"
CI_SERVER_URL: "http://172.16.1.233:50080/ci"
RUNNER_REQUEST_CONCURRENCY: "4"
RUNNER_EXECUTOR: "kubernetes"
KUBERNETES_NAMESPACE: "kube-ops"
KUBERNETES_PRIVILEGED: "true"
KUBERNETES_CPU_LIMIT: "1"
KUBERNETES_MEMORY_LIMIT: "1Gi"
KUBERNETES_SERVICE_CPU_LIMIT: "1"
KUBERNETES_SERVICE_MEMORY_LIMIT: "1Gi"
KUBERNETES_HELPER_CPU_LIMIT: "500m"
KUBERNETES_HELPER_MEMORY_LIMIT: "100Mi"
KUBERNETES_PULL_POLICY: "if-not-present"
KUBERNETES_TERMINATIONGRACEPERIODSECONDS: "10"
KUBERNETES_POLL_INTERVAL: "5"
KUBERNETES_POLL_TIMEOUT: "360"
kind: ConfigMap
metadata:
labels:
app: gitlab-ci-runner
name: gitlab-ci-runner-cm
namespace: kube-ops
runner-scripts-cm.yaml
apiVersion: v1
data:
run.sh: |
#!/bin/bash
unregister() {
kill %1
echo "Unregistering runner ${RUNNER_NAME} ..."
/usr/bin/gitlab-ci-multi-runner unregister -t "$(/usr/bin/gitlab-ci-multi-runner list 2>&1 | tail -n1 | awk '{print $4}' | cut -d'=' -f2)" -n ${RUNNER_NAME}
exit $?
}
trap 'unregister' EXIT HUP INT QUIT PIPE TERM
echo "Registering runner ${RUNNER_NAME} ..."
/usr/bin/gitlab-ci-multi-runner register -r ${GITLAB_CI_TOKEN}
sed -i 's/^concurrent.*/concurrent = '"${RUNNER_REQUEST_CONCURRENCY}"'/' /home/gitlab-runner/.gitlab-runner/config.toml
echo "Starting runner ${RUNNER_NAME} ..."
/usr/bin/gitlab-ci-multi-runner run -n ${RUNNER_NAME} &
wait
kind: ConfigMap
metadata:
labels:
app: gitlab-ci-runner
name: gitlab-ci-runner-scripts
namespace: kube-ops
gitlab-ci-token-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: gitlab-ci-token
namespace: kube-ops
labels:
app: gitlab-ci-runner
data:
GITLAB_CI_TOKEN: R1IxMzQ4OTQxSGtIRlFSVFdzS3AxaG5IRmJKbnIK
runner-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: gitlab-ci
namespace: kube-ops
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab-ci
namespace: kube-ops
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: gitlab-ci
namespace: kube-ops
subjects:
- kind: ServiceAccount
name: gitlab-ci
namespace: kube-ops
roleRef:
kind: Role
name: gitlab-ci
apiGroup: rbac.authorization.k8s.io
runner-statefulset.yaml
apiVersion: v1
kind: Service
metadata:
name: gitlab-ci-runner
namespace: kube-ops
labels:
app: gitlab-ci-runner
spec:
ports:
- port: 9100
targetPort: 9100
name: http-metrics
clusterIP: None
selector:
app: gitlab-ci-runner
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: gitlab-ci-runner
namespace: kube-ops
labels:
app: gitlab-ci-runner
spec:
updateStrategy:
type: RollingUpdate
replicas: 2
serviceName: gitlab-ci-runner
selector:
matchLabels:
app: gitlab-ci-runner
template:
metadata:
labels:
app: gitlab-ci-runner
spec:
volumes:
- name: gitlab-ci-runner-scripts
projected:
sources:
- configMap:
name: gitlab-ci-runner-scripts
items:
- key: run.sh
path: run.sh
mode: 0755
serviceAccountName: gitlab-ci
securityContext:
runAsNonRoot: true
runAsUser: 999
supplementalGroups: [999]
containers:
- image: gitlab/gitlab-runner:latest
name: gitlab-ci-runner
command:
- /scripts/run.sh
envFrom:
- configMapRef:
name: gitlab-ci-runner-cm
- secretRef:
name: gitlab-ci-token
env:
- name: RUNNER_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
ports:
- containerPort: 9100
name: http-metrics
protocol: TCP
volumeMounts:
- name: gitlab-ci-runner-scripts
mountPath: "/scripts"
readOnly: true
restartPolicy: Always
-
1. Runner注册
gitlab-runner register --url http://172.16.1.236:50080/ --registration-token $REGISTRATION_TOKEN ##这里的tocker要写具体项目或者全局的
-
1. .gitlab-ci.yaml配置参数
关键字 | 描述 |
关键字 | 描述 |
except | 限制作业在什么时候不创建 |
cache | 指定需要在job之间缓存的文件或目录 |
parallel | 指定并行运行的作业实例 |
script | 必须参数,运行器需要执行的脚本 |
dependencies | 当前作业依赖的其他作业,你可以使用依赖作业的归档文件 |
artifacts | 归档文件列表,指定成功后应附加到job的文件和目录的列表 |
variables | 定义环境变量 |
stages | 定义流水线所有的阶段 |
only | 定义哪些分支运行,限制作业在什么上创建 |
stage | 定义作业所处流水线的阶段(默认test阶段) |
trigger | 定义下游流水线的触发器 |
allow_failure | 允许作业失败,失败的作业不影响提交的状态 |
services | 使用Docker services(服务)镜像 |
image | 使用Docker image镜像 |
environment | 作用部署的环境名称 |
coverage | 作业的代码覆盖率 |
after_script | 作业执行后需要执行的命令 |
before_script | 作业执行前需要执行的命令 |
retry | 作业失败时,可以自动执行多少次 |
include | 作业加载其他YAML文件 |
tags | 作业使用的Runner运行器的标签 |
when | 什么时候运行作业 |
pages | 上传GitLab Pages的结果 |
例子
stages:
- build
- push
- sync
build:
stage: build
script:
- sudo docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA .
push:
stage: push
script:
- echo "$DOCKER_PASS" | sudo docker login $REGISTRY -u "$DOCKER_USER" --password-stdin
- sudo docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA
sync:
stage: sync
before_script:
- git remote set-url origin http://${CI_USERNAME}:${CI_PASSWORD}@172.16.1.236:50080/ops/mark-demo
- git config --global user.email "gitlab@git.k8s.local"
- git config --global user.name "GitLab CI/CD"
script:
- git checkout -B main
- cd deployment/ && ls -lrt
- sed -i "s/$APP_NAME:.*/$APP_NAME:$CI_COMMIT_SHORT_SHA/g" mark-web-dev.yaml
- git commit -am '[skip ci] DEV image update'
- git push origin main
variables:
REGISTRY: "123.56.140.4:808"
DOCKERHUB_NAMESPACE: "mark"
APP_NAME: "mark-web"
image: docker:stable
stages:
- build
- push
- sync
- deploy
build:
image: docker:stable
stage: build
tags:
- k8s-runner
script:
- docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA .
push:
image: docker:stable
stage: push
tags:
- k8s-runner
script:
- echo "$DOCKER_PASS" | docker login $REGISTRY -u "$DOCKER_USER" --password-stdin
- docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$CI_COMMIT_SHORT_SHA
sync:
image: cnych/kubectl
stage: sync
tags:
- k8s-runner
before_script:
- git remote set-url origin http://${CI_USERNAME}:${CI_PASSWORD}@172.16.1.233:50080/ops/mark-demo
- git config --global user.email "gitlab@git.k8s.local"
- git config --global user.name "GitLab CI/CD"
script:
- git checkout -B main
- cd deployment/ && ls -lrt
- sed -i "s/$APP_NAME:.*/$APP_NAME:$CI_COMMIT_SHORT_SHA/g" mark-web-dev.yaml
- git commit -am '[skip ci] DEV image update'
- git push origin main
deploy:
image: cnych/kubectl
stage: deploy
tags:
- node1
script:
- cd deployment
- cat mark-web-dev.yaml
- sudo kubectl apply -f mark-web-dev.yaml
variables:
REGISTRY: "123.56.140.4:808"
DOCKERHUB_NAMESPACE: "mark"
APP_NAME: "mark-web"
原文始发于微信公众号(背带裤的云原生):GitLab CI:让代码的变迁如行云流水,高效而优雅
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/219100.html