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 @ 2023-06-21 17:43  zpchcbd  阅读(215)  评论(0)    收藏  举报