从Jenkins管道运行aws
时,我收到以下错误消息:command not found
-which aws
返回command not found
。
另一方面,当从单个作业运行aws
时,它起作用——which aws
返回/usr/local/bin/aws
。
你知道为什么会发生这种事吗?
谢谢。
您仍然需要在docker容器中安装AWS CLI。
# Swap to root user to install pip and aws cli then go back to jenkins user
USER root
RUN apt-get update
RUN apt install python3-pip -y
RUN pip3 install awscli --upgrade
USER jenkins
在我的案例中,问题只是我在docker容器中运行Jenkins,而我的AWS-CLI安装在主机上。暂时的解决方法是我通过";docker exec";并在该容器中安装了AWS-CLI。如果我的容器重新启动,我可能不得不再次安装AWS-CLI。更好的方法是创建一个docker映像,其中包含Jenkins旁边的AWS-CLI,或者使用AWS-CLI Jenkins代理来运行这些步骤/作业。
解决方案1:使用Dockerfile在Jenkins容器中安装aws-cli,并使用已存储在主机上的凭据。
工作示例:
Dockerfile:
FROM jenkins/jenkins:lts
USER root
# Set timezone
ENV TZ="UTC"
RUN apt-get -y update --fix-missing
# Install useful tools
RUN apt-get -y install nano wget ntp git curl libcurl4 libcurl4-openssl-dev zip unzip jq
# Install AWS Cli:
# https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install
docker-compose.yml:
Version: '3.3'
services:
jenkins:
container_name: jenkins
build:
context: ./
dockerfile: Dockerfile
hostname: jenkinslocal
user: root
ports:
- 8500:8080
volumes:
# local persistent storage for docker to keep plugins, jobs, workspaces, etc
- ./jenkins-data:/var/jenkins_home
# mount the source file for project for easy access in pipeline
# and in project pipeline -> configure SCM -> GIT url can be:
# file:///projects/project1
- /Users/bogdan/docker/project1:/projects/project1
# make docker available in container
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
#provide AWS CLI credentials from host
- /Users/bogdan/.aws:/root/.aws
解决方案2:使用docker映像和aws-cli,aws-cli由具有主机凭据的aws提供。在这种情况下,如果您没有其他工具要安装,则不需要Dockerfile,只需要docker-compose.yml文件
工作示例:
Version: '3.3'
services:
jenkins:
container_name: jenkins
# image from docker hub
image: jenkins/jenkins:lts
hostname: jenkinslocal
user: root
ports:
- 8500:8080
volumes:
# local persistent storage for docker to keep plugins, jobs, workspaces, etc
- ./jenkins-data:/var/jenkins_home
# mount the source file for project for easy access in pipeline
# and in project pipeline -> configure SCM -> GIT url can be:
# file:///projects/project1
- /Users/bogdan/docker/project1:/projects/project1
# make docker available in container
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
文档可在此处找到:https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-docker.html
Jenkins启动并运行后,您可以登录Jenkins容器:
docker exec -it jenkins bash
并像这样运行AWS-CLI:
docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli --version
在Jenkins管道中使用此命令将很困难,并且脚本不会在真正的生产服务器上运行,因此您需要创建一个别名来使用命令";aws":
alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v amazon/aws-cli'
现在你可以测试:
aws --version
为了避免登录Jenkins容器,您可以将命令添加到docker-compose.yml文件:
command: sh -c "alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v amazon/aws-cli'"
重要!
解决方案2在某些情况下可能很难使用,因为默认情况下,bash脚本中不提供别名。