我在 gitlab 上有一个项目,必须将另外两个 gitlab 项目安装为 npm 包。当只有一个包时,我的 .gitlab-ci.yml
设置如下:
stages:
- lint
variables:
PROJECT_1_KEY: $PROJECT_1_KEY
lint:
stage: lint
image: node-chrome:latest
before_script:
# install ssh-agent
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
- ssh-add <(echo "$PROJECT_1_KEY")
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
- cd app
- npm install
这个效果很好。
但是,尝试添加第二个项目(需要自己的部署 key )到目前为止尚未成功。
我已将第二个环境变量 PROJECT_2_KEY
添加到变量部分。
我尝试过的事情:
使用ssh-add
添加两个 key
before_script:
# install ssh-agent
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
- ssh-add <(echo "$PROJECT_1_KEY")
- ssh-add <(echo "$PROJECT_2_KEY")
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
- cd app
- npm install
构建单独的文件,每个部署 key 一个,并将它们添加到 .ssh/config
文件
before_script:
# install ssh-agent
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- echo "$PROJECT_1_KEY" > ~/.ssh/project_1
- echo "$PROJECT_2_KEY" > ~/.ssh/project_2
- echo -e "Host project_1\n\tHostName gitlab.com\n\tIdentityFile $HOME/.ssh/project_1" > ~/.ssh/config
- echo -e "Host project_2\n\tHostName gitlab.com\n\tIdentityFile $HOME/.ssh/project_2" >> ~/.ssh/config
- cd app
- npm install
将两个 key 添加到同一个 id_rsa
文件中,并将 gitlab.com 添加到known_hosts
before_script:
# install ssh-agent
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- echo "$PROJECT_1_KEY" >> ~/.ssh/id_rsa
- echo "$PROJECT_2_KEY" >> ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- touch ~/.ssh/known_hosts
- ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
- cd app
- npm install
我的飞行有点盲目。对于我想要做的事情有正确的技术吗?
最佳答案
我在不同的上下文中进行了类似的战斗(PHP Composer 需要私有(private) gitlab 存储库)。我无法让基于 SSH 的示例以我满意的方式工作,因此我选择利用使用自定义 url 作为已定义依赖项的引用的 Composer 设置。
在 PHP 中,它看起来像这样:
"require": {
"foo/bar": "dev-master",
...
"repositories": [
{
"type": "vcs",
"url": "https://gitlab+deploy-token-1234:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c8a9aaabe5acadaee5afa0a1a2a388afa1bca4a9aae6aba7a5" rel="noreferrer noopener nofollow">[email protected]</a>/path/to/repo.git"
}
]
因此,鉴于 npm 上下文,您可以使用 dependencies关键字来定义使用包含要进行身份验证的 token 数据的 git url 的项目?
"dependencies" : {
"foo/bar" : "https://gitlab+deploy-token-1234:<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="e3828180ce878685ce848b8a8988a3848a978f8281cd808c8e" rel="noreferrer noopener nofollow">[email protected]</a>/path/to/repo.git",
}
如果您不喜欢在提交的 package.json 中包含身份验证数据,您可以尝试忽略它并仅使用原始 git url。在构建过程中的某些项目中,我只是直接 git 克隆另一个私有(private)项目,并且构建过程似乎有权克隆而无需配置任何内容。 (我不完全确定构建过程被授权为“谁”,但大概是触发构建的用户?)
关于npm - gitlab-ci:使用不同的 ssh key 将多个 gitlab 存储库安装为 npm 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56548786/