gitlab

安装runner

  • 由于是通过runner自动拉取,不需要runner能够公网访问
  1. sudo apt install gitlab-runner安装包(这个方法的包可能很老,不推荐)或者
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# 太慢的话可以换成 https://gitee.com/mirrorvim/userful-tools-2/releases/download/gitlabrunnerv1.0.0/gitlab-runner-linux-amd64

# Give it permissions to execute
sudo chmod +x /usr/local/bin/gitlab-runner

# Create a GitLab CI user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# Install and run as service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
  1. 运行下列代码注册,token从gitlab项目setting->CI/CD->runner->Specific runners 获取
    • 名字要取,方便识别
    • 出现选择executor的时候根据需要选择,一般为docker或者shell
    • tag一定要写,执行时候需要指定tag
    • 配置文件保存在: "/etc/gitlab-runner/config.toml"
    • 如果配置有问题就取消注册删除
sudo gitlab-runner register --url https://gitlab.dian.org.cn/ --registration-token $REGISTRATION_TOKEN

sudo gitlab-runner verify

# 取消注册删除
sudo gitlab-runner unregister  -name=helpertest
  1. 检查是否运行成功,如果出现unmark的情况,运行sudo systemctl unmask gitlab-runner.service
gitlab-runner status
gitlab-runner: Service is running

sudo systemctl status gitlab-runner.service
sudo systemctl start gitlab-runner.service

ps aux|grep gitlab#这个命令一定需要出现gitlab-runner run
  1. 如果发现还是无法自动获取任务执行
sudo nohup gitlab-runner run &

上传公钥

  • 因为CICD会自动拉取仓库,因此必须runner确保有权限拉取仓库
  • 服务器使用ssh-keygen生成公钥
  • 在gitlab项目中setting->repository->Deploy keys中添加
    • 这里如果出现冲突"Deploy keys projects deploy key fingerprint has already been taken"
    • 把别的地方的删掉放在这里才是正确的地方
    • "sudo gitlab-runner unregister -name=helpertest"

[!important] 创建其他仓库配置 其他仓库中添加服务器的权限应该在这里添加,其他地方添加太愚蠢了

  • 如果runner需要访问服务器还要将公钥加入服务器

编写.gitlab-ci.yml

  • 一般哪个分支需要CICD这个分支就放在哪个分支上
  • 点击stage再点击某个阶段可以看到日志
  • 只要处在这个文件的分支推送,如果文件中没有指定分支,那么都会执行
stages:
  - deploy #这里可以一次定义多个stages,下面依次执行

deploy:
  stage: deploy
  tags:
    - helper-cicd #这里需要指定创建时候runner的tag
  script:
    - ./auto_push.sh #需要执行的命令
  only:
    - test #只有在特定分支上才会执行

修改默认配置(optional)

  • 配置文件为/etc/gitlab-runner/config.toml
  • 时间间隔为check_interval,通常设置为10
  • 如果出现了奇怪的参数修改/etc/systemd/system/gitlab-runner.service的内容 ,然后sudo systemctl daemon-reload,然后sudo systemctl start gitlab-runner.service
  • demo
concurrent = 1 
check_interval = 10
shutdown_timeout = 0 

[session_server]
  session_timeout = 1800

[[runners]]
  name = "seedcup"
  url = "https://gitlab.dian.org.cn/"
  id = 28
  token = "eJenV431nsLuWf6utrjQ"
  token_obtained_at = 2023-06-06T03:03:15Z
  token_expires_at = 0001-01-01T00:00:00Z
  executor = "shell"
  [runners.cache]
    MaxUploadedArchiveSize = 0 

github

  • 个人公有仓库无限时间
  • 私有仓库free用户2000分钟每月,pro用户3000分钟每月

创建文件

  • 需要在线项目中开启,项目首页->setting->Actions->General->Allow All
  • 项目目录下创建.github/workflows文件夹
  • 在该文件夹下创建任意数量任意名称的.yml文件,github会自动遍历所有的yml文件进行构建
  • 推送到github就会自动执行cicd

文件格式

[!tip] 参考 Endless 'Waiting for a runner to pick up this job...' for windows-latest · community · Discussion #78802 · GitHub 踩坑: "Waiting for a runner to pick up this job"-腾讯云开发者社区-腾讯云

name: test #名称随意
on:
  push: #设置触发规则
    branches:
      - main
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code #这部分是为了从github自动clone代码
        uses: actions/checkout@v2
      - name: Install build tools #这部分是安装依赖,不过看着办的
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential
      - name: Run test #需要执行的命令
        run: |
          cd test
          make
          ./main

高阶内容

添加github_token权限

cicd时候github会自动有一个token,不需要自己去创建token

  • 因为这个token默认没有写权限,如果不添加,无法执行下面的创建release的过程
  • 打开仓库界面 -> Setting -> Action -> General -> Workflow permissions -> 点击 Read and write permissions

设置自动部署创建release的流程

这一步依赖上面的权限设置

  • 编辑yml文件,demo如下
name: build_and_release #名称随意
on:
  push: #设置触发规则
    branches:
      - main
      - master
    tags:
      - 'v*'
  pull_request:
    branches:
      - main
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code #这部分是为了从github自动clone代码
        uses: actions/checkout@v4
            with:
                 fetch-depth: 0 # Number of commits to fetch. 0 indicates all history for all branches and tags.Default: 1
                 submodules: true
      - name: Install build tools #这部分是安装依赖,不过看着办的
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential curl
      - name: Run test #需要执行的命令
        run: |
          make
      - name: Release
        uses: softprops/action-gh-release@v2 #具体参考https://github.com/softprops/action-gh-release
        if: startsWith(github.ref, 'refs/tags/') # 设置为有tag才进行上传
        with:
          # body_path: commit-message.log
          # body: Auto Create Release 这两个都是设置release信息的,一个是从path文件读取,一个是直接写入
          files: |
            LICENSE

设置github-page自动部署

  1. 开启github-action 仓库界面 -> Actions -> Enable
  2. 添加token的权限:仓库界面 -> Setting -> Action -> General -> Workflow permissions -> 点击 Read and write permissions
  3. 设置page: 仓库界面 -> Setting -> Pages -> Build and deployment -> Source 设置为 Github Actions
  4. 配置文件里面添加下面的内容
  # Deploy job
  deploy:
    # Add a dependency to the build job
    needs: build
    # Grant GITHUB_TOKEN the permissions required to make a Pages deployment
    permissions:
      pages: write      # to deploy to Pages
      id-token: write   # to verify the deployment originates from an appropriate source
    # Deploy to the github-pages environment
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    # Specify runner + deployment step
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4 # or specific "vX.X.X" version tag for this action

跨平台编译

  • 基本想法是使用矩阵工作流设置不同平台
name: build_and_release #名称随意
on:
  push: #设置触发规则
    branches:
      - main
      - master
    tags:
      - 'v*'

jobs:
  build:
    strategy:
      matrix: # 会分开成两个任务分别执行
        os: [ubuntu-latest, macos-latest]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      - name: Go env prepare
        uses: actions/setup-go@v5
        with:
          go-version: '^1.20'
          check-latest: true
      - name: Install build tools in Ubuntu
        if: matrix.os == 'ubuntu-latest'
        run: |
          sudo apt-get update
          sudo apt-get install -y build-essential curl
      - name: Install build tools in MacOS
        if: matrix.os == 'macos-latest'
        run: |
          brew install curl
      - name: Run build
        run: |
          make
          mv goweb goweb-${{ matrix.os }}
      - name: Release
        uses: softprops/action-gh-release@v2
        if: startsWith(github.ref, 'refs/tags/')
        with:
          body_path: commit-message.log
          files: |
            LICENSE
            goweb-${{ matrix.os }}

[!tip] 参考 goweb/.github/workflows/build_and_release.yml at master · chenxuan520/goweb · GitHub 86. GitHub Actions 第3天:跨平台构建 - Qiwihui's blog 通过 GitHub Actions 实现代码的自动编译和发布 - Undefined443 - 博客园

ssh进入action机器

  • 使用 ssl 私钥连接 action 服务器, 需要提前将公钥放在 github上
      - name: Setup Debug Session
        uses: mxschmitt/action-tmate@v3
        timeout-minutes: 15
        with:
          detached: false

更新 wiki

  • 确保 仓库开 wiki 并且至少创建一个界面
  • yml加上, path 为 markdown的 文件夹地址 , Home.md 作为默认展示页
      - name: Wiki Update
        uses: spenserblack/actions-wiki@v0.3.0
        with:
          # Whatever directory you choose will be mirrored to the GitHub
          # .wiki.git. The default is .github/wiki.
          path: docs

mirror信息

gitee

[!important] gitee和github的demo可以参考 https://gitee.com/chenxuan520/cppjson

  • 直接按照他的指示来操作就ok,很简单
    • 构建的时候选择工具->基于镜像的脚本执行,ubuntu的容器地址ubuntu:22.04(改成 hub.atomgit.com/amd64/ubuntu:22.04) 因为愚蠢的 AtomHub , 这样弄下去迟早药丸
  • 如何要看到所构建记录,需要手动选择master分支(或者需要的分支)
  • 创建的文件是在.workflow目录下的yml
  • 每个仓库默认200分钟(一共200分钟),每人每月1000分钟

参考

  • https://docs.gitlab.com/ee/ci/
  • https://zhuanlan.zhihu.com/p/164744104
  • https://gitee.com/help/articles/4356