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
posted @   zpchcbd  阅读(149)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示