将战争文件从 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的主要内容,如果未能解决你的问题,请参考以下文章
如何将 SSL 证书从证书颁发机构复制到 EC2? [复制]
我们能否通过 AWS Cloudformation 动态创建密钥对并将 .PEM 文件复制到 EC2 Linux 实例