概述
首先先把github action的文档放在这里,总结一下本质上和去一台新机器里构建没有别的区别。
action
实现过程可以说非常简单,脚本也很轻松易懂,可以理解为我们要去一个新的容器里面去构建我们的环境并运行我们的测试。也就是说不仅需要构建所需的编译器,还需要去下载所需的包。
多平台构建
可以看starter-workflows的issue586,里面有一个多编译器多平台的暴力构建脚本。
gcc13构建
首先头疼的是gcc-13
的选择,因为需要支持新的std标准,必须使用gcc-13
,而gcc-13
在ubuntu的apt标准源里面是没有的,从源码构建当然可以,但是这个太麻烦了,后面发现有简单的方法。
- 先安装工具源
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
- 更新源
sudo apt update
- 安装gcc和g+
apt install gcc-13 g++-13
随后记得gcc-13 g++-13为高优先级(优先使用版本13)
sudo update-alternatives --install `which gcc` gcc `which gcc-13` 99
sudo update-alternatives --install `which g++` g++ `which g++-13` 99
在workflow脚本中可以这么写:
- name: install GCC13
shell: bash
run: |
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update && sudo apt-get install gcc-13 g++-13
sudo update-alternatives --install `which gcc` gcc `which gcc-13` 99
sudo update-alternatives --install `which g++` g++ `which g++-13` 99
jobs流控制
job之间相互依赖
之前配置可以发现是串行的,实际上在test的时候完全可以并行测试,同时对于配置来说,我们很难知道在哪一个环节出了问题,因此将整个大的jobs拆分成小的job就成了要解决的问题。后面查阅官方文档还有搜索资料发现了配置技巧,
如何让Job 编排控制执行顺序,只需要一个tag即可。
on: push
jobs:
job1:
runs-on: ubuntu-latest
steps:
- run: echo "job1"
job2:
runs-on: ubuntu-latest
steps:
- run: sleep 5
needs: job1
job3:
runs-on: ubuntu-latest
steps:
- run: sleep 10
needs: job1
job4:
runs-on: ubuntu-latest
steps:
- run: echo "job4"
needs: [job2, job3]
上面的 workflows 执行时,job2 和 job3 会等 job1 执行成功时才执行,job4 会等 job2 和 job3 执行成功时才执行。
actions-artifact
后面发现每个任务之前的环境是不互通的,也就是environment这个job配置好后,后续的job是使用不了的,这下难办了,该怎么办呢?因为我们只需要使用对应build的产物进行test,那么我们可以使用Github actions Artifact 可以用来存储action生产出来的产物。官方文档上有比较详细的说明,同时也有别的学习资料以及优质博文。
- name: Archive production artifacts
uses: actions/upload-artifact@v4
with:
name: dist-without-markdown
path: |
dist
!dist/**/*.md
注意,你upload后是不能直接用的,还得配合download下载使用(注意也要指定path,官方实例里面没给),然后指定需要的path,download的官方文档在这里。
- name: Download a single artifact
uses: actions/download-artifact@v4
with:
name: dist-without-markdown
需要强烈注意的是,这个path是相对repository的路径
,所以不要觉得这个上传的path是相对working-directory的。也就是不需要再去加$
前缀,否则就会像我一样疯狂报错不知道哪出了问题。
所以修改路径后就能正常下载了
- name: Download artifacts
uses: actions/download-artifact@v4
with:
name: packing-tests
path: build/test/
path和actions/checkout@v4
首先又把checkout的文档放在这里,为什么我每次都找不到对应的路径,原来是复制的时候多复制了actions/checkout@v4,作用于checkout,相当于又切回去了最原始的提交,相当于变回去了,一开始不知道在调用test的时候把这个uses上了,于是每次最后调用测试的时候都切回原始状态(难蚌)。
同时下载下来的文件是没有运行权限的,记得修改一下权限:
试错了很多次终于搞定了,期间改了不少次架构,最后CI集成了还是舒服的。
TODO
每次都要等gcc和boost安装比较耗费时间,不知道有没有方法能够生成一个环境(除了自己搞个docker image),每次actions直接去环境里面进行即可就好了。