git - 在 Docker 中的 Jenkins 构建脚本中调用 Git

标签 git bash docker jenkins ssh

我有一个 Jekyll 网站(GH 页面)的构建脚本,需要从脚本内部调用需要 Github 身份验证的 git 命令。这是脚本:

#!/usr/bin/env bash

rm -rf _site/

git clone <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="dbbcb2af9bbcb2afb3aeb9f5b8b4b6" rel="noreferrer noopener nofollow">[email protected]</a>:RIT-EVT/RIT-EVT.github.io.git --branch master --depth 1 _site

LIVE_VERSION_BUILD=`cat _site/version`

LIVE_VERSION=${LIVE_VERSION_BUILD%.*}
LIVE_BUILD=${LIVE_VERSION_BUILD##*.}
PACKAGE_VERSION=`sed -nE 's/^\s*"version": "(.*?)",$/\1/p' package.json`

if [[ "$LIVE_VERSION" == "$PACKAGE_VERSION" ]]; then
    LIVE_BUILD=`expr $LIVE_BUILD + 1`
else
    LIVE_VERSION=${PACKAGE_VERSION}
    LIVE_BUILD=0
fi

rm -rf _site/*

jekyll build
echo "$LIVE_VERSION.$LIVE_BUILD" > _site/version

cd _site/
git add -A
git commit -m "v$LIVE_VERSION.$LIVE_BUILD $(date)"
git push
cd ..

我正在从 Docker Hub pull 出的 Docker 容器中运行 Jenkins。我通过添加 Jenkins 使用的相同私钥信息来修改容器,以执行存储库的初始克隆。但是,当我从脚本调用 git 命令时,它说它未经身份验证:

Started by user evt
Building in workspace /var/jenkins_home/workspace/Website Deploy
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8aede3fecaede3fee2ffe8a4e9e5e7" rel="noreferrer noopener nofollow">[email protected]</a>:RIT-EVT/RIT-EVT.github.io.git # timeout=10
Fetching upstream changes from <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d9beb0ad99beb0adb1acbbf7bab6b4" rel="noreferrer noopener nofollow">[email protected]</a>:RIT-EVT/RIT-EVT.github.io.git
 > git --version # timeout=10
using GIT_SSH to set credentials GitHub - ssh
 > git fetch --tags --progress <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="ed8a8499ad8a849985988fc38e8280" rel="noreferrer noopener nofollow">[email protected]</a>:RIT-EVT/RIT-EVT.github.io.git +refs/heads/*:refs/remotes/origin/*
 > git rev-parse refs/remotes/origin/develop^{commit} # timeout=10
 > git rev-parse refs/remotes/origin/origin/develop^{commit} # timeout=10
Checking out Revision 85084620e62b5b03f02c610e33880eeb94b12531 (refs/remotes/origin/develop)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 85084620e62b5b03f02c610e33880eeb94b12531
 > git rev-list 85084620e62b5b03f02c610e33880eeb94b12531 # timeout=10
[Website Deploy] $ /bin/bash -xe /tmp/hudson9119924045433544873.sh
+ rm -rf _site/
+ git clone <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f89f918cb89f918c908d9ad69b9795" rel="noreferrer noopener nofollow">[email protected]</a>:RIT-EVT/RIT-EVT.github.io.git --branch master --depth 1 _site
Cloning into '_site'...
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Build step 'Execute shell' marked build as failure
Finished: FAILURE

因此,关键信息显然适用于 jenkins 的 git 插件,但无论出于何种原因,容器中的 git 二进制文件都没有获取该 key 。更奇怪的是,我可以通过 SSH 连接到运行容器的机器,使用 docker exec -it jenkins bash 进入容器,然后运行相同的 git 命令,并且它运行得很好。

这让我想到这可能是用户和权限的问题。所以我试图找出 jenkins 正在以什么用户身份运行脚本。这是我运行的非常小的脚本:

echo ${USER}
echo hello # Just a sanity test to make sure that echo works :p

这是我得到的输出:

misc. Jenkins stuff...
[Website Deploy] $ /bin/sh -xe /tmp/hudson1343134234815638946.sh
+ echo

+ echo hello
hello
Finished: SUCCESS

因此,它似乎无法访问加载到 ssh-agent 中的 key 信息,因为该脚本不是在加载 key 的同一用户下运行(?)

任何帮助将不胜感激:)

更新:

我运行了 whoami 来看看这是否适用于脚本,它给了我 jenkins 作为结果:

[Website Deploy] $ /bin/bash -xe /tmp/hudson2652666458388248519.sh
+ whoami
jenkins
Finished: SUCCESS

所以我很困惑为什么 git 无法从 ssh-agent 获取私钥。

最佳答案

我知道出了什么问题了。如果我使用 docker exec -it jenkins bash 登录容器,跑eval `ssh-agent -s`启动 ssh-agent,然后运行 ​​ssh-add <keyFile> ,我可以运行 git clone就在壳里。

但是,如果退出 shell 并通过运行相同的 docker 命令重新登录,ssh-agent 将不会启动,也不会加载私钥,这让我相信 ssh-agent 实际上并不是当 Jenkins 构建运行时运行。

所以,我改用 https使用 git 并使用凭据绑定(bind)插件将用户名和密码提供到存储库的 URL 中。

所以本质上,您不能从 Jenkins 构建脚本调用 git 命令并期望能够使用您的 SSH key 。

关于git - 在 Docker 中的 Jenkins 构建脚本中调用 Git,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42651937/

相关文章:

git - 如何保护实时服务器上的 git 存储库

Git:致命:名为 'master' 的分支已经存在

bash - 如何在非 Bash Shell 中迭代 Null 分隔结果

git - 将免费源代码控制转换为 CM Synergy

linux - bash for 循环不循环(awk,bash,linux)

regex - 如何使用 pcregrep 排除多个目录?

Docker cp错误: Path not specified

r - R-install.packages在计算引擎上的Coreos上的Docker中不起作用

docker - 从docker内部通过Oracle VM和cntlm代理进行Internet访问

git - 在 Windows 7 上使用生成的 key SSH 推送到 Bitbucket