看前须知
本文只是我使用Coding Devops
部署博客以及自动Push
到GitHub
的过程记录,我只用到了repo
和ci
功能,不需要一模一样,hexo
等可以效仿,其他仅作参考,有问题评论留言即可。
开始
实现的最终效果如图。
Coding
这个实现起来不是很难,我自己用也不需要什么测试,迭代。
在想要构建的仓库里创建构建计划
→自定义构建过程
→不使用代码仓库
。不适用代码仓库的原因是如果一开始就使用选定的仓库,运行CI
会全局覆盖Git
信息导致后续无法Push
到Github
。
不选代码仓库就没有检出这一步骤,第一步创建执行Shell脚本
,内容就是clone
托管在Coding
的仓库,不使用SSH
方式,改成账号密码。除了账号密码以外的部分可以在仓库里找到。
git clone https://账号:密码@e.coding.net/用户名/项目名/项目名.git
Coding CI
的初始目录如下,所有的操作都会在这个目录里进行,需要注意的是:如果有cd
操作,cd
结束之后会自动回到这个目录,所以所有的步骤都要cd
或者直接把内容拖到这个目录。
/root/workspace
然后先删除项目内的.git
文件夹(改也行),然后就是设置Git
信息。在Coding CI
内无法输入账号密码,所以Push
到Github
需要Github
的Personal access tokens
。在这里新建token
,https://github.com/settings/tokens 并把对repo
的控制勾上。
格式跟Coding
那个仓库差不多,可以免密Clone
,Push
等。
https://token@github.com/用户名/项目名.git
所有Git
的操作就跟在本地一样,唯一的区别就是CI
的服务器Push
到Github
很快hhh,格式如下,最后分支那里不用加HEAD
。
git push https://token@github.com/用户名/项目名.git branch
整仓Push
到我的Github
之后,开始构建并生成我的静态内容。我的博客和GitHub Pages
是两个仓库所以我最终会提交两次,博客那个仓库主要做个备份。
我的博客用的Maverick
,所以需要用到Python
,版本只要大于3.6就可以,CI
默认就有环境SDK
内置。具体看官方文档。没有想要的环境或版本可以用自定义docker
。
https://help.coding.net/docs/ci/ways.html?&_ga=2.233204055.856802041.1631519683-1446587655.1624866774#预装的软件-SDK
查看文档可以看到和Python
有关的环境有:python3/pip3: 3.9、3.8、3.7
。
首先我更新默认的pip
版本,其实这个无所谓。
python3.9 -m pip install --upgrade pip
然后就是安装依赖
代码语言:javascript复制pip3.9 install -r requirements.txt
最后生成
代码语言:javascript复制python3.9 mvrk.py --config ./demo_src/config.py --source_dir ./demo_src/ --build_dir ./dist/
部署完成之后我需要推送到我的服务器,创建执行 Pipeline 脚本
,可以用私钥也可以用账号密码,具体参考官方文档:https://help.coding.net/docs/ci/deploy/ssh.html
如果是图形化编辑器,复制从def
开始的内容即可,文本编辑器参考文档。填写好IP
,端口等之后,可以看到credentialsId
,凭据ID可以在当前项目页面左下角找到项目设置,开发者选项,就有凭据选项。新建凭据,可以用私钥也可以设置账号密码。添加完成后把凭据ID替换到执行的Pipeline脚本
内。
链接格式:
代码语言:javascript复制https://jcjyxjs.coding.net/p/项目名称/setting/connection?page=1
成功连接服务器之后,就等于直接操作服务器,首先我需要把生成的内容传输到我的服务器上,form
就是CI
目录,into
就是我服务器目录。然后就是替换操作了。
sshPut remote: remote, from: '/root/workspace', into: '/xxxxxxxx/'
代码语言:javascript复制def remote = [:]
remote.name = '名字随便'
remote.allowAnyHosts = true
remote.host = '服务器IP'
remote.port = SSH端口
remote.user = '用户'
// 把「CODING 凭据管理」中的「凭据 ID」填入 credentialsId,而 id_rsa 无需修改
withCredentials([sshUserPrivateKey(credentialsId: "xxxxxxxxxxxxx", keyFileVariable: 'id_rsa')]) {
remote.identityFile = id_rsa
// SSH 上传文件到远端服务器
sshPut remote: remote, from: '/tmp/tmp.tar.gz', into: '/tmp/'
// 解压缩
sshCommand remote: remote, command: "tar -zxf /tmp/tmp.tar.gz -C /tmp/"
sshCommand remote: remote, sudo: true, command: "mkdir -p /var/www/example-site"
sshCommand remote: remote, sudo: true, command: "cp -R /tmp/site/* /var/www/example-site/"
sshCommand remote: remote, sudo: true, command: "cp -R /tmp/apache2/ /etc/"
// 重启 apache2
sshCommand remote: remote, sudo: true, command: "a2ensite example.com"
sshCommand remote: remote, sudo: true, command: "a2enmod headers rewrite ssl"
sshCommand remote: remote, sudo: true, command: "systemctl reload apache2"
}
最后回到CI
,还是创建Shell命令
,我也不会其他方法,只能先删不需要的然后把dist
目录内的东西移动到工作目录,然后clone
在GitHub
的仓库,把.git
移动到工作目录,删除clone
的产物,最后git push
,git init
然后添加远程仓库就是push
不上去也不知道什么原因,我只能先这样。其他东西参考上文。
在每个步骤的最后我都添加了一步,推送消息到企业微信,这还挺方便的,执行到哪里了也都知道。
这个CI
没有用代码仓库所以不会检测repo
然后触发自动构建,所以在触发规则中,选择API
触发,可以直接生成CURL
触发命令,项目令牌和密码也可以一键生成,时间可以自定义。然后复制这个触发命令。
curl -u <项目令牌用户名>:<项目令牌密码>
-v -X POST '自己的CI点生成可以看到'
-H 'Content-Type: application/json'
-d '
{
"ref": "master",
"envs": []
}'
再次创建一个CI
,使用Coding
的仓库,然后创建一个Shell命令
,把刚刚复制的CURL
命令粘贴进来然后保存就可以。
最终就会是:我本地提交git
到Coding
的仓库,触发器这个CI
检测到仓库变化然后运行,运行的内容就是启动另外一个CI
,触发器结束任务,主要的CI
开始运行我指定的内容。官方文档写的非常好,可读性极强。