【问题标题】:Create Jenkinsfile from "execute shell" commands从“执行 shell”命令创建 Jenkinsfile
【发布时间】:2017-09-14 16:12:26
【问题描述】:

我在 Jenkins 构建中有一系列 Execute shell 框。经过 3 天的 Google 和观看视频后,我需要帮助。我更像是一个系统管理员而不是一个编码器,所以我很难用正确的选项和语法创建一个 Jenkinsfile。任何人都可以建议吗?我需要创建一个管道。出于安全原因,<name> 中的任何内容都是这样的,我在文件中有真正的值。

执行shell

mkdir -p deploy

执行shell

cp -R code/api deploy/
cp docker/Dockerfile.dev deploy/
(cd deploy/api/<Name>.<Name>.Web/ && aws s3 cp --recursive --region=eu-west-1 s3://config.<name>/audience-view/atg/dev/API/ .)

执行shell

cd deploy &amp;&amp; docker build -t &lt;name&gt; -f Dockerfile.dev .

执行shell

aws ecr get-login --region eu-west-1 > docker_login.sh && chmod +x 
docker_login.sh && ./docker_login.sh
docker tag <name>:latest 543573289192.dkr.ecr.eu-west-
1.amazonaws.com/<name>:latest
docker push <name>.dkr.ecr.eu-west-1.amazonaws.com/<name>:latest

执行shell

docker rmi audience-view-dev-api
docker rmi 543573289192.dkr.ecr.eu-west-1.amazonaws.com/<name>:latest

执行shell

RUNNING_TASKS=$(aws ecs list-tasks --region=eu-west-1 --cluster <name> --family <name> --query 'taskArns')
if [ "$RUNNING_TASKS" != "[]" ]; then
TASK_ARN=$(aws ecs list-tasks --region=eu-west-1 --cluster a<name> --family <name> --query 'taskArns[0]' | sed 's/\"//g')
aws ecs stop-task --region=eu-west-1 --cluster=<name> --task=$TASK_ARN --reason="Deployment from Jenkins" 
while [ $RUNNING_TASKS != "[]" ]; do
    sleep 5
    RUNNING_TASKS=$(aws ecs list-tasks --region=eu-west-1 --cluster <name> --family <name> --query 'taskArns')
done
fi

执行shell

TASK_ARN=$(aws ecs start-task --region=eu-west-1 --cluster <name> --task-definition <name> --container-instances 5f0c5b75-64a2-45cf-8ced-d6a6d13d2666 --query 'tasks[0].taskArn' | sed 's/arn:aws:ecs:eu-west-1:543573289192:task\///' | sed 's/\"//g')
TASK_STATUS=$(aws ecs describe-tasks --region=eu-west-1 --cluster <name> --tasks $TASK_ARN --query 'tasks[0].lastStatus')
while [ $TASK_STATUS == "PENDING" ]; do
echo $TASK_STATUS
TASK_STATUS=$(aws ecs describe-tasks --region=eu-west-1 --cluster <name> --tasks $TASK_ARN --query 'tasks[0].lastStatus' | sed 's/\"//g')
if [ $TASK_STATUS == "STOPPED" ]; then
    echo $(aws ecs describe-tasks --region=eu-west-1 --cluster <name> --tasks $TASK_ARN --query 'tasks[0].containers[0].exitCode')
    exit 1
fi
done

【问题讨论】:

  • 我认为最好将源代码放在任何 RCS 中(现在最好是 git)。您的 Jenkins 工作应该检查项目并调用一个脚本。这可以完成您在上面粘贴到问题中的所有内容,也可以调用一堆其他脚本,每个脚本都执行一个块。

标签: bash docker jenkins jenkins-pipeline


【解决方案1】:

Jenkins 最好用作将所有构建部分连接在一起的粘合剂,而不是构建脚本本身。正如 Alfe 所提到的,最好将这一切都放在一个 shell 脚本中,然后用 Jenkins 运行这个 shell 脚本。

但是,如果您真的想在管道作业中执行此操作,它看起来像这样(声明性管道):

pipeline {
    agent any

    stages {
        stage('setup') {
            steps {
                sh "mkdir -p deploy"
            }
        stage('nextStage') {
            steps {
                sh """
                    cp -R code/api deploy/
                    cp docker/Dockerfile.dev deploy/
                    (cd deploy/api/<Name>.<Name>.Web/ && aws s3 cp --recursive --region=eu-west-1 s3://config.<name>/audience-view/atg/dev/API/ .)
                """
            }
        }
        stage('anotherStage') {
            steps {
                echo "repeat for all your shell steps"
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2011-06-15
    • 1970-01-01
    • 2014-04-21
    • 2014-01-22
    • 2011-03-04
    • 2013-08-25
    • 1970-01-01
    相关资源
    最近更新 更多