2017-06-17 3 views
0

ビルドが最初にステージングにデプロイされるようにJenkinsfileのRailsアプリケーションを用意しています。生産に基づいて構築されます。HerokuステージングにデプロイしてからJenkins製作

私は2つのHerokuのインスタンスmyapp-stagingmyapp-productionを設定しました。

node { 
    currentBuild.result = "SUCCESS" 
    setBuildStatus("Build started", "PENDING"); 

    try { 
    stage('Checkout') { 
     checkout scm 
     gitCommit = sh(returnStdout: true, script: 'git rev-parse HEAD').trim() 
     shortCommit = gitCommit.take(7) 
    } 

    stage('Build') { 
     parallel 'build-image':{ 
     sh "docker build -t ${env.BUILD_TAG} ." 
     }, 'run-test-environment': { 
     sh "docker-compose --project-name myapp up -d" 
     } 
    } 

    stage('Test') { 
     ansiColor('xterm') { 
     sh "docker run -t --rm --network=myapp_default -e DATABASE_HOST=postgres ${env.BUILD_TAG} ./ci/bin/run_tests.sh" 
     } 
    } 

    stage('Deploy - Staging') { 
     // TODO. Use env.BRANCH_NAME to make sure we only deploy from staging 
     withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'Heroku Git Login', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) { 
     sh('git push https://${GIT_USERNAME}:${GIT_PASSWORD}@git.heroku.com/myapp-staging.git staging') 
     } 
     setBuildStatus("Staging build complete", "SUCCESS"); 
    } 

    stage('Sanity check') { 
     steps { 
     input "Does the staging environment look ok?" 
     } 
    } 

    stage('Deploy - Production') { 
     // TODO. Use env.BRANCH_NAME to make sure we only deploy from master 
     withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'Heroku Git Login', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD']]) { 
     sh('git push https://${GIT_USERNAME}:${GIT_PASSWORD}@git.heroku.com/myapp-production.git HEAD:refs/heads/master') 
    } 
    setBuildStatus("Production build complete", "SUCCESS"); 
    } 
} 

私の質問は以下のとおりです:

  1. が、これは、これを行うための正しい方法ですまたは他のいくつかのベストプラクティスがある

    私Jenkinsfileは次のようになりノードブロックを持っていますか?たとえば、これに2つのJenkinsパイプラインが必要ですか、それとも1つのプロジェクトパイプラインですか?

  2. JenkinsのBRANCH_NAME変数を使用して、現在の段階に応じて動的に変更する方法を教えてください。

ありがとうございます!

答えて

1

最初の質問では、完全なプロジェクトパイプラインを記述するために1つのJenkinsfileを使用することが望ましいです。プロセスの記述をすべて1か所に保持し、1つのUIでプロセスフローを表示するので、Jenkinsfileはその点で優れているようです。

2番目の質問では、ifの手順をブランチに基づいてラップすることができます。したがって、prodデプロイメントをスキップし、ブランチがマスターでない場合、ステージングが正常に見えるかどうかをユーザーに確認するステップをスキップしたい場合は、これが機能します。

node('docker') { 
    try { 
    stage('Sanity check') { 
     if (env.BRANCH_NAME == 'master') { 
     input "Does the staging environment look ok?" 
     } 
    } 

    stage('Deploy - Production') { 
     echo 'deploy check' 
     if (env.BRANCH_NAME == 'master') { 
     echo 'do prod deploy stuff' 
     } 
    } 
    } catch(error) { 
    } 
} 

私はアイデアを実証する必要はありませんでしたあなたのパイプラインからいくつかのものを削除し、私はまた、二つの問題のように私には見えたもの固定。 1)スクリプティングされたパイプラインと宣言的パイプラインの間にメタファを混在させるように見えました。私はあなたがスクリプトパイプラインを使用しようとしていると思うので、私はそれを完全にスクリプト化しました。つまり、stepsを使用することはできません。 2)tryにはcatchがありませんでした。

今日の終わりには、すべての手順が常にすべてのケースに表示されるため、UIはちょっと変わってしまいます。彼らは渡されたように緑色で表示されますdo(それは、master以外のブランチ上でさえprodに展開されたように見えます)。私が知っている限り、スクリプト化されたパイプラインでこれを回避する方法はありません。宣言型パイプラインでは、whenと同じ条件付きロジックを実行できます。UI(少なくとも青い海のUI)は、実際にあなたの意図を理解し、違う方法で表示します。

楽しいです!

関連する問題