将战争文件从 GitLab 复制到 EC2

Posted

技术标签:

【中文标题】将战争文件从 GitLab 复制到 EC2【英文标题】:Copying a war file from GitLab to EC2 【发布时间】:2022-01-16 13:20:48 【问题描述】:

我正在尝试创建一个 CI/CD 管道来构建 war 文件并将其从 GitLab 部署到 EC2。

war 文件创建后,我想将其复制到 EC2 中的某个文件夹,以便从那里将其复制到 tomcat 服务器。

以下是“.gitlab-ci.yml”文件。

stages:
    - build
    - deploy

build:
    stage: build
    image: maven:3-jdk-8
    script:
        - mvn install
    artifacts:
        paths:
            - target/

deploy:
    stage: deploy

    before_script:
        # Generate SSH Key
        - mkdir -p ~/.ssh
        - echo -e "$EC2_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
        - chmod 600 ~/.ssh/id_rsa
        - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
    script:
        - scp target/gitlabec2pipeline.war ec2-user@$EC2_DEPLOY_SERVER:/gitlabec2pipeline.war
        - bash .gitlab-deploy-ec2.sh

我添加了 AWS_ACCESS_KEY_ID 和 AWS_SECRET_KEY 变量。 但是当上述管道运行时,在部署阶段 scp 命令给出“权限被拒绝”错误。 关于如何解决这个问题的任何想法?

错误信息:

Running with gitlab-runner 14.5.2 (e91107dd)
  on blue-3.shared.runners-manager.gitlab.com/default zxwgkjAP
Resolving secrets
00:00
Preparing the "docker+machine" executor
Using Docker executor with image ruby:2.5 ...
Pulling docker image ruby:2.5 ...
Using docker image sha256:27d049ce98db4e55ddfaec6cd98c7c9cfd195bc7e994493776959db33522383b for ruby:2.5 with digest ruby@sha256:ecc3e4f5da13d881a415c9692bb52d2b85b090f38f4ad99ae94f932b3598444b ...
Preparing environment
00:01
Running on runner-zxwgkjap-project-31676452-concurrent-0 via runner-zxwgkjap-shared-1639429231-955193ca...
Getting source from Git repository
00:02
$ eval "$CI_PRE_CLONE_SCRIPT"
Fetching changes with git depth set to 50...
Initialized empty Git repository in /builds/te2122/deploytoaws/.git/
Created fresh repository.
Checking out dc27fd6f as master...
Skipping Git submodules setup
Downloading artifacts
00:02
Downloading artifacts for build (1880203000)...
Downloading artifacts from coordinator... ok        id=1880203000 responseStatus=200 OK token=9RSALYus
Executing "step_script" stage of the job script
00:02
Using docker image sha256:27d049ce98db4e55ddfaec6cd98c7c9cfd195bc7e994493776959db33522383b for ruby:2.5 with digest ruby@sha256:ecc3e4f5da13d881a415c9692bb52d2b85b090f38f4ad99ae94f932b3598444b ...
$ mkdir -p ~/.ssh
$ echo -e "$EC2_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
$ chmod 600 ~/.ssh/id_rsa
$ [[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
$ scp target/gitlabec2pipeline.war ec2-user@$EC2_DEPLOY_SERVER:/gitlabec2pipeline.war
Warning: Permanently added '54.205.169.131' (ECDSA) to the list of known hosts.
scp: /gitlabec2pipeline.war: Permission denied
Cleaning up project directory and file based variables
00:00
ERROR: Job failed: exit code 1

谢谢。

【问题讨论】:

你能提供你看到的exact权限被拒绝错误吗? 添加了部署作业日志。请检查。 【参考方案1】:

我添加了 AWS_ACCESS_KEY_ID 和 AWS_SECRET_KEY 变量。

AWS 密钥在这里无关紧要,因为当您使用 ssh(或 scp)连接到 EC2 实例时,您使用 SSH 密钥进行身份验证。

如果您确定使用了正确的键值,则说明您的环境变量 $EC2_SSH_PRIVATE_KEY 格式不正确。常见问题是变量中的换行符和使用 CRLF(通常可以在 Web UI 中复制/粘贴密钥时添加)而不是 LF。

要更可靠地解决此问题,您可以:

    使用file type variable,然后将文件复制到~/.ssh 或 base64 在将密钥放入 CI 变量之前对其进行编码。这避免了换行符和 CRLF 的任何可能问题。然后在作业中对其进行解码,将值放入文件中。

更新:

您的用户似乎没有服务器上目标目录的权限。您需要为ec2-user 提供适当的权限,或者选择用户有权写入文件的其他目标位置。

【讨论】:

我尝试使用文件类型变量。但没有运气。我观察到的一件事是 "echo -e "$EC2_SSH_PRIVATE_KEY" > ~/.ssh/id_rsa" 没有创建 id_rsa 文件。我做错了什么吗? @Subbu 感谢您更新问题。看起来您在实例上的 ec2-user 没有将文件写入根 / 的权限。尝试将文件放在用户有权访问的其他位置。

以上是关于将战争文件从 GitLab 复制到 EC2的主要内容,如果未能解决你的问题,请参考以下文章

如何从 EC2 运行 Redshift 复制命令

如何将 SSL 证书从证书颁发机构复制到 EC2? [复制]

使用 scp 将文件复制到 Amazon EC2 实例?

我们能否通过 AWS Cloudformation 动态创建密钥对并将 .PEM 文件复制到 EC2 Linux 实例

如何配置 Jenkins 作业以将文件从 git 复制到服务器

如何在gitlab-ci.yml中将文件从存储库复制到用于作业的docker容器中