JavaEEのアプリケーションをPayaraへデプロイするのを「Jenkins」で行っていたのですが、数ヶ月前から急に「CargoException」が頻発するようになりました。
org.codehaus.cargo.util.CargoException: Deployment has failed: null
現状のデプロイ方法
現状はこちら。
- Payara 4.1.1.163 (JDK8)
- Jenkins ver. 2.195
- Deploy to container 1.15
デプロイについては、Deploy to containerプラグインを使っていました。
下記のコードが、デプロイ部のパイプラインです。
stage('Deploy App') { steps { deploy adapters: [glassfish4(adminPort: '4848', credentialsId: 'payara_admin', home: '/opt/payara/163/payara41/bin/asadmin', hostname: "${AP_SERVER_NAME}")], contextPath: 'AppName', onFailure: false, war: 'target/AppName.war' } }
コードを直したわけでもなく、原因がよくわかりません・・・。
今後のデプロイ方法
こいつは困ったぞ、と途方に暮れていたら、Payara(というかGlassfish)では、「autodeploy」ディレクトリーに warファイルを投げ込めば、自動的にデプロイしてくれる機能を思い出しました(寺田さん、ありがとう!)。
というわけで「Deploy App」ステージを、次のようにメンバーに書き直してもらいました。
stage('Deploy App') { steps { script { def remote = [:] remote.name = "${AP_NAME}" remote.host = "${AP_SERVER_NAME}" remote.port = "${SSH_PORT_NUM}" remote.allowAnyHosts = true withCredentials([usernamePassword( credentialsId: 'userName_ap_ssh', passwordVariable: 'password', usernameVariable: 'userName')]) { remote.user = userName remote.password = password sshCommand remote: remote, command: "hostname" sshPut remote: remote, from: 'target/AppName.war', into: '/tmp' sshCommand remote: remote, command: "chown payara:payara /tmp/AppName.war", sudo : true sshCommand remote: remote, command: "mv -f /tmp/AppName.war /opt/payara/163/payara41/glassfish/domains/domain1/autodeploy", sudo : true } } } }
今度は、SSH Pipeline Steps(2.0.0)を使わさせていただきました!
権限まわりで苦労しているところはありますが、とりあえず安定化させることはできました。
変更後2週間になりますが、成功率100%です(実行数は10回くらいですが)。
まとめ
突然、予期せぬ例外が発生すると焦ってしまいますよね。
とはいえ、複数の選択肢を持っていると安心感が増します。
「複数の選択肢を持っていることが、自由であるということ」とどなたかが言っていましたが、ホント、その通りだと思います。
今回の改変で、手段は変わりましたが、目的は実現できたので オッケー ということにしておきます。