gitlab-ci:使用不同的ssh密钥将多个gitlab仓库安装为npm模块

时间:2019-06-11 17:17:36

标签: npm ssh gitlab gitlab-ci

我在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

这很好。

但是,到目前为止,尝试添加需要其自己的部署密钥的第二个项目一直没有成功。

我在变量部分添加了第二个环境变量PROJECT_2_KEY

我尝试过的事情:

使用ssh-add添加两个键

  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

构建单独的文件,每个部署密钥一个,然后将它们添加到.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

将两个密钥都添加到同一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

我有点瞎了。我要做什么是正确的技术?

1 个答案:

答案 0 :(得分:0)

我只是在不同的上下文中进行了类似的战斗(PHP Composer需要私有gitlab存储库)。我无法使基于SSH的示例以我满意的方式工作,因此我选择利用composer设置,该设置使用自定义url作为已定义依赖项的引用。

在PHP中,它看起来像这样:

"require": {
       "foo/bar": "dev-master",
...
"repositories": [
    {
        "type": "vcs",
        "url": "https://gitlab+deploy-token-1234:abc-def-ghijk@gitlab.com/path/to/repo.git"
    }
]

因此,在npm上下文的情况下,您可以使用dependencies关键字来使用git url定义项目,该git url包含要认证的令牌数据吗?

"dependencies" : {
  "foo/bar" : "https://gitlab+deploy-token-1234:abc-def-ghijk@gitlab.com/path/to/repo.git",
}

如果您不喜欢在已提交的package.json中包含身份验证数据,则可以尝试忽略它,而只使用原始git url。在构建过程中的某些项目中,我只是对另一个私有项目进行了直接git克隆,并且看起来构建过程有权克隆而无需进行任何配置。 (我不能完全确定构建过程的身份是谁,但是大概是触发构建的用户?)