编译相关
- CODING 持续集成兼容的 Jenkins 版本
- 不同配置来源区别是什么
- 如何查看工作空间目录
- 如何 Debug 构建任务
- 常见错误码
- npm 报错:Treating warnings as errors because process.env.CI = true.
- 构建日志提示 please install Python3.6+ and set bin to $PATH
- 构建分钟数怎么计算的?代码扫描、制品扫描是否算入构建分钟数?
- 构建计划一启动就直接失败,看不到错误信息
- docker build 生成镜像报错 unauthorized: authentication required
- Commit 不存在
- 如何理解核时?能转化为多少分钟?
- 自定义构建节点接入需要开放什么端口么,数据流向是怎样的?
- 场景需求:从 CODING 仓库,代码更新上传后,自动(或者手动一键)更新到正式服务器
- Android 自动化构建使用 java-android 模板,报错 uninitialized keystore
- 打包 maven 项目,怎么使用自己的私服仓库?
- node.js 构建时提示 oom(out of memory)
- 如何自动打包 unity 应用并发布至制品库?
CODING 持续集成兼容的 Jenkins 版本
目前,CODING 持续集成提供的公共构建节点使用 Jenkins 2.293 版本。
CODING 目前已经支持了凭据管理,我们建议用户使用更安全的凭据来管理秘钥。
如需了解如何使用凭据,请参考凭据管理。
不同配置来源区别是什么
在创建构建计划时选择使用 代码仓库中的 Jenkinsfile 与 静态配置的 Jenkinsfile 有什么区别?
选择使用代码仓库中的 Jenkinsfile 后,该文件将存储至代码仓库中。修改 Jenkinsfile 意味着需在代码仓库中提交修改记录,若修改持续集成的触发条件,还可以自动触发集成任务。
使用静态配置的 Jenkinsfile 后,该文件将不会存储在代码仓库中,修改 Jenkinsfile 不会更新代码仓库内容,执行构建时将统一使用静态配置,保障构建流程的一致性。
如何查看工作空间目录
在流程配置中的 shell 步骤添加 pwd 命令行进行查看。
如何 Debug 构建任务
如果你需要 Debug 构建运行过程,可以通过在构建过程中添加以下步骤的方式提供 ssh:
steps {
sh 'apt-get update'
sh 'apt-get install -y tmate openssh-client'
sh '''echo -e \'y
\'|ssh-keygen -q -t rsa -N "" -f ~/.ssh/id_rsa'''
sh 'tmate -S /tmp/tmate.sock new-session -d'
sh 'tmate -S /tmp/tmate.sock wait tmate-ready'
sh '''
tmate -S /tmp/tmate.sock display -p \'#{tmate_ssh}\'
tmate -S /tmp/tmate.sock display -p \'#{tmate_web}\'
echo "WebURL: ${tmateWeb}"
echo "SSH: ${tmateSSH}"
'''
sh 'sleep 3600'
}
常见错误码
当编译构建报错时,可参考下述常见错误码处理方案。
./gradlew: not found
此问题常见于使用了错误的持续集成模板。您可以检查所使用的的代码仓库中是否有 gradlew
文件或者文件的目录位置是否与持续集成中定义的文件路径相符。
./gradlew: Permission denied
此错误是因为文件缺少执行权限,将文件赋予执行权限即可。例如在执行文件之前添加命令: chmod +x gradlew
。
codingArtifactsGeneric
完整错误码:codingArtifactsGeneric ERROR: no file found
。
出现此错误需检查构建过程的步骤中所定义的文件名或路径是否正确,所在的文件的相对路径为:/root/workspace
,例如按下图所示填写了 README.md
文件,那么实际所使用的的路径为: /root/workspace/README.md
。
file does not exist
完整错误码:The specified user settings file does not exist: /root/workspace/./settings.xml
此错误表示执行在 Maven 命令时找不到 settings.xml
文件。可以通过 ls -ltr
命令看看当前目录是否有这个文件,如果没有,可以把本地的 settings.xml
和 pom.xml
文件提交到代码仓库,然后通过检出代码将其拉取至编译机器中,点击查看参考代码仓库。
reached pull rate limit
使用 CI 拉取镜像时提示 reached your pull rate limit
报错,如下图所示:
这是因为 Dockerhub 的免费账户存在镜像拉取次数限制,CODING 的出口 IP 达到了 Dockerhub 的拉取次数限制而出现的错误,您可以参考下文中的两个办法解决此问题:
将镜像托管至 CODING Docker 制品仓库,详情请参考《快速开始——Docker 制品库》。
使用个人 Dockerhub 账号
若您没有 dockerhub 账号,请在 Dockerhub 官网注册官方账号。
注册完成后修改构建计划配置,在 docker 执行命令前添加此行,填入已注册的账号:
docker login -u -p
username=$(docker info | sed '/Username:/!d;s/.* //');
echo $username
执行时可以在日志查看到正在使用的 dockerhub 账号,若账号符合拉取次数限制条件即可解决此问题。
no checksums available
使用 Maven 编译时报错:Failed to execute goal on project xxxxxx Checksum validation failed, no checksums available
。
你可以在持续集成设置 → 流程配置中的命令行添加 -c 参数,例如:mvn clean package -c -DskipTests -gs settings.xml
后解决此问题。
Switch Maven repository
完整错误码:Switch Maven repository 'maven(
问题描述:使用 gradle 时返回此错误码。
解决办法:需要前往持续集成设置 → 流程配置,在制品编译步骤前添加一条 shell 命令。
rm /root/.gradle/init.gradle
npm 报错:Treating warnings as errors because process.env.CI = true.
问题描述:CI 中构建 npm 项目时,出现 “Treating warnings as errors because process.env.CI = true.” 的提示信息。
当相同代码在本地可以正常构建,在 CODING CI 中异常且有上述提示信息,请先排除代码差异性。
解决办法:在编译前补充命令 export CI=false,例如:
export CI=false && npm run build
构建日志提示 please install Python3.6+ and set bin to $PATH
问题描述: 构建日志提示 please install Python3.6+ and set bin to $PATH。
解决办法: 出现这个问题应该检查一下当前环境是否有 Python3.6 版本以上的环境,可以在 shell 命令步骤写 python --version
命令查看当前环境的版本情况。
构建分钟数怎么计算的?代码扫描、制品扫描是否算入构建分钟数?
问题描述: 构建分钟数怎么计算的?从来没构建过为什么纪录了那么多时间,代码扫描、制品扫描是否算入构建分钟数?
解决办法: 测试管理、代码扫描不占用构建分钟数,制品扫描占用构建分钟数。
构建计划一启动就直接失败,看不到错误信息
问题描述: 构建计划一启动就直接失败,看不到错误信息,什么原因?
解决办法: 通常是因为 Jenkinsfile 里面有特殊字符,可以尝试把 Jenkinsfile 每行的结尾及换行删除后重新添加,或复制到新的构建计划上执行并检查是否可以正常执行。
docker build 生成镜像报错 unauthorized: authentication required
问题描述:
docker build 生成镜像报错 “unauthorized: authentication required”。
原因:
因为 Dockerfile 里 FROM 的基础镜像属于私有镜像仓库,所以需要认证授权。需要在 docker build 前,先通过 docker login 登录到该私有仓库。
解决方法:
已获取登录私有仓库的用户名和密码。
- 方法一:使用加密变量方式登录。
将密码添加到加密变量后,使用 docker login 命令进行登录。
- 在「持续集成」->「构建计划」中点击构建计划右上角的「···」,进入构建计划设置页面。在「流程配置」页签,点击「添加环境变量」。例如,环境变量名设置为 DOCKER_PASSWORD,勾选「保密」。
- jenkinsfile 使用 shell 命令如下,根据自己的仓库进行修改即可。
sh "docker login -u php-laravel-1696665622059 -p ${DOCKER_PASSWORD} jiyunkeji-docker.pkg.coding.net"
- 方法二:使用凭据方式登录。
将用户名密码添加到凭据里。
- 在「项目设置」->「开发者选项」->「凭据管理」,点击「录入凭据」创建凭据,并保存凭据 ID。
- 在「持续集成」->「构建计划」中点击构建计划右上角的「···」,进入构建计划设置页面。在「流程配置」页签,添加「withCredential 凭据」插件。
- 选择创建的 withCredential 凭据,在 withCredential 凭据配置页的「插件配置」页签删除子步骤的「打印消息」,添加「执行 shell 脚本」插件。
- shell 脚本内容如下所示,用户名变量、密码变量需根据自己的仓库进行修改。
docker login -u ${USERNAME} -p ${PASSWORD} jiyunkeji-docker.pkg.coding.net``
Commit 不存在
问题描述:
点击「立即构建」,提示“commit 不存在”。
原因:
通常该提示是因为对应的代码分支或者对应的 commit 不存在。
解决方法:
前往代码仓库查看分支是否存在,如果该分支不存在,可以将默认启动分支改为代码仓库默认分支。
如何理解核时?能转化为多少分钟?
问题描述:
如何理解核时?能转化为多少分钟?
解决方法:
核时用量与 CPU 核数正相关。在流水线执行时长相同的情况下,核数越大,消耗的核时数越大。例如,2 核 4 GiB 的流水线执行了 1 小时,则消耗的核时数为: 2 核 x 1 小时 = 2 核时; 若流水线规格为 8 核 16 GiB,则消耗的核时数为:8 核 x 1 小时 = 8 核时。
自定义构建节点接入需要开放什么端口么,数据流向是怎样的?
问题描述:
自定义构建节点接入需要开放什么端口么,数据流向是怎样的?
解决方法:
自定义构建节点接入需要开放的端口是 15740,连通流转流程如下所示。
- 完成通讯(心跳上报和消息接收) qci_worker(自定义的机器) ->(http/websocket)-> CODING 服务端。
worker 到 CODING 服务端是单向通讯的,只需要 worker 能访问到服务端即可。
拉取代码 qci_worker -> (http/ssh)-> CODING 服务端。
推送制品库 qci_worker -> (http/ssh)-> CODING 服务端。
场景需求:从 CODING 仓库,代码更新上传后,自动(或者手动一键)更新到正式服务器
问题描述:
想实现一个需求:从 CODING 仓库,代码更新上传后,自动(或者手动一键)更新到正式服务器。支持哪一种或者哪几种方式?
解决方法:
- 方式 1
通过持续集成,直接参考模板,打开部署的开关,修改命令为您的服务启动命令即可。
- 方式 2
使用持续部署,配置堡垒机、主机组、部署流程,具体操作可以参考部署 Docker 制品至主机组。
如果是 k8s 集群,请参考文档如何将项目发布至集群。
Android 自动化构建使用 java-android 模板,报错 uninitialized keystore
问题描述:
Android 自动化构建使用 java-android 模板,报错 uninitialized keyst。
原因:
java.security.KeyStoreException: Uninitialized keystore 错误通常表示在尝试访问或操作密钥库之前,密钥库没有正确初始化。这可能是由多种原因导致的,例如使用了错误的密钥库类型、密码不正确或文件损坏。
解决方法:
检查证书的 alias、密码等填写是否正确,凭据是否上传 p12 后缀证书。
确保您在 Linux 上使用的是正确的密钥库类型。对于 P12 证书,您需要指定密钥库类型为 PKCS12。在使用 keytool 时,可以通过添加 -storetype PKCS12 参数来指定密钥库类型。例如:
keytool -list -v -keystore my-release-key.p12 -storetype PKCS12
确保您使用的是正确的密码。在访问密钥库时,您需要提供正确的密码。如果您忘记了密码,可能需要重新生成一个新的证书。
检查证书文件是否在传输过程中损坏。您可以尝试在 Linux 上使用 keytool 查看证书信息,以确保文件没有损坏。如果文件损坏,您需要重新生成或导出证书。
确保您使用的 Java 版本和 keytool 版本是兼容的。在某些情况下,不同版本的 Java 可能会导致兼容性问题。您可以使用
java -version
和keytool -version
命令来检查您的 Java 和 keytool 版本。如果需要,您可以尝试更新 Java 或使用与您证书兼容的版本。生成证书是否在 Linux 平台生成,不同系统的证书可能会导致兼容性问题。
如果上述检查没问题,插件依然无法正常签名,可不依赖插件,在 jenkinsfile 时直接使用原生命令签名。如下所示示例是在 java 11 的环境下签名。
stage('APK 签名') {
agent {
docker {
reuseNode 'true'
registryUrl 'https://coding-public-docker.pkg.coding.net'
image 'public/docker/openjdk:11-2022'
args '-v /root/programs/:/root/programs/ -e ANDROID_HOME=/root/programs/android-sdk'
}
}
steps {
sh '''
java -jar /root/programs/android-sdk/build-tools/28.0.3/lib/apksigner.jar sign --ks java-android.p12 --ks-type pkcs12 --ks-pass pass:oliverkahn01 --out app/build/outputs/apk/release/app-release-signed.apk app/build/outputs/apk/**/*.apk'''
}
}
--out app/build/outputs/apk/release/app-release-signed.apk
是签名后重命名的 apk。--ks java-android.p12
把 p12 证书拉取到构建环境,例如放代码仓库或放在 generic 仓库拉取过来。
打包 maven 项目,怎么使用自己的私服仓库?
问题描述:
打包 maven 项目,怎么使用自己的私服仓库?
解决方法:
使用 CODING 节点构建的时候,机器上是有默认的 settings.xml 文件,里面配置都是公开的源。
CODING 支持用户使用自己的 Maven 私有仓库,建议私服机器带宽大于 10 M。使用私有仓库时,需要手动配置 settings.xml 文件,或将本地正常编译的 settings.xml 文件上传到代码仓库中,这样在构建的时候这个 settings.xml 文件会跟进代码拉取的步骤一起拉取到机器上的工作目录下,执行 Mvn build 的时候添加参数 -gs 指定这个 settings.xml 文件即可,例如 mvn install -gs ./settings.xml
。
node.js 构建时提示 oom(out of memory)
问题描述:
node.js 构建编译时提示 oom(out of memory),出现内存溢出。
解决方法:
可以尝试增加 Node.js 的内存限制解决内存溢出问题。
通过在运行脚本时使用 –max-old-space-size 参数来增加内存限制,例如:执行 node --max-old-space-size=4096 script.js
,将把内存限制增加到 4 GB,此处内存大小请根据您的实际需求进行调整。
如何自动打包 unity 应用并发布至制品库?
问题描述:
如何使用 CODING DevOps 自动打包 unity 应用并发布至制品库?
解决方法:
- 环境
接入 Mac 自定义节点,具体操作请参考 Mac OS 接入节点。
- 构建计划配置
unity 打包命令可以写在构建计划的 shell 命令脚本中,unity 工程编译出来的包文件可以通过 generic 制品库存放管理。每个工程的编译命令不一样,需要先在本地终端验证命令是否可以正常打包工程。
在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。