Coding代码仓库及CICD

标签: Git 分类: 软件 创建时间:2020-12-05 14:21:46 更新时间:2023-10-20 11:23:25

因为我最后还是没有使用Coding的CI/CD进行自动部署Hexo,所以最后放弃了,选择了AzureDevops自动部署,成功了。不仅免费的CI/CD时间(免费的1800分钟)比Coding(免费的CI/CD的1000分钟)长,而且功能更加的丰富,我对于AzureDevops使用也是有一点经验的,毕竟自己也在服务器上搭建了相应的服务器。

coding提供了私有仓库的设计,同时还提供了类似于Jenkins的持续集成和部署工具。我使用coding的目的,其实就是因为使用Hexo搭建博客的时候,运行hexo d进行博客部署,会出现非常的慢的情况,有人说是因为网络的问题,那么能不能有什么自动化的方法进行自动部署呢?为什么不选择gitlab,gitlab也支持CI/CD,但是我家里的网络,和公司的网络,都无法向gitlab推送代码,所以非常的蛋疼。还有一个选择就是使用Travis CI,但是这个网站或者是工具

使用Docker构建环境

使用最简单的构建步骤,也还是会出现问题:## 74b8db29/script.sh: docker: not found

我的操作也很简单,就是点击构建计划,新建构建计划,然后添加构建步骤,所有的都是默认的,第二步是默认的代码检出,然后就是自定义构建过程,我根据官方文档选择了Docker,然后选择了nodejs 12版本。然后就是开始构建。结果就会报错了。

对应的Jenkinsfile文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
pipeline {
agent {
docker {
reuseNode true
registryUrl 'https://coding-public-docker.pkg.coding.net'
image 'public/docker/nodejs:12'
}

}
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]])
}
}
stage('自定义构建过程') {
agent {
docker {
reuseNode true
registryUrl 'https://coding-public-docker.pkg.coding.net'
image 'public/docker/nodejs:12'
}

}
steps {
sh 'node --version'
}
}
}
}
参考文章:
1.持续集成的构建环境 (这是官方的构建说明)
2.script.sh: docker: not found #962 (这是对应的Jenkins问题,和Coding好像还不大一样)

使用官方提供的构建环境

使用Docker不行,使用官方提供的默认的构建环境,执行node –version 命令行,就可以。

执行hexo d命令

既然能运行node命令,那么接下来要做的就是尝试着让构建环境构建hexo 部署环境,因为我源码中使用了gulp进行压缩和代码混淆等功能,如果能同时运行gulp命令,那么就可以更加的轻松和愉快了。话不多说,直接尝试着写shell脚本.

1
2
3
npm install
npm install -g gulp
npm install -g hexo-cli

但是很遗憾,就是失败了。

继续努力

经过多次尝试,在设置构建任务的时候,使用图形化工具,可以安装gulp并执行构建任务。

但是出现的主要问题是在身份认证的过程了。

因为在本机开发的时候,从github上下载和上传代码,都是用ssh,我在github上也上传了我电脑的id_rsa.pub密钥,但是使用自动构建的时候,如何上传密钥呢?

参考文章:
1.Jenkins - SSH认证方式拉取Git代码
2.在持续集成中使用凭据 (这里是官方说明如何添加私钥)
3.jenkins credentials & git ssh 认证 (这里主要就是Jenkins中配置凭据的过程,就是添加一个环境变量)

使用凭据

(1) 首先就是在项目设置->开发者选项->凭据管理->录入凭据,创建一个ssh私钥,也就是把电脑上的~/.ssh/id_rsa.pub中的内容复制到coding中。

(2) 第二步就是在项目的构建计划->构建任务->设置->流程配置->图形化配置->自定义构建过程中选择加号->添加其他->withCredentials,就可以使用这个密钥了

(3) 在凭据配置中,可以设置命名用户私钥路径名以及子步骤

生成的Jenkinsfile文件大致如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]])
}
}
stage('自定义构建过程') {
agent {
docker {
reuseNode true
registryUrl 'https://coding-public-docker.pkg.coding.net'
image 'public/docker/nodejs:12'
}

}
steps {
withCredentials([ sshUserPrivateKey(credentialsId:'00b09c1d-2078-4c1f-978a-da964e7aaa24',keyFileVariable:'~/.ssh/id_rsa')
]) {
sh '''npm install
npm install -g gulp
npm install -g hexo-cli
git remote -v
hexo clean
hexo g
hexo d'''
}

}
}
}
}

(4) 使用凭据拉取代码
创建了凭据之后,就可以使用凭据进行拉取代码的操作,其中的url就是远程仓库的地址,credentialsId就是密钥的id号

1
2
3
4
5
6
7
8
checkout([
$class: 'GitSCM',
branches: [[name: "master"]],
userRemoteConfigs: [[
url: "xxxt",
credentialsId: "00b09c1d-xxxxx"
]]])
}
参考文章:
1.构建 npm 类型制品 (这里又一个在step中使用withCredentials的方法,使用的是usernamePassword用户名密码的方式,这个已经很接近了,但是不是我需要的)
2.Checkout Jenkins Pipeline Git SCM with credentials? (这其实是如何配置Jenkins检出不同代码库的方式)
3.在Docker容器中使用ssh密钥 (在Docker容器中使用ssh密钥)
4.其他凭据类型 (这是Jenkins中关于withCredentials使用的方法)
5.Jenkins的凭证管理 (这篇文章类似于翻译一样,没有什么实际的例子可以借鉴)
6.SSH 指定密钥,连接远程服务器。 (这篇文章讲的是如何在使用ssh的时候,直接指定密钥文件的路径)
7.如何告诉git哪个私钥要使用? (这里是git又变量可以指定ssh密钥)
8.Is it possible to Git merge / push using Jenkins pipeline (这里提供了一个方式就是使用sshagent,以及使用)

ssh-add和sshagent

几经周折,还是没有成功。但是我在一篇gitlab的自动化部署方案上,看到了有ssh-add这个方法,不知道能不能用。

参考文章:
1.使用GitLab Ci 自动部署Hexo到GitHub (这个是使用gitlab进行自动部署的文章)
2.Install SSH Key task (这个是使用Azure Devops进行安装密钥的方法)
3.Jenkins的sshagent/credential設置 (这个就是Jenkins使用ssagent进行密钥登录ssh的过程,也就是上传密钥文件,然后使用ssagent通过id引入)
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。