GitLab CI 自动发布 Release 版本包

需求

当向 gitlab 推送 tag 时自动生成 Release 发布包的自动 CI 功能

实现

首先在对应仓库生成一个 Project Access Token,授权 api 和 write_repository 权限,然后在仓库的设置-CI/CD 新增 Variable 名称为 ACCESS_TOKEN、值为上一步生成的 Token。

  1. 当有推送 tag 时、自动触发 gitlab CI 任务
    编写 CI 配置文件 .gitlab-ci.yml

    1
    2
    3
    4
    5
    6
    7
    8
    Create_Release:
    stage: deploy
    tags:
    - runner # 指定runner
    only:
    - tags # 仅对推送 tag 时触发
    script:
    - bash deploy_release.sh
  2. 生成 Release 版本并上传到 gitlab 存储空间
    cat deploy_release.sh

    1
    2
    3
    4
    5
    6
    base_url=https://git.example.dev
    # upload
    output=$(curl --request POST --header "PRIVATE-TOKEN:${ACCESS_TOKEN}" \
    --form "[email protected]" ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/uploads)
    # 文件URL路径提取
    full_path=$(echo $output | grep -o '"full_path":"[^"]*' | cut -d '"' -f 4)
  3. 记录文件 URL,发布到 Release 页面

    1
    2
    3
    4
    5
    6
    7
    [ -z ${full_path} ] && exit 1
    # "Create release"
    now=$(date +%Y%m%d%H%M)
    curl --header "Content-Type:application/json" --header "PRIVATE-TOKEN:${ACCESS_TOKEN}" \
    --data "{\"name\":\"${CI_COMMIT_TAG}\", \"tag_name\":\"${CI_COMMIT_TAG}\", \"description\":\"Auto Deploy at ${now}\", \"assets\":{ \"links\":[{ \"name\":\"release.tar.gz\", \"url\":\"${base_url}/${full_path}\",\"link_type\":\"package\" }] } }" \
    --request POST "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/releases" >/dev/null && echo " Success "