使用代码仓库
持续集成中的中 checkout 详解
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
extensions: [[$class: 'CloneOption', timeout: 120]],
userRemoteConfigs: [[
url: env.GIT_REPO_URL,
credentialsId: env.CREDENTIALS_ID
]]])
GIT_BUILD_REF: CommitId
GIT_REPO_URL: git@e.coding.net:xxxxxx/devops/repo.git 或 https 克隆地址
credentialsId: 代码仓库凭据,本项目仓库是私钥凭据,跨项目代码仓库账号密码凭据,外部仓代码仓库是 OAuth2 的账号密码凭据
extensions: 扩展,帮助我们精细控制检出的方案
持续集成中使用 HTTP Clone
将 URL 给成 HTTP CLONE 地址
将凭据换成系统内置的账号密码凭据
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[
url: env.GIT_HTTP_URL,
credentialsId: env.CCI_CURRENT_PROJECT_COMMON_CREDENTIALS_ID
]]])
checkout 插件有那些扩展?
请参考 Jenkins 官方文档。
如何使用 Shadow 克隆?
//shallow: 设置为 true 表示使用浅 clone
//noTags: 是否 clone tag reference, false 表示要 clone tag
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
extensions: [[$class: 'CloneOption', depth: 1, noTags: false, shallow: true]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]
])
}
}
stage('自定义构建过程') {
steps {
echo '自定义构建过程开始'
}
}
}
}
checkout 插件常见问题
自定义 checkout 插件参数
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
//env.GIT_BUILD_REF 是 commitId 或分支名、 tag 名
branches: [[name: env.GIT_BUILD_REF]],
extensions: [[$class: 'CloneOption', depth: 1, noTags: false, shallow: true]],
//env.GIT_REPO_URL和env.CREDENTIALS_ID 是系统内置的环境
//env.GIT_REPO_URL 通常为 SSH Clone 地址,如 git@e.coding.net:xxxxxx/devops/repo.git
//env.CREDENTIALS_ID 通常为 SSH 私钥凭据
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]
])
}
}
stage('自定义构建过程') {
steps {
echo '自定义构建过程开始'
}
}
}
}
如果有需要使用 checkout 插件检出代码,请务必检查 url 和 credentialsId 是否匹配。
checkout([
$class: 'GitSCM',
branches: [[name: ""master""]],
//credentialsId 请使用用户名密码凭据
userRemoteConfigs: [[url: "https://e.coding.net/xxxx/xxxx/xxxx.git", credentialsId: "xxxx-xxxxx-xx-username-password"]]
])
checkout([
$class: 'GitSCM',
branches: [[name: "master"]],
//credentialsId 请示用 SSH 私钥凭据
userRemoteConfigs: [[url: "git@e.coding.net:cheerego/devops/asafasdfsdf.git", credentialsId: "xxxx-xxxxx-xx-ssh-private-key"]]
])
拉取本项目其他仓库
//CCI_CURRENT_PROJECT_COMMON_CREDENTIALS_ID 是系统内置项目令牌凭据环境变量,可以拉取通过该凭据操作本项目的仓库
//url参数请务必使用 http clone 地址
checkout([
$class: 'GitSCM',
branches: [[name: "master"]],
//credentialsId 请使用用户名密码凭据
userRemoteConfigs: [[url: "https://e.coding.net/xxx/xxx/xxx.git", credentialsId: env.CCI_CURRENT_PROJECT_COMMON_CREDENTIALS_ID]]
])
使用 checkout 插件拉取代码,将代码放到其他目录
dir("second"){
checkout([
$class: 'GitSCM',
branches: [[name: "master"]],
//credentialsId 请使用用户名密码凭据
userRemoteConfigs: [[url: "https://e.coding.net/xxx/xxx/xxx.git", credentialsId: env.CCI_CURRENT_PROJECT_COMMON_CREDENTIALS_ID]]
])
}
如何设置检出超时时间?
//timeout: 单位秒
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
extensions: [[$class: 'CloneOption', timeout: 120]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]
])
}
}
stage('自定义构建过程') {
steps {
echo '自定义构建过程开始'
}
}
}
}
如何使用 LFS 检出代码?
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
extensions: [
// 添加 GitLFSPull 插件
[$class: 'GitLFSPull'],
],
userRemoteConfigs: [[
url: env.GIT_REPO_URL,
credentialsId: env.CREDENTIALS_ID
]]
])
}
}
}
}
如何检出 Git Submodule 代码?
在持续集成构建计划中,若要将子仓库代码作为代码源,需通过流程配置检出 Git Submodule 子仓库代码。
在配置持续集成流程前,请先将子仓库添加至父仓库中。使用 git submodule add
命令添加拟跟踪项目的仓库地址作为子仓库,
git submodule add https://e.coding.net/test/git-sub-module.git
代码提交成功后,在父仓库页将看到此图标:
1. 录入仓库访问凭据
通常情况下,子仓库的访问凭据与父仓库的凭据有差异,也为了避免在持续集成配置中暴露敏感信息,可以先行将父子仓库的访问凭据都录入至项目设置中。
点击项目内左侧菜单栏的「项目设置」→「开发者选项」→「凭据管理」,录入用户名 + 密码或 SSH 私钥,勾选凭据授权的持续集成计划。
录入完成后获取两者的凭据 ID。
2. 配置持续集成流程
参考使用以下 Jenkinsfile 配置:
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
doGenerateSubmoduleConfigurations: false,
// 此处配置 Submodule 的检出规则
extensions: [[
$class: 'SubmoduleOption',
// 是否禁用检出 Submodule
disableSubmodules: false,
// 是否允许检出时使用 Parent Project 的用户凭据
parentCredentials: false,
// 是否递归检出所有 Submodule 的更新
recursiveSubmodules: true,
// 指定参考仓库的路径
reference: '',
// 是否追踪 .gitmodules 文件中配置的分支的最新提交
trackingSubmodules: false
]],
submoduleCfg: [
],
// 此处配置远程 Parent Project 和 Submodules的检出信息
userRemoteConfigs: [
[
// 此处配置远程 Parent Project 仓库 SSH 凭据和仓库地址
credentialsId: '93207d20-****-****-****-410850900d86',
url: 'https://e.coding.net/StrayBirds/Parent/parent.git'
],
// 此处配置远程 Submodule 仓库凭 SSH 凭据和仓库地址
[
credentialsId: '560bdc1e-****-****-****-c8e3ccb3ccc6',
url: 'https://e.coding.net/StrayBirds/Submodule/sub.git'
],
// 如果有更多的 Submodules ,可以在这里增加配置
]
])
}
}
}
}
运行成功后的日志如下:
如何在持续集成中推送代码?
在某些场景下,您可能需要在持续集成阶段推送代码。CODING 的持续集成内置了 Git、SVN 等命令工具,您可以参考如下示例。
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
}
}
stage('修改') {
steps {
sh "echo '# Hello CODING' > README.md"
sh "git add ."
sh "git commit -m 'add README.md' "
}
}
stage('推送') {
steps {
// 使用了 CODING 持续集成系统预置的项目令牌环境变量 PROJECT_TOKEN_GK 和 PROJECT_TOKEN 来推送
// 若希望推送到非本项目或第三方平台的代码仓库,需要自行换成有效的凭据信息
sh "git push https://${PROJECT_TOKEN_GK}:${PROJECT_TOKEN}
@e.coding.net/myteam/myrepo.git HEAD:master"
}
}
}
}
如何拉取多仓库?
- 创建代码仓库项目令牌(需要有创建项目令牌的权限)
在「项目设置」->「开发者选项」->「项目令牌」中新建项目令牌,并勾选读取代码仓库权限。因涉及到两个仓库,需选择「统一配置所有代码仓库权限」,创建完成后获取用户名与密码。
- 在持续集成配置中选择不使用代码源。
- 编写 Jenkinsfile 配置文件,填写需拉取的代码仓库地址
pipeline {
agent any
stages {
stage('检出1') {
steps {
sh 'git clone "https://${GIT_USER}:${GIT_PASSWORD}@e.coding.net/codes-farm/laravel-demo.git"'
sh 'ls -la'
}
}
stage('检出2') {
steps {
sh 'git clone "https://${GIT_USER}:${GIT_PASSWORD}@e.coding.net/codes-farm/laravel-demo/config.git"'
sh 'ls -la'
}
}
}
}
- 将第一步申请的项目令牌的用户名与密码添加至持续集成的环境变量中。
关联的工蜂仓库无法同步至外部仓库列表
目前需在工蜂授权时选择 “当前帐号” 的授权范围才能成功同步到外部仓库列表,并在持续集成构建任务重被检出,如果您选择的授权范围是 “项目组” 或 “项目”,则无法成功同步。
如何在构建计划中使用 SSH 私钥推拉代码?
当一些仓库严格要求使用 SSH 协议进行代码拉取时,此时便需要将 SSH 私钥录入至构建机中。下文将简要介绍如何在保证密钥安全的情况下在构建计划中使用私钥。
- 加密私钥
首先对私钥内容进行处理,分别在 -----BEGIN RSA PRIVATE KEY-----
后和 -----END RSA PRIVATE KEY-----
内容前添加换行符 \n
。
- 将私钥添加至构建计划的环境变量中
自定义变量名称,将处理后的私钥内容填写至默认值中,并勾选“保密”选项。
- 在流程配置文件中引用此变量
将上个步骤中所命名的环境变量(PRIVATE_KEY)添加至流程配置中。
writeFile(file: '/root/.ssh/id_rsa', text: "${PRIVATE_KEY}")
sh 'chmod 600 /root/.ssh/id_rsa'
如下图所示,即可使构建机调用私钥访问对应权限的代码仓库并进行操作。
已关联私有 GitLab 仓库但检出代码失败
造成此问题的原因为您在绑定私有 GitLab 时所使用的 URL 与仓库实际的 URL 不一致,有可能导致构建计划执行时代码拉取失败。构建计划执行时,拉取的仓库地址将从下图的配置信息中拉取。
访问
http://your-gitlab-address/api/v4/projects
获取此配置信息。
若配置中的地址无法被公网访问,例如为内网地址,那么将拉取失败。
解决办法:
在构建计划中新增 GIT_REPO_URL
环境变量,将可被公网访问的仓库地址填入其中。
提示网络连接异常怎么办?
问题描述:使用持续集成检出代码时报错并提示连接异常。
解决办法:造成此问题的原因有可能是构建计划使用了关联仓库,而关联仓库的 OAuth 鉴权已过期。你可以参考本文重新授权并关联外部仓库。
在阅读中是否遇到以下问题?*
您希望我们如何改进?*
如果您希望得到回复,请留下您的邮箱地址。