GitLab CI/CD管道编写
前言:Gitlab CI/CD调度编写笔记
参考文章:https://docs.gitlab.com/ee/ci/yaml/index.html#artifacts
参考文章:https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
参考文章:https://blog.csdn.net/weixin_38080573/article/details/128478061
上面一篇csdn的里面图片也借鉴了几张...
前置概念
这里CI/CD的整体调度被称作为管道Pipelines。
管道中被分作为多个作业的形式,每个作业中都有可以运行的脚本,如下所示。
作业(job):这些是运行命令的管道的独立部分。 作业在运行器上运行,独立于 GitLab 实例。
脚本(script):作业配置的此部分是在其中定义作业的命令。如果有多个命令(在一个数组中),它们按顺序运行。每个命令都像作为 CLI 命令运行一样执行。默认情况下,如果命令失败或返回错误,作业将标记为失败并且不再运行命令。
在添加作业的时候还需要用到镜像(image),如果自己没有指定的话那么Gitlab会默认提供
创建GitLab CI/CD管道
这边创建一个.gitlab-ci.yml文件来做一个简单的测试,这边定义了三个stages,分别是build test deploy;然后定义了三个作业(job),其中运行的script分别都是输出一个预定义的内容,代码如下图所示
stages: # List of stages for jobs, and their order of execution - build - test - deploy build-job: stage: build script: - echo "Hello, $GITLAB_USER_LOGIN!" test-job1: stage: test script: - echo "This job tests something" test-job2: stage: test script: - echo "This job tests something, but takes more time than test-job1." - echo "After the echo commands complete, it runs the sleep command for 20 seconds" - echo "which simulates a test that runs 20 seconds longer than test-job1" - sleep 20 deploy-prod: stage: deploy script: - echo "This job deploys something from the $CI_COMMIT_BRANCH branch." environment: production
创建完成之后,就会生成一个runner来运行这个管道,运行的结果如下所示
如下的展示结果则代表四个作业都正常的执行成功。
before_script/script/after_script
Gitlab CI/CD 是一个功能强大的工具,它提供了自动化的软件开发阶段,从集成、测试,到部署,甚至监控。这意味着开发者可以在一个平台上完成所有的工作,而无需跳转到其他服务。
想要使Gitlab CI/CD功能的话,这边是需要在项目中加入.gitlab-ci.yml文件
before_script
- 可以在before_script中定义一个变量,然后在script中去使用这个变量。因为before_script和script是运行在同一个执行环境之中
my_job: before_script: - echo "Execute this command before any 'script:' commands." - NRM="https://www.xxx.xx" script: - echo "this is script" - echo "output variable in before_script ${NRM}"
script
my_job: script: - NRM="https://www.xxx.xx" - echo "output variable in before_script ${NRM}" - 'curl --request GET --header "Content-Type: application/json" https://www.baidu.com/'
after_script
-
即使一个作业运行失败,它的after_script中的内容依然会被执行。这在有些业务场景下是非常有用的。
-
after_script的执行环境是与 script分离的,是一个新的执行环境。这也意味着在after_script中无法访问到在before_script和script中定义的变量。
-
after_script的运行状态不影响当前作业的状态,如果after_script运行失败或超时都不影响当前作业的成功或失败。
项目的编译与发布
这边我自己的需求就是通过CI/CD进行编译然后上传到OSS上提供别人下载
那么这边需要上传一个.net的项目,发现编译很麻烦,于是这边直接都不走编译了(自己本地编译完git上去),就上传编译完的东西就完事了,简单的实现如下所示
stages: - build build-job: stage: build image: alpine:3.18 before_script: - apk update - sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories - apk add curl zip - curl -sSL https://gosspublic.alicdn.com/ossutil/1.7.14/ossutil64 -o /usr/local/bin/ossutil64 - chmod +x /usr/local/bin/ossutil64 script: - cp /builds/xxxxx/$CI_PROJECT_NAME/xxxxx/bin/Debug/xxxxx.exe ./xxxxx.exe - cp /builds/xxxxx/$CI_PROJECT_NAME/xxxxx/bin/Debug/xxxxx.exe ./xxxxx.exe - zip $CI_PROJECT_NAME.zip xxxxx.exe xxxxx.exe README.md - ossutil64 config --endpoint $xxxxx--access-key-id $xxxxx--access-key-secret $xxxxx - ossutil64 cp -f -r $CI_PROJECT_NAME.zip oss://xxxxx/$CI_PROJECT_PATH.zip - ossutil64 set-acl -f -r oss://xxxxx/$CI_PROJECT_PATH.zip public-read after_script: - echo $CI_COMMIT_TAG - ls / - ls /builds/ - ls /builds/xxxxx/ - ls /builds/xxxxx/$CI_PROJECT_NAME/xxxxx/bin/Debug/ - ls /builds/xxxxx/$CI_PROJECT_NAME/xxxxx/bin/Debug
GO环境
如果是go环境的话就比较方便处理了,示例代码如下所示
build: image: golang:1.20 stage: build before_script: - sed -i "s@http://security.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list - sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list - curl -sSL https://gosspublic.alicdn.com/ossutil/1.7.14/ossutil64 -o /usr/local/bin/ossutil64 - apt update && apt install zip -y - chmod +x /usr/local/bin/ossutil64 script: - make all after_script: - cp -R bin/xxxxx* ./ - zip -r $CI_PROJECT_NAME.zip README.md bin/ -x '*.git*' --exclude '*__pycache__*' --exclude '*.idea*' - ossutil64 config --endpoint $xxxxx --access-key-id $xxxxx --access-key-secret $xxxxx - ossutil64 cp -f -r $CI_PROJECT_NAME.zip oss://xxxxx/$CI_PROJECT_PATH.zip - ossutil64 set-acl -f -r oss://xxxxx/$CI_PROJECT_PATH.zip public-read rules: - if: $CI_COMMIT_TAG artifacts: name: "$CI_PROJECT_NAME-$CI_COMMIT_REF_NAME" paths: - ./xxxxx* - ./README.md
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY