使用Coding Devops+自动构建以及部署博客

2021-09-16 17:30:42 浏览数 (1)

看前须知

本文只是我使用Coding Devops 部署博客以及自动PushGitHub的过程记录,我只用到了repoci功能,不需要一模一样,hexo等可以效仿,其他仅作参考,有问题评论留言即可。

开始

实现的最终效果如图。

Coding这个实现起来不是很难,我自己用也不需要什么测试,迭代。

在想要构建的仓库里创建构建计划自定义构建过程不使用代码仓库。不适用代码仓库的原因是如果一开始就使用选定的仓库,运行CI会全局覆盖Git信息导致后续无法PushGithub

不选代码仓库就没有检出这一步骤,第一步创建执行Shell脚本,内容就是clone托管在Coding的仓库,不使用SSH方式,改成账号密码。除了账号密码以外的部分可以在仓库里找到。

代码语言:javascript复制
git clone https://账号:密码@e.coding.net/用户名/项目名/项目名.git

Coding CI的初始目录如下,所有的操作都会在这个目录里进行,需要注意的是:如果有cd操作,cd结束之后会自动回到这个目录,所以所有的步骤都要cd或者直接把内容拖到这个目录。

代码语言:javascript复制
/root/workspace

然后先删除项目内的.git文件夹(改也行),然后就是设置Git信息。在Coding CI内无法输入账号密码,所以PushGithub需要GithubPersonal access tokens。在这里新建token,https://github.com/settings/tokens 并把对repo的控制勾上。

格式跟Coding那个仓库差不多,可以免密ClonePush等。

代码语言:javascript复制
https://token@github.com/用户名/项目名.git

所有Git的操作就跟在本地一样,唯一的区别就是CI的服务器PushGithub很快hhh,格式如下,最后分支那里不用加HEAD

代码语言:javascript复制
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版本,其实这个无所谓。

代码语言:javascript复制
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就是我服务器目录。然后就是替换操作了。

代码语言:javascript复制
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目录内的东西移动到工作目录,然后cloneGitHub的仓库,把.git移动到工作目录,删除clone的产物,最后git pushgit init然后添加远程仓库就是push不上去也不知道什么原因,我只能先这样。其他东西参考上文。

在每个步骤的最后我都添加了一步,推送消息到企业微信,这还挺方便的,执行到哪里了也都知道。

这个CI没有用代码仓库所以不会检测repo然后触发自动构建,所以在触发规则中,选择API触发,可以直接生成CURL触发命令,项目令牌和密码也可以一键生成,时间可以自定义。然后复制这个触发命令。

代码语言:javascript复制
curl -u <项目令牌用户名>:<项目令牌密码> 
   -v -X POST  '自己的CI点生成可以看到' 
   -H 'Content-Type: application/json' 
   -d '
    {
    "ref": "master",
    "envs": []
}'

再次创建一个CI,使用Coding的仓库,然后创建一个Shell命令,把刚刚复制的CURL命令粘贴进来然后保存就可以。

最终就会是:我本地提交gitCoding的仓库,触发器这个CI检测到仓库变化然后运行,运行的内容就是启动另外一个CI,触发器结束任务,主要的CI开始运行我指定的内容。官方文档写的非常好,可读性极强。

0 人点赞