1

シナリオは次のとおりです。

私はRESTインターフェースを呼び出し、変数のいくつかの状態を整数として返すJavaアプリケーションを実行しています(基本的に最後に成功したビルド#フォームTeamcity)

ここで、Jenkinsからユーティリティを実行しているので、2つのREST呼び出し間でLastSuccessfulBuild番号を比較したいと思います。これを行うための最良の方法は何ですか?これが私がコードに関して持っているものです。

import java.io.File;
import java.io.FileInputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
import java.util.TimeZone;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.io.FileUtils;

public class LastSuccessBuildNum {

    private  final static String getDateTime()
    {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd_hh:mm:ss");
        df.setTimeZone(TimeZone.getTimeZone("EST"));
        return df.format(new Date());
    }

    public static void main(String[] args) {

        try {

            Client client = Client.create();
            Properties properties = new Properties();
            File f = File.createTempFile("default", ".properties");

            properties.load(new FileInputStream("config.properties"));

            String currentDir = System.getProperty("user.dir");


            String username = properties.getProperty("username");

            String pass = properties.getProperty("password");
            //System.out.println(pass);
            String buildNumber = properties.getProperty("buildNumber");


            client.addFilter(new HTTPBasicAuthFilter("username", "password"));

            WebResource webResource = client
                    .resource("http://a.b.c.d/teamcity/app/rest/buildTypes/id:bt26/builds/status:SUCCESS/number");
            ClientResponse response = webResource.accept("text/plain").get(
                    ClientResponse.class);

            if (response.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : "
                        + response.getStatus());
            }

            /**
             * Prepend timestamp to latestBuildNum
             */

            System.out.println(getDateTime());
            String latestBuildNum_1 = response.getEntity(String.class);

            //System.out.println("Output from Server .... \n");

            /** 
             * Save latest build number to a local file
             */
            //System.out.println(latestBuildNum);

            String datelbn = (getDateTime() + "-" + latestBuildNum_1);
            //System.out.println(datelbn);
            //If latestBuildNumberLocal < latestBuildNum, then save to file latestBuildNum
            // Else do nothing
            FileUtils.writeStringToFile(new File("PreMDNSlatestSuccBuildNum.txt"), latestBuildNum_1);
            /**
             * Get Content from the file, which would be the LatestBuildNumber at LAST run.
             * SO the NEXT run, will save the number in a different file.
             * Then we compare the contents of these two files
             * using StringToInt() and compare
             */

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

}
4

1 に答える 1

0

これがあなたが望むもののスケッチです。「ボイラープレート」の量を減らすために多くのライブラリがあります (たとえば、Apache Commons IO。Java 7 では、例外処理とリソースのクリーンアップも統合されています。

また、このコードを「生産準備完了」にするためにできることは他にもあります (これは単なるスケッチです)。まず、STDOUT (java.util.logging少なくとも) の代わりにログ ライブラリを使用する必要があります。

最後に、私の例ではプリミティブ int の読み取り/書き込みを行いますが、文字列の読み取り/書き込み/解析もほぼ同じ方法で行うことができます。

import java.io.*;
import java.util.concurrent.atomic.AtomicInteger;

public class GetLatestBuildNumber {


    private static final AtomicInteger number = new AtomicInteger();
    private static final String FILE_NAME = "latest_build_number.txt";

    public static void main(String[] args) {

        int latest = fetchLatestBuildNumber();
        writeLatestBuildNumber(latest);
        int next = fetchLatestBuildNumber();

        int previous;
        try {

            previous = readLatestBuildNumber();

            System.out.println("previous build number " + previous);
            System.out.println("current build number " + next);

        } catch (IOException ioe) {
            System.out.println("failed to read last build number " +
                        "from file " + FILE_NAME + ": " + ioe);
        } catch (NumberFormatException nfx) {
            System.out.println("failed to parse last build number: " + nfx);
        }

    }

    private static int fetchLatestBuildNumber() {
       return number.getAndIncrement();
    }

    private static void writeLatestBuildNumber(int number) {

        int latestBuildNumber = fetchLatestBuildNumber();
        FileWriter writer = null;
        try {
            writer = new FileWriter(FILE_NAME);
            writer.write(Integer.toString(latestBuildNumber));
        } catch (IOException ex) {
            System.out.println("failed to write build number "
                        + number + ", error: " + ex);
        } finally {
            try {
                if (writer != null) writer.close();
            } catch (IOException e) { /* we tried... */ }
        }

    }

    private static int readLatestBuildNumber() throws IOException  {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(FILE_NAME));
            String number = reader.readLine();
            return Integer.parseInt(number);
        } finally {
            try {
                if (reader != null) reader.close();
            } catch (IOException e) { /* we tried. */ }

        }

    }
}
于 2012-09-07T17:36:17.053 に答える