gitlab
安装runner
- 由于是通过runner自动拉取,不需要runner能够公网访问
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
- 运行下列代码注册,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
- 检查是否运行成功,如果出现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
- 如果发现还是无法自动获取任务执行
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
文件格式
- 可以参考 qiniuserver/.github/workflows/build_and_release.yml at master · chenxuan520/qiniuserver · GitHub
- 如果想要多个平台编译构件参考 Github Action 快速构建 Electron 应用_github action打包electron-CSDN博客
- ==该文件不要存在空行,不然容易一直pending,此外runs-on最好是latest==
[!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自动部署
- 开启github-action 仓库界面 -> Actions -> Enable
- 添加token的权限:仓库界面 -> Setting -> Action -> General -> Workflow permissions -> 点击 Read and write permissions
- 设置page: 仓库界面 -> Setting -> Pages -> Build and deployment -> Source 设置为 Github Actions
- 配置文件里面添加下面的内容
# 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信息
- 可以在 runner-images/README.md at main · actions/runner-images · GitHub 这里查看每个mirror的包的信息
gitee
[!important] gitee和github的demo可以参考 https://gitee.com/chenxuan520/cppjson
- 直接按照他的指示来操作就ok,很简单
- 构建的时候选择工具->基于镜像的脚本执行,ubuntu的容器地址
ubuntu:22.04
(改成hub.atomgit.com/amd64/ubuntu:22.04
) 因为愚蠢的 AtomHub , 这样弄下去迟早药丸
- 构建的时候选择工具->基于镜像的脚本执行,ubuntu的容器地址
- 如何要看到所构建记录,需要手动选择master分支(或者需要的分支)
- 创建的文件是在
.workflow
目录下的yml - 每个仓库默认200分钟(一共200分钟),每人每月1000分钟
参考
- https://docs.gitlab.com/ee/ci/
- https://zhuanlan.zhihu.com/p/164744104
- https://gitee.com/help/articles/4356