text:
Common Build Procedures, Tips + Tricks
This document is directed to the Eclipse Modeling Framework Technologies (EMFT) [1] technology project committers and was created help them to set up and work on their projects. It describes the existing procedures that all EMFT subprojects are supposed to adopt, describing, for example, how the files should be organized, what the build files are, and the Integration and Milestone release process.
Throughout this document are references to releng (Release Engineering) files which need to be configured along the way. When a project is first starting, these steps are normally skipped until after all the plugin content is in CVS. Then, and only then, the EMFT Releng Module can be created for the new project, and builds can begin.
Overwhelmed yet?
Well, you're in luck. As of 2006-07-12, there is a new module template which can be used as a starting point. For more on creating and configuring an EMFT Releng Module, see EMFT Releng Module. Go there, start with that, then come back here for tips and tricks if necessary.
This is a live document! We will be enriching it as questions are raised.
- 1 Plugin and Feature Files
- 1.1 Directory Structure
- 1.2 General Recommendations
- 1.3 Branding Icon In About Eclipse Dialog
- 1.4 Branding Plugin <example>
- 1.5 Core Plugins & Features <example>
- 1.6 Documentation Plugin & Feature <example>
- 1.7 Tests Plugin & Feature
- 1.8 Examples Plugin & Feature
- 1.9 SDK Feature
- 1.10 Source Plugin & Feature <example>
- 2 Building Zips & Jars
- 2.1 Incubation Status
- 2.2 Customizing Zip Bundles
- 2.3 Using Third Party Jars
- 2.4 Standalone Zip Bundles
- 2.5 Build Server Directory Structure
- 2.6 Testing & Diagnosing Builds
- 2.7 Suppressing Compiler Warnings
- 2.8 Heterogeneous Compiler Source/Target Levels
- 2.9 Build Problems & Solutions
- 3 Branching
- 4 Release Process
- 4.1 Renaming a Build / Releasing Your GM Build
- 4.2 Promoting A Build
- 4.3 Update Manager Sites & Build Types
- 4.4 Generating Release Notes
- 4.5 Automatically Fixing Assigned Bugs
- 4.6 Newsgroup Announcement Setup
- 4.7 SSH Key Setup
- 4.8 Promotion Problems (CVS Errors, SCP Errors, Artifacts Not Created...)
- 5 Maintenance Processes
- 5.1 Removing CVS Tags
- 5.2 Removing Old Builds
- 5.3 Removing Update Manager Jars
- 5.4 Build.php Dependency URL Cleanup
- 5.5 Removing or Replacing a Bad Build
Plugin and Feature Files
The contents of your features and plugins directories should mimic what is available in the EMF and UML2 projects. Although this section tries to summarize the important points, "learning by example" is the recommended approach.
Directory Structure
We will ask you to organize your files as we've done for EMF and UML2. Basically you will need to create the following directory structure for each subdirectory you own under the EMFT module:
|OLD Style -- features intermixed
|NEW Style -- features separated
Old EMFT project (/cvsroot/technology)
emft/[subproject]/ plugins doc tests examples
- or -
New EMFT project (/cvsroot/modeling/)
org.eclipse.*/org.eclipse.*.[subproject]/ plugins doc tests examples
Old EMFT project (/cvsroot/technology)
emft/[subproject]/ plugins doc tests examples features
- or -
New EMFT project (/cvsroot/modeling/)
org.eclipse.*/org.eclipse.*.[subproject]/ plugins doc tests examples features
The directories containing features and fragments must be suffixed by -feature and -fragment respectively.
If you want source plugins and features, you will have to create them.
General Recommendations
- Each feature and plugin directory should be also an Eclipse project, containing all the necessary files such as, for example, .project.
- The .project must only refer to builders available to the open-source community. Also, since Eclipse 3M2, it should not refer to other plugin projects. <example>
- We use CVS to backup the files, so...
- You can, and probably should, use the $Id$ CVS tag. For more details and other tags read the CVS documentation
- Add a .cvsignore file to keep unnecessary files (such as the output directory) out of CVS. <example>
- Don't add unnecessary files to your plugins and features. If you use a "non-Eclipse standard" file, please ensure that it has a purpose and that that purpose is clear.
- All plugins should provide the following files:
- The build.properties file is extremely important and must be accurate to allow PDE to build your plugins and features. Please review the EMF build.properties files for plugins with code, documentation and branding plugins, and features.
Features <example>
- The PDE build process is based on features, so all your plugins must be referenced by a feature.
- A feature directory can contain the definition of other features and plugins. As you can see in the example, we use this to define "derived" elements, like EMF's SDK feature, source feature and source plugin.
- A feature's build.properties file can specify that the source plugin and feature should be generated. In EMF, this is done in the SDK feature's build.properties.
Qualifiers (1.0.0.qualifier)
- To add qualifiers to features and plugins, you must have 4 pieces set up correctly.
- 1. Plugins <example>
- Append .qualifier as the 4th field of the plugin version in every MANIFEST.MF file.
- Append .qualifier as the 4th field of the plugin version in every MANIFEST.MF file.
- 2. Features <example>
- Append .qualifier as the 4th field of the feature version in every feature.xml file.
- Ensure that if you have comments before the <feature> tag, they do NOT include the word "feature". If they do, 1.0.0.qualifier will not be replaced by PDE with the build's timestamp/id. This is documented in bug 129868.
- Change the versions in all plugins included in feature.xml files to 0.0.0. PDE will replace 0.0.0 by the appropriate version during the build.
- 3. Doc
- Ensure that org.eclipse.[subproject].doc/build.xml uses ${pluginVersion}.${forceContextQualifier} instead of ${pluginVersion} or a hard-coded version like 1.0.0. You may need to add a new property. <example>
<property name="pluginVersion" value="1.0.0"/>
- Add these lines to the end of the gather.bin.parts target in org.eclipse.[subproject].doc/build.xml (line break added in path attribute). <example>
<eclipse.versionReplacer path="${destination.temp.folder}/org.eclipse.[subproject].doc_\ ${pluginVersion}.${forceContextQualifier}" version="${pluginVersion}.${forceContextQualifier}"/>
- 4. Releng
- Add the following lines to the create.label.properties target of releng/[subproject]/buildAll.xml. <example>
<property name="forceContextQualifier" value="v${timestamp}"/>
<echo file="${buildDirectory}/label.properties" append="true" > forceContextQualifier=${forceContextQualifier} </echo>
- OPTIONAL: If you would like your features' versions to be suffixed with a dash followed by a random string of letters and numbers, you must also add a line to your build.properties files. Why would you want this? It is apparently calculated from the CVS tags to ensure that the version for the features will change if the source changes in the build.
- 5. Releng
Tip: due to property file parser limitations in Eclipse, it is recommended that you always leave an empty line at the end of .properties (and .properties.template) files.
- For more on plugin versioning, see http://www.eclipse.org/equinox/documents/plugin-versioning.html.
Branding Icon In About Eclipse Dialog
If you want to use the Eclipse Modeling icon in the About Eclipse dialog, you must reference it correctly in ALL your about.ini files, eg:
- org.eclipse.xsd.doc/about.ini
- org.eclipse.xsd/about.ini
- org.eclipse.xsd.sdk-feature/sourceTemplatePlugin/about.ini
# Property "featureImage" contains path to feature image (32x32) featureImage=modeling32.png
Note that the latest Eclipse Modeling icon is modeling32.png, as decided by bug 154906. You can copy this new icon from here: modeling32.png
Branding Plugin <example>
- The "branding plugin" is the plugin that provides specific files to describe a feature - check the example to see what these files are.
- It is recommended that the branding plugin be given the same name and id as the feature it describes.
- The "branding plugin" may also contain source, so you don't need to create an additional plugin just to hold the branding files.
Core Plugins & Features <example>
Core Plugins
For plugins with code:
- The EMF artifacts and model specifications (XML schema, for example) should be located in a models directory in the root of the plugin. Don't forget to include the genmodel to allow users to regenerate your code.
- DO commit all generated code. This makes it easier to run your plugin from the workspace.
- The source files should be placed in "source folders" and each "source folder" should have a different "output folder".
- The plugins with code should be deployed as jarred plugins. In order to tip the PDE build to jar a plugin, you need to set the MANIFEST.MF's Bundle-ClassPath attribute to . and use . in the build.properties file. As an example, look at the ecore's manifest and build.properties mentally replacing ecore.jar by ..
Right now you are probably asking yourself why the ecore files are declaring a jar instead of using .. To make a long story short, this is necessary for EMF to bootstrap itself during development (required when you use EMF to develop EMF). When developing, we can easily zip the contents of the output folder into the appropriate jar and restart Eclipse. Our build "fixes" the files before the plugins are packaged. Btw, to jar your plugin, you will also need to add unpack="false" to the plugin reference in your feature. <example>
- Almost all files should have a copyright. This is what is used for the Java files in EMF (please check the other types of files in the example):
/** * <copyright> * * Copyright (c) 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation * * </copyright> */
- The META-INF/MANIFEST.MF must end with an empty line. Also, don't forget to add the following line to the manifest to ensure the plugin classes are properly initialized:
Eclipse-LazyStart: true
- The .classpath files should only contain references to the JDK and PDE container and the definition of the source and output folders.
- In order to ensure that your plugin.properties files can be translated, you will need to add the following "directives" to them. All strings after a given directive are supposed to conform to its rules:
|Each string is assumed to be processed by the MessageFormat class (single quote must be coded as 2 consecutive single quotes '').
|All strings are assumed to NOT be processed by the MessageFormat class (single quote must be coded as 1 single quote ').
|Strings which contain replacement variables are processed by the MessageFormat class (single quote must be coded as 2 consecutive single quotes ''). Strings which do NOT contain replacement variables are NOT processed by the MessageFormat class (single quote must be coded as 1 single quote ').
- Add a schema for each extension point you define in your plugin. <example>
Core Features
This is a stub. Contribute to this wiki by adding content here.
Documentation Plugin & Feature <example>
- While the PDE build is able to automatically create the Ant build script for the plugins with source code, you will need to hard code and maintain the script for the documentation plugins. The easiest way of creating the script (called build.xml) is:
- After adding all the files to the plugin directory and configuring the build.properties file, right click the plugin.xml file and select PDE Tools->Create Ant Build File.
- Open the build.xml file and delete the tasks in the gather.bin.parts; target.
- In the build.jars, use the zip ant tasks to zip up the content of the plugin - this is required since Eclipse expects the documentation files to be in an archive file.
- Open the build.properties editor and select the "Custom Build" check box at the top of the page
- Every time you start code a new release, you will need to manually update this build script. See the "Release Process" section for more details on new releases.
Javadoc <example>
- Creating javadoc in your plugin requires a number of files & folders:
- build.xml (including all source), or
build.xml (excluding internal packages & classes)
- plugin.xml
- toc.xml (table of contents)
- build.properties
- build/antJavadoc.sh
- build/javadoc.xml.template
- build/overview.html
- images/ (folder, ref'd in build.xml#build.jars)
- references/ (folder, ref'd in build.xml#build.jars)
- tutorials/ (folder, ref'd in build.xml#build.jars)
- build.xml (including all source), or
- Note that unless you have images, references, or tutorials at the time you're creating these files, you'll have to toss a placeholder into them so they won't be pruned (ignored) when extracting from CVS. A simple (blank) .cvsignore file will do nicely.
Javadoc Indexed By Eclipse Help
To get Eclipse to index your javadoc in the Help system, you must revise the following files (see also bug 142558):
1. Specify where extra topics_*.xml files are attached to the main table of contents entry: toc.xml
<topic label="Reference"> <link toc="topics_Reference.xml"/> </topic>
2. Specify which files to include in the doc plugin (custom build script, not PDE-generated): build.xml
<target name="gather.bin.parts" depends="init" if="destination.temp.folder"> ... <fileset dir="${build.result.folder}" includes="about.*,eclipse*.gif,eclipse*.png,eclipse*.jpg,plugin.*,toc*.xml,topics_*.xml,doc.zip,index/**,META-INF/**"/> ... </target>
3. UPDATED Configure javadoc.xml.template, if required. Doclet is no longer used; instead, generation is done simply in antJavadoc.sh
<target name="javadoc" depends="extractPlatformJavadoc"> ... <javadoc ...> <arg value="-J-Xmx256m"/> ... </javadoc> ...
4. Define extension points to allow extra topics_*.xml files to be seen in Eclipse Help: plugin.xml
<!-- ============================= --> <!-- Define TOCs --> <!-- ============================= --> <extension point="org.eclipse.help.toc"> <toc file="topics_Reference.xml" /> </extension> <!-- ============================= --> <!-- Define Javadoc locations --> <!-- ============================= --> <extension point="org.eclipse.pde.core.javadoc"> <javadoc path="references/javadoc"> <!-- defaults to reference/api --> </javadoc> </extension>
Tests Plugin & Feature
This is a stub. Contribute to this wiki by adding content here.
Examples Plugin & Feature
This is a stub. Contribute to this wiki by adding content here.
SDK Feature
This is a stub. Contribute to this wiki by adding content here.
Source Plugin & Feature <example>
- To create a source plugin and feature, you must have 5 pieces set up correctly.
- 1. org.eclipse.[subproject]-feature/feature.xml <example>
- This will define which *src.zip files will be created - one per plugin include in the feature. If you want source for your examples, do the same in your [subproject].examples-feature.
- [update] NOTE: you must include your branding plugin (eg., org.eclipse.net4j) in your branding feature (eg., org.eclipse.net4j-feature/feature.xml), even if it contains NO source, in order to properly suppress unpacking src/* in the .source plugin. Ensure that you've set that plugin to be unpack="false":
<plugin id="org.eclipse.net4j" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
- 2. org.eclipse.[subproject]-feature/sourceTemplateFeature/* <example>
- 3. org.eclipse.[subproject]-feature/sourceTemplatePlugin/* <example>
- These define the contents that will go into your source feature(s) and plugin(s).
- 4. org.eclipse.[subproject]-feature/org.eclipse.[subproject].sdk/feature.xml <example>
<includes id="org.eclipse.[subproject].source" version="1.0.0" match="compatible"/>
- This connects your SDK to your .source plugins/features so that they will be included in the SDK. For more on match rules, see Matching Rules.
- 5. org.eclipse.[subproject].*/build.properties (for ALL applicable plugins) <example>
Bundle-ClassPath With Dot
RECOMMENDED: jarred plugins w/ org/eclipse/.../*.class files
Bundle-ClassPath With Jar
NOT RECOMMENDED: jarred plugins with nested jars
# NLS_MESSAGEFORMAT_VAR source.. = src/ output.. = bin/
src.includes = about.html bin.includes = plugin.xml,\ plugin.properties,\ icons/,\ .,\ META-INF/
Use . instead of a jar name; repeat in MANIFEST.MF files:
Bundle-ClassPath: .
# NLS_MESSAGEFORMAT_VAR source.[Bundle-ClassPath] = src/ output.[Bundle-ClassPath] = bin/
src.includes = about.html bin.includes = plugin.xml,\ plugin.properties,\ icons/,\ [Bundle-ClassPath],\ META-INF/
Note that [Bundle-ClassPath] is the jar name defined in the matching MANIFEST.MF, such as:
Bundle-ClassPath: eodmeditor.jar
These define what gets packaged in the *src.zip files. You should NOT use src.includes = src/ unless you want your source plugin to include BOTH a *src.zip (containing *.java source files) and the unpacked *.java source files themselves.
Multiple Namespaces
- If you want to contribute sources to your SDK, you must create a source plugin and feature for every feature that will contribute source. If you only have one main feature, eg, org.eclipse.emf.[subproject]-feature, there will be one src.zip created for every plugin listed in that feature's feature.xml. If you have more than one, as in the case with org.eclipse.emf.transaction, containing both org.eclipse.emf.transaction-feature and org.eclipse.emf.workspace-feature, each must contain its own sourceTemplateFeature and sourceTemplatePlugin. (???)
- You can also use the generate.feature directive in your SDK's build.properties, if you have source for more than one namespace. (???)
Building Zips & Jars
- We use the Eclipse build process which relies on PDE. See this article if you are interested in the details. It also covers the JUnit automated tests that can be run during the build.
- You can use PDE to configure what will appear in your zips.
Incubation Status
In order to comply with Eclipse.org's Incubation Rules, EMFT components must adhere to these 3 rules.
For example, here are the changes required to make EMF Compare compliant: Search CVS results
- 1. All downloadable zip files for builds and milestones must include the word
incubationin the filename. For example,
emft-compare-SDK-incubation-N200708031343.zip. The jar files in the download zip file are NOT required (bug 178944) to contain the word
incubationin the filename.
- To change your build to provide
-incubationin the zip names, search your .releng project for "
.zip" and fix all files accordingly. Releng Example
- Building: customTargets.xml (all versions of this file)
- Testing: relengbuildgtk.sh, testManifest.xml, testManifest.xml.template, testing.properties, readme.html
- Promoting: promoteToEclipse.*.properties
- 2. All
Bundle-Names must include the world
incubation. Note that
Bundle-SymbolicNames should not include
incubationbecause the Bundle-SymbolicName is a technical namespace, not a user namespace. For example,
Bundle-Name: Foo Plug-in (Incubation).
- Update all your component's MANIFEST.MF and/or plugin.properties files, including tests, examples, and doc (which file to edit depends on where "Bundle-Name" strings are located). MANIFEST.MF Example
Bundle-Name: %pluginName (Incubation) [2]
- 3. The names for update manager features must include the word
incubation. For example,
EMF Compare Documentation (Incubation).
- Update all your component's feature.xml and/or feature.properties files, including tests, examples, doc, and SDK features. Add
(Incubation)to both the feature label and the feature description. Feature.* Example
<feature id="org.eclipse.emf.compare.sdk" label="EMF Compare SDK (Incubation)" version="0.7.0.qualifier" provider-name="Eclipse.org">
<description> EMF Compare SDK includes runtime, source, and documentation (Incubation) </description> [3]
When a project exits incubation, above changes should be reversed to remove the
incubation identifiers from features, plugins, and zip file names.
Customizing Zip Bundles
In the event that you have plugins or features that PDE will not normally bundle together, such as .ui plugins in the runtime zip, you will need to adjust the way PDE behaves in order to ensure all your plugins/features appear in your zips as you need them. If you need a custom zip, like EMF has for Models or Standalone, this is also how you can accomplish this.
There's two ways to customize what gets put into a zip bundle by PDE: the correct way (a) and the shortcut (b)
Option A
The first method involves creating a feature which sets up the included features/plugins that have to be in there, as with .sdk features in the EMFT subprojects (ocl, query, validation, transaction). See details in CVS. An example of this is org.eclipse.emf-feature/org.eclipse.emf.sdk. It is nested (rather than being its own org.eclipse.emf.[subproject].[bundlename]-feature) for cosmetic reasons (it looks in the file system).
When creating a new org.eclipse.emf.[subproject]-feature/org.eclipse.emf.[subproject].[bundlename] (or org.eclipse.emf.[subproject].[bundlename]-feature), you will need to ensure it's properly connected to the build harness in 3 ways:
- 1. First, you'll need a folder under your builder/ directory for the feature build, such as:
Into this folder must go a customTargets.xml and a build.properties file. Then make sure that customTargets.xml refers to the feature correctly, as in customTargets.xml. (Search for "sdk" on lines 9, 20, 187.)
- 2. Then, the buildAll.xml script must be told how to build the new zip, eg, buildAll.xml (line 139):
<target name="buildAll" depends="init"> <ant antfile="build.xml" target="main"> <property name="component" value="builder/sdk"/> </ant> ... </target>
- 3. And finally, you need to add the custom feature to the mapfile & mapfile template, since it won't be generated by PDE into the mapfile automagically. Examples: org.eclipse.emft/releng/validation/maps/validation.map
Add an entry such as (line break added for clarity):
email@example.com=@cvsTag@,@cvsRoot1@,,org.eclipse.emft/validation/plugins/ org.eclipse.emf.validation-feature/org.eclipse.emf.validation.sdk
Option B (or adding an optional dependency)
The second method is faster (and, arguably, more hackish). This is also a valid method for adding an optional dependency, like for example adding optional support for OCL.
Instead of one feature per zip, as above, you can have custom instructions/rules in the buildAll.xml script which allow you to copy extra files that would normally be excluded from the zip to clean up missing content. These instructions are kept in one place (ie., only one ant script), so maintenance is easier, but this solution should only be used to add files to existing bundles, not to create new, custom ones.
For example, there's a validation.ocl plugin which must be included in the validation runtime, but since the validation-feature makes no mention of it, it's excluded. So, to work around this, once the SDK is built, copy the validaton.ocl plugin & feature from the SDK zip to the runtime zip after its assembly. This is done in the org.eclipse.emft/releng/validation/buildAll.xml script:
<target name="buildAll" depends="init"> <ant antfile="build.xml" target="main"> <property name="component" value="builder/sdk" /> </ant> <ant antfile="build.xml" target="main"> <property name="component" value="builder/runtime" /> </ant> ... <!-- add .ocl feature + plugin from SDK to runtime --> <zip update="true" destfile="${buildDirectory}/${buildLabel}/emft-${subprojectName}-runtime-${buildAlias}.zip"> <zipfileset src="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"> <include name="**/org.eclipse.emf.${subprojectName}.ocl*"/> <include name="**/org.eclipse.emf.${subprojectName}.ocl*/*"/> </zipfileset> </zip> ... </target>
Bear in mind that you must ensure that everything you need to compile is available. You will need to edit all the customTargets.xml files that are used to build code which depends on the new reqiurement. See target "postSetup".
<ant target="getDependency" antfile="${getDeps.xml}"> <property name="url" value="${oclURL}"/> <property name="file" value="${oclFile}"/> <property name="isUnpackedFile" value="${buildDirectory}/plugins/org.eclipse.emf.ocl/plugin.xml"/> </ant>
If your tests require addtional plugins in order to compile or run, be sure to add them to your test.xml file. See target "setup".
Using Third Party Jars
You want to use third party jars during your build, but don't want to ship them due to licensing or other reasons? Here's how:
- First, add the jars to your build or test environment. org.eclipse.emft/releng/cdo/builder/tests/customTargets.xml
<target name="postFetch"> <replace dir="${buildDirectory}/plugins" value="${timestamp}" token="@buildid@"> <include name="**/about.mappings" /> </replace> <echo message="Copy hsqldb.jar into plugins/org.eclipse.emf.cdo.jdbc.hsqldb/lib ..."/> <copy todir="${buildDirectory}/plugins/org.eclipse.emf.cdo.jdbc.hsqldb/lib" file="${buildDirectory}/../../../../../../../downloads/hsqldb.jar" failonerror="true"/> <echo message="Copy mysql-connector-java-3.1.12-bin.jar into plugins/org.eclipse.emf.cdo.jdbc.mysql/lib ..."/> <copy todir="${buildDirectory}/plugins/org.eclipse.emf.cdo.jdbc.mysql/lib" file="${buildDirectory}/../../../../../../../downloads/mysql-connector-java-3.1.12-bin.jar" failonerror="true"/> </target>
- Then, remove the jars from your SDK, Runtime, or test zips if they were added by PDE. org.eclipse.emft/releng/cdo/buildAll.xml
<echo message="Repack zip w/ exclusion filter"/> <zip destfile="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip_" update="true"> <zipfileset src="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"> <exclude name="**/lib/hsqldb.jar"/> <exclude name="**/lib/mysql-connector-java-3.1.12-bin.jar"/> </zipfileset> </zip> <echo message="Remove orig. zip and rename new one"/> <delete file="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"/> <move file="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip_" tofile="${buildDirectory}/${buildLabel}/emft-${subprojectName}-SDK-${buildAlias}.zip"/>
Standalone Zip Bundles
Building a Standalone Zip allows you to provide code for use outside Eclipse. This is not very well documented (yet), but to get a feel for how to build a Standalone bundle, have a look at the following EMF examples:
org.eclipse.emf.releng.build/zips/standalone/ org.eclipse.emf.releng.build/buildAll.xml org.eclipse.emf.releng.build/zips/build.xml (line 14, target "standalone")
org.eclipse.emf.releng.build/testManifest.xml org.eclipse.emf.releng.build/templateFiles/testManifest.xml.template org.eclipse.emf.releng.build/tests/configs/local/customTest.xml
Build Server Directory Structure
Here's a quick snapshot of the directory structure used on the emft build server, so that you can reproduce it elsewhere.
The emft build server (emf.torolab) is running Debian 3.0 (Woody), kernel 2.4.25, with dual 2G AMD Opteron processors, 3G RAM, 1.5G swap, and 33G HD.
|internal web paths (build.php)
|external web path mirrored to download.eclipse (downloads, etc.)
|file used by both build.php and downloads/index.php to display only those builds specified
|where to download project zips
|symlink to /home/www-data/build/emft/[subproject]/downloads/ (so that the downloads page can find the zips)
|build path to where shell scripts are initiated by the web (the apache1.3 user is www-data)
|build path to where build.php's data (URLs and log of requests for builds) is stored
|where required .zips are downloaded prior to building (eg., Eclipse SDK, EMF SDK)
|where [subproject] is built (all versions here, including any NLS zip, once available (if any))
|where [subproject] v1.0.0 is built
|/home/www-data/build/emft/[subproject]/downloads/drops/1.0.0/ [type][yyyymmddHHMM]/
|a specific build's folder, including zips, test results, docs
|/opt/ibm-java2-1.4 -> /opt/ibm-java2-ws-sdk-pj9xia32142-20050609
|default build JDK / used for JUnit tests
|/opt/sun-java2-1.4 -> /opt/j2sdk1.4.2_03
|optional build JDK / used for EMF JDK tests
|/opt/sun-java2-5.0 -> /opt/jdk1.5.0_03
|optional build JDK / used for EMF JDK tests
|/opt/ibm-java2-1.3 -> /opt/IBMJava2-131
|used to test EMF 2.0.x ONLY
|/opt/apache-ant-1.6.1 (or newer)
|build & utility scripts
|/usr/bin/php4 (4.1.2 or newer)
|both Apache module and CLI (command line interface) modules required
Testing & Diagnosing Builds
To determine what's wrong with your build, make sure you're building in debug mode. eg., [4] or [5]. Then set the following parameters:
Build Type: N (Nightly) Tag Build: No Run Tests: JUnit debug java home: /opt/ibm-java2-ws-sdk-pj9xia32142-20050609 debug noclean: Y
Then, you can use the following shell commands:
# shortcut to builds folder alias odd=' cd /home/www-data/build/emft/ocl/downloads/drops/1.0.0' # shortcut to LATEST build folder alias lastfolder='cd `find . -maxdepth 1 -type d -not -name \ "." -exec date -r {} +%s\ {} \; | sort | tail -1 | \ sed -e "s/[0-9]\+\ \.\///g"`' alias oddl='odd; lastfolder' # check build log oddl; tail -60 buildlog.txt # check JUnit test console log oddl; cd testing/*/testing/; tail linux.gtk_consolelog.txt # check JUnit test eclipse workspace error log oddl; cd testing/*/testing/eclipse/workspace/.metadata/; less .log
Suppressing Compiler Warnings
After 3.2M6, PDE will now report compilation warnings in its JUnit test results page.
You can either fix your code to remove these warnings, or suppress the warnings themselves. See /org.eclipse.emft/releng/jet/buildAll.xml, for an example of how to suppress these warnings.
<echo message="Set compilerArgs = '-enableJavadoc -encoding ISO-8859-1 -warn:-serial'"/> <property name="compilerArg" value="-enableJavadoc -encoding ISO-8859-1 -warn:-serial" />
For a complete list of supported warning flags in 3.1 - 3.3, go here: http://help.eclipse.org/help33/index.jsp?topic=/org.eclipse.jdt.doc.isv/guide/jdt_api_compile.htm (see Warning Options).
You can also bring up that same help page in Eclipse's built-in help (JDT Plug-in Developer Guide > Programmer's Guide > JDT Core > Compiling Java code) for the 3.2 version, which adds a couple other options to the list.
Heterogeneous Compiler Source/Target Levels
If your project has plug-ins that have different requirements for the compiler source and target compliance level, the PDE's build.properties file can be used to specify these on a plug-in by plug-in basis. For a plug-in that supports J2SE 1.4 and above, just add:
javacSource = 1.4 javacTarget = 1.4
in that plug-in's build.properties. For a plug-in that uses J2SE 5.0 language capabilities, just add:
javacSource = 1.5 javacTarget = 1.5
and similarly for 6.0, 7.0, ... For an example, see the validation.ocl plug-in, which differs from the other validation plug-ins in requiring J2SE 5.0.
You may already have an EMFT releng system that forces 1.4 source and target in the buildAll.xml file. Simply remove that and the javacSource=1.4 entries from the build.properties files in each builder/* folder. For example, see in the Query component's releng:
- before & after buildAll.xml
- before & after builder/sdk/build.properties.
Build Problems & Solutions
In no particular order, here are some lessons learned from setting up the various EMFT builds:
|Error Message
eclipse/test.assembly/eclipse/ plugins/${org.eclipse.test} not found.
Add the "org.eclipse.test" and "org.eclipse.ant.optional.junit" plugins to each test feature. The task creates one property for each test plugin (the property name is the plugin name minus the version). Only plugins referenced by features are downloaded, and, if a plugin has to be downloaded, the map file has to describe how to do it. Thus this information must appear in two places: tests/customTargets.xml and *.tests-feature/feature.xml. Since "org.eclipse.test" is not listed on the tests feature, it is not being downloaded - regardless of it being listed in the map file.
If you have checked all these conditions and still get an error, make sure your test feature specifies version="0.0.0" for the org.eclipse.test plugin so that PDE can calculate the version for you. This problem manifests with releng.basebuilder versions after M4_33, as discussed in bugs 190834 and 192231.
Additionally, good hygiene suggests that all your features should have the correct builder/nature in their .project files. This will ensure that when you're manipulating your features in Eclipse, PDE will report problems (eg., typos) as they happen rather than during a build.
<buildSpec> <buildCommand> <name>org.eclipse.pde.FeatureBuilder</name> <arguments/> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.pde.FeatureNature</nature> </natures>
|SomeBundleOrClass cannot be resolved (compilation failed).
Check your feature.xml files. PDE will build features in the order they're listed. See also bug 140745.
[exec] -cp org.eclipse.equinox.launcher.Main ... [exec] Unrecognized option: -ws [exec] Could not create the Java virtual machine.
Check relengbuildgtk.sh, and make sure the
|org.eclipse.emft.ocl.releng/ builder/sdk/customTargets.xml -> eclipse/assemble.org.eclipse.emf.ocl.sdk.xml -> eclipse/tmp/eclipse/plugins/ org.eclipse.emf.ocl.doc_126.96.36.199602231606 not found
This could be a number of problems, but the most likely is that org.eclipse.emft/ocl/doc/org.eclipse.emf.ocl.doc/build.xml needs to have the correct value for pluginVersion set or is missing this property entirely.
|java.io.FileNotFoundException: testing/target/eclipse/ plugins/org.eclipse.emf.ocl.tests_1.0.0/ (Plugin is a jar, not a folder)
If your test plugin is compiled as a jar, not a folder, you need to fix your feature.xml. Remove the attribute unpack="false" from the org.eclipse.emf.*.tests plugin:
|java.io.FileNotFoundException: testing/target/eclipse/ plugins/org.eclipse.emf.ocl.tests_1.0.0/ test.xml (No such file or directory)
Add a "test.xml" script to each test plugin, in tests/org.eclipse.emf.*/test.xml.
|java.io.FileNotFoundException: eclipse/fetch_org.eclipse.emft.ocl.sdk.xml (No such file or directory)
|Either the feature doesn't exist (and must be added), or the feature is misreferenced. Make sure that you do not have any scripts referring to, say, plugins or features called org.eclipse.emft.ocl.sdk, but rather org.eclipse.emf.ocl.sdk. The org.eclipse.emft namespace is only for the CVS module; everywhere else, you should use org.eclipse.emf when referencing plugins and features.
|JUnits tests not appearing on testResults.php page
Add an entry for the missing tests into org.eclipse.emft/releng/[subproject]/ templateFiles/testManifest.xml.template and org.eclipse.emft/releng/[subproject]/ testManifest.xml, eg:
<logFile name="org.eclipse.emf.query.ocl.tests_linux.gtk.xml"> <effectedFile id="SDK"></effectedFile> <effectedFile id="projRUN"></effectedFile> </logFile>
|Failure to download and unzip one of the SDKs that your project depends on
You probably have a typo in the URL that you entered into the "New URLs" field. Try the following to get the correct URL every time:
Depending on your configuration, you may have an extra navigation to a mirror site in the above sequence.
|Build is ok, everything compiles, but plugins are missing from the SDK!
|Build is ok, everything compiles, but SDK includes BOTH unpacked source files and packed src.zip files.
Verify that you have included your branding plugin (eg., org.eclipse.net4j) in your branding feature (eg., org.eclipse.net4j-feature/feature.xml), even if it contains NO source and that you've set that plugin to be unpack="false":
<plugin id="org.eclipse.net4j" download-size="0" install-size="0" version="0.0.0" unpack="false"/>
|[185001] Plugin jars contain nested jars instead of class files.
|External jar files (like log4j) are not included in the plugin when building and zipping the plugins
Ensure that the Bundle-ClassPath in the MANIFEST.MF contains the dot (.) for example:
Bundle-ClassPath: .,commons-logging.jar,log4j-1.2.8.jar
|publish.xml fails to generate build artefacts!
This has been deprecated in the latest org.eclipse.releng.basebuilder. For the solution, see details in bug 165698.
|Need to update your build to EMF 2.3 and J2SDK 5.0.
That's a pretty big subject. See EMF 2.3 Adoption for details.
|java.lang.NoClassDefFoundError: org/eclipse/core/launcher/Main
You need to upgrade to the Equinox Launcher. See Automated PDE JUnit Testing With Eclipse for details on how to fix this problem.
To support both a HEAD and an Rx_y_maintenance branch, you need to branch your cvs repository. This is accomplished easily using Eclipse or commandline CVS.
In Eclipse, select your plugins, then right-click and do Team > Branch...
If you're following the usual convention, you'd do your Eclipse 3.3 compatible work in HEAD and your Eclipse 3.2 work in a maintenance branch. Taking the JET Editor project as an example, you'd do something like this:
- build a 0.7.0 R build. Use type "R" (Release), then set the build alias field on the build page to "0.7.0".
- create a branch called R0_7_maintenance, with root R0_7_0. (You'll create a redundant, but potentially handy tag for your 0.7.0 release.)
- begin doing "R0_7_maintenance | 0.7.1" builds from your build page at /emft/build/?project=jeteditor. Pick Eclipse 3.2 driver from the list (they'll have M or R).
- at the same time, start on your Eclipse 3.3 development, then kick builds using "HEAD | 0.8.0" from the picker on the build page. Select an Eclipse 3.3 driver (they have I or S or R). You can get these from here: http://download.eclipse.org/eclipse/downloads/
NOTE: be sure to copy just the http path to the tar.gz file, without ?file= querystring stuff in it. For example:
- http://download.eclipse.org/eclipse/downloads/drops/S-3.3M2-200609220010/eclipse-SDK-3.3M2-linux-gtk.tar.gz
- http://download.eclipse.org/downloads/drops/I20060926-0935/eclipse-SDK-I20060926-0935-linux-gtk.tar.gz
The recommended list of tags for use with org.eclipse.releng.basebuilder is located here and updated when new tags are added (usually once a miletone).
|I choosed to build my maintenance branch from the web ui, but the built plugins are coming from HEAD.
|Check that your map file of your maintenance branch releng plugin refers to the branched plugin and not to HEAD.
Release Process
All the EMFT subprojects are requested to follow this release schedule:
- Wednesday night:
- Your code in CVS must be "compile error free". Feel free to run N builds that afternoon to verify this.
- Thusrday morning:
- One Integration (I) build from your main branch (HEAD), and/or
- One Maintenance (M) build from your maintenance branch (eg., R1_0_maintenance).
Renaming a Build / Releasing Your GM Build
- When releasing your final build, you may decide to rename an RC build if nothing bad has happened since that build was released. For example, you might plan to release your final build on Sept. 28, so you'd do an RC1 build two weeks before. If any stop-ship bugs were found, you'd spin an RC2 build the week after, on the 21st. Then, if no more bugs were found, you'd be able to promote that build as your GM (Golden Master) on Sept. 28 - however, you'd have to rename the zips, md5 files, dependencies listed in build.cfg, etc.
- The good news is that there's an easy way to do this - renameBuild.sh. This script contains detailed instructions and examples of usage; just run it from the commandline w/o options to see. Additionally, here's an example showing a rename of JET from 0.7.1RC2 to 0.7.1:
sudo -u www-data ./renameBuild.sh -proj jet -verbose -branch 0.7.1 \ -buildID S200609210820=R200609210820 -buildAlias 0.7.1RC2=0.7.1 \ eclipse-SDK-M20060919-1045-linux-gtk.tar.gz=eclipse-SDK-3.2.1-linux-gtk.tar.gz \ M20060919-1045=R-3.2.1-200609210945 \ S200609210005=R200609210005 \ 2.2.1RC2=2.2.1 \ fullmoon.torolab.ibm.com=download.eclipse.org \ emf.torolab.ibm.com=download.eclipse.org
- When you're done renaming, you can simply promote the new build as you did the previous week (-buildID S200609210820), using the new ID (-buildID R200609210820), and you'll have your GM build published.
- After releasing the final build of a given version, you need to remember to upgrade the version of the plugins you change. In other words, if a plugin is not changed then its version remains the same. After upgrading the version of a plugin, you need to ensure that the version of the appropriate features and branding plugins are also upgraded, and that the feature is referring to the new versions of the plugins. Also, if you change a plugin with source code, you may need to upgrade the appropriate documentation plugin (and documentation feature and branding plugin) if the build is adding Javadoc to it.
Promoting A Build
Adding new builds or even new subprojects is relatively simple. The hands-on manual approach is to use scp to copy you new build's folder from where it was built, eg., /home/www-data/build/emft/transaction/downloads/drops/1.0.0/I200601111814 to its destination on download1.eclipse.org, eg., /home/data/httpd/download.eclipse.org/technology/emft/transaction/downloads/drops/1.0.0/I200601111814. From there, /home/data/httpd/download.eclipse.org/technology/emft/downloads/index.php will find & display it automatically.
You can modify the way the downloads page appears in two simple ways by editing build.options.txt, which is used to both create builds and display them for downloading:
- you can add/remove branches from display, by adding entries under the [Branch] entry. Display entries are in the form -=1.0.0, whereas build instruction entries are in the form 1.0.1=R1_0_maintenance.
- you can reorder the way build types are displayed by resequencing the values under the [BuildType] entry. The remaining entries are used when building.
The above process ONLY adds the build to the downloads page; it does not fix permissions or group ownership of files, nor update any map files, news files, release notes, or other meta information. As such, the full process for promoting a build is rather lengthy, and thus has been simplified into a script, promoteToEclipse.sh and its accompanying property file, promoteToEclipse.properties.
- UPDATE: You can also use the promo.php script for your project. Contact User:nickb for username/password access.
The simplest way to learn how to use this script is to first run it without options to see the inline help, or to read the help within the script itself. From there, running it is straightforward, but certain SSH permisions must be set in order for things to work as expected.
To make CVS happy when promoting a build, ensure the existence of a .cvspass file in your home directory:
touch ~/.cvspass
As an example, here's how an EMFT Transaction build is promoted:
cd /home/www-data/build/emft/scripts; ./promoteToEclipse.sh -sub transaction -branch 1.0.0 -buildID I200601111814 -Q \ -announce 2>&1 | tee ~/promo_`date +%Y%m%d_%H%M%S`.txt
The -Q argument suppresses noisy CVS checkout messages and -announce posts an announcement of the build availability to the EMFT newsgroup.
Update Manager Sites & Build Types
If you go to http://www.eclipse.org/emft/updates/, you'll see a note about two different UM sites. These two sites are there to split final, release builds from interim builds, so that the two types of users can benefit from the two types of releases.
A release build (R) is anything that's done as a final GM (aka Golden Master) release, eg., 0.7.0, 0.7.1, 1.0.0, 1.0.1. Everything else is considered "interim" - Nightly, Integration, Maintenance, Stable (N, I, M, S).
So, for example, when you publish an I build (eg., 0.7.5 I200610050000), it gets added to site-interim.xml. When you do your final build for that stream, (eg., 0.7.5 R200612020000), it will be added to site.xml.
Note also that the URL to give to Update Manager (or to put in your features) is NOT http://www.eclipse.org/emft/updates/, but download.eclipse.org. www.eclipse.org stores website content only, and provides a location for extracting, updating, and committing changes to the site.xml and site-interim.xml files, in order to provide CVS versioning & history. The actual site is http://download.eclipse.org/technology/emft/updates/site*.xml, which is also benefitted by the fact that it's mirrored (unlike www.eclipse.org).
- For more on build types, see http://www.eclipse.org/emf/downloads/build-types.php.
Generating Update Manager Site Jars
- For details on generating Update Manager site XML and jars, see: Update Manager Site Generation.
Generating Release Notes
Generating release notes is easy - promoteToEclipse.sh does it for you! However, there are a few simple steps to follow to ensure the generated content is accurate & non-duplicative. Here's the general process for closing a bug and using Bugzilla & CVS to provide the information required to generate release notes.
- Working in Eclipse, fix your code. Test is as much as possible before committing it to CVS.
- Commit your change(s) to CVS, using the bug's number in square brackets to begin your commit comment, eg:
[127509] javadocs now available
- Note that you can include multiple bugs (each number on its own line) and comments are not required. The information that will appear in the release notes comes from the bug's Summary field, not your CVS comments.
- Browse to the bug's webpage, and assign it the status Assigned. Your bugzilla comment could be something like:
Committed to CVS
- Tip: to save time, you can create & save a named Bugzilla query for All Assigned, in order to quickly Change Several Bugs At Once.
- Produce a build, and promote it. Unless you use the -norss flag:
- Your RSS feed will be updated,
- The Modeling database will see that new entry,
- A corresponding entry will be added to the Releases table, and
- A refresh of the release notes will now show that new entry.
My new build isn't listed on the website!
Mirror replication takes time. Please try again in 30 mins, or re-read your promote log to verify everything went OK.
My new build isn't listed in the Release Notes!
First, check your RSS feed file to ensure it's been updated. If it hasn't, check your promote log for failures in updating the feed. If it has, please be patient and wait for the next database update. Your RSS feed file controls the list of releases that are imported into the Releases table of the Search CVS database, and thus appear on the Release Notes page.
There are errors in my release notes! How do I edit?
If you want to remove or edit values in your RSS feed and flush old/incorrect values from the database, please edit the file /cvsroot/org.eclipse/www/modeling/projectName/feeds/builds-componentName.xml (eg., projectName = emft; componentName = teneo). When done, send an email to User:nickb requesting a database flush for your component's releases.
Bugs are missing from the Release Notes!
Database updates can take a while. If it's been 24hrs and you *still* are missing data, contact User:nickb.
RSS Update Errors When Promoting
addEntry: [AddEntry] [Fatal Error] builds-teneo.xml:13:2: The content of elements must consist of well-formed character data or markup. [AddEntry] org.xml.sax.SAXParseException: The content of elements must consist of well-formed character data or markup.
| Check the file on the build server in /var/www/html/emft/feeds/. Is it corrupt? Is it full of invalid XML due to a CVS update/merge? If so, so the following:
cd /var/www/html/emft/feeds/; \ rm -f builds-projectName.xml; \ cvs up -Pd; \ chmod 664 builds-projectName.xml; \ chgrp www builds-projectName.xml;
Then rerun your promote using the -rssonly flag to redo that single step. After that, you can force an update of the database - including loading any new CVS commits - with the -searchcvsonly flag. If you don't need to refresh commits, just the Releases table, you can run this (on emft.eclipse.org only):
cd /shared/modeling/searchcvs; \ php relupdate.php -noheat
Permission denied
| Check the file on the build server in /var/www/html/emft/feeds/. Is it writable by you or one of the groups of which you're a member? Try this:
cd /var/www/html/emft/feeds/; \ ls -la; groups; \ chmod 664 *; chgrp www *;
Then rerun your promote using the -rssonly flag to redo that single step. After that, you can force an update of the database - including loading any new CVS commits - with the -searchcvsonly flag. If you don't need to refresh commits, just the Releases table, you can run this (on emft.eclipse.org only):
cd /shared/modeling/searchcvs; \ php relupdate.php -noheat
Automatically Fixing Assigned Bugs
As of 2007-08-29, you can use promo.php or the -bugzonly flag to automatically move your ASSIGNED bugs to FIXED, and place a comment stating in which build the bug was fixed.
Setup / Troubleshooting
The first time you use this option, or if your bugzilla cookie expires, you will receive an error like this:
[promote] ERROR: login cannot be read from ~/.ssh/UpdateBugStateTask.properties.
To regenerate credentials / cookie information, log in to the build server and run:
cd /home/www-data/build/modeling/scripts; ./bugzillaLogin.sh 2> ~/.ssh/UpdateBugStateTask.properties
Newsgroup Announcement Setup
Setup for posting automatically to the newsgroup to announce new builds is easy.
- 1. Copy newsgroup-post.txt into your ~/.ssh folder.
build_id@build_server:~ $ mkdir -p ~/.ssh; cp /home/nickb/newsgroup-post/newsgroup-post.txt ~/.ssh
You are now set up to post automatically to the newsgroup while promoting a build. If you want to post as a specific person, rather than the default name & email, there are two additional steps.
- 2. Edit org.eclipse.emft/releng/[subproject]/promoteToEclipse.[subproject].properties <example>, placing the correct name and email address for the person whose name will appear on newsgroup posts. This step - and the next one - is ONLY required if the name & email are not the same as the default value recorded here.
newsgroupPublisherEmail="John Q. Committer <firstname.lastname@example.com>"
- 3. Copy org.eclipse.emft/releng/[subproject]/promoteToEclipse.[subproject].properties <example> into /home/www-data/build/emft/scripts.
To announce a build that's already been built, you can use the -announceonly flag to skip all other steps and ONLY post to the newsgroup. Otherwise, adding -announce when promoting will add the extra step of posting a quick note to the newsgroup.
Newsgroup Post Threading
Should you want to thread your announcements so that they can be hidden or categorized, here's how you can do so:
- create the parent thread into which subsequent posts will go (just post a message to the newsgroup), then
- get the post's Message-ID (using Thunderbird, just turn on all headers to see this), and
- update the appropriate entry in your /home/www-data/build/emft/scripts/promoteToEclipse.*.properties file on your build server (emf.torolab or emft.eclipse).
Looking at promoteToEclipse.jet.properties as an example:
# publisher of newsgroup announcements newsgroupPublisherEmail="John Q. Committer <email@example.com>" newsgroup=eclipse.technology.emft # to thread posts under an existing post (or posts) enter the slash-escaped Message-ID for which this is a reply, # eg: <e0i2gc\$an5\$email@example.com> newsgroupThreadReferences=""
If you put the Message-ID in the newsgroupThreadReferences property, announcements about builds will be nested under that existing message.
Note that to edit this file you must sudo to the web user:
- On emf.toro: sudo -u www-data vi promoteToEclipse.jet.properties
- On emft.eclipse: sudo -u apache vi promoteToEclipse.cdo.properties
If you'd like to store a copy of your changes in CVS, please contact your releng manager so that your changes can be committed into your releng module for safekeeping/versioning.
SSH Key Setup
You must have ssh access to your build server, download1.eclipse.org, and dev.eclipse.org. If you do not have access, please the administrators of these servers to gain access. Once you have ssh access, you need to set up limited ssh key access between your build server and the eclipse.org download and cvs servers. This will allow you to run the promote script without being prompted for a password periodically.
To grant yourself ssh access from your build server to eclipse.org, ssh to the build server normally.
Under windows, you can use cygwin or PuTTY. Under Linux, open a shell and type `ssh`.
If you don't already have an ssh key pair created, you will need to generate one.
build_id@build_server:~ $ mkdir -p ~/.ssh; chmod 700 ~/.ssh; cd ~/.ssh; ssh-keygen -b 2048 -t rsa
When prompted for a passphrase, hit enter to skip. Having a passphrase, while more secure than having no passphrase, prevents automated login.
Save your public key in ~/.ssh/id_rsa.pub (or some other file).
Connect to the following systems, replacing build_id and eclipse_id with your actual system login for that machine (which MUST be the same). Replace build_server and FQDN with the actual values for your build server's hostname and fully-qualified domain name.
- build_id@build_server
- build_id@FQDN
- build_id@localhost
- email@example.com
- firstname.lastname@example.com
Get yourself added to the "www" group (or whatever is the user group that can update the website) on your build machine. This normally must be done by an administrator (root) of that machine.
All of those should work without being prompted for a password. If you are prompted, you need to set an ssh key in your ~/.ssh/authorized_keys file for each user & hostname pair to which you want to connect. The first time you try each of these connections, you should be be prompted to add the host's fingerprint to your ~/.ssh/known_hosts file. This is also required.
To copy your local public key to the remote machine, you will need to scp (secure copy) the file. From the build server, copy the file to the remote server, then ssh to that server and combine the new key with the any existing keys in the authorized_keys file:
- build_id@build_server:~/.ssh $ scp id_rsa.pub email@example.com:~/.ssh/eclipse_id.temp
- build_id@build_server:~/.ssh $ ssh firstname.lastname@example.com
- (you will still be prompted for a password when connecting)
- email@example.com:~ $ cd ~/.ssh;
- email@example.com:~/.ssh $ touch ~/.ssh/authorized_keys;
- email@example.com:~/.ssh $ cp ~/.ssh/authorized_keys ~/.ssh/authorized_keys_old; # backup
- firstname.lastname@example.com:~/.ssh $ cat ~/.ssh/eclipse_id.temp ~/.ssh/authorized_keys_old > ~/.ssh/authorized_keys; # prepend new key into old file; save as new file
- email@example.com:~/.ssh $ rm -fr ~/.ssh/eclipse_id.temp ~/.ssh/authorized_keys_old;
- firstname.lastname@example.com:~/.ssh $ chmod 644 authorized_keys id_rsa.pub known_hosts; chmod 600 id_rsa; # fix perms
- firstname.lastname@example.com:~/.ssh $ exit
- build_id@build_server:~/.ssh $ ssh firstname.lastname@example.com
- (this time you should get in using your key instead of needing a password)
Once you have ~/.ssh/authorized_keys and ~/.ssh/known_hosts updated with your public key and server fingerprint(s) (respectively), you should be able to connect to these systems without being prompted, and the promote script should be good to go unassisted.
If you require further assistance setting up key access, try here: http://cfm.gs.washington.edu/security/ssh/client-pkauth/.
Promotion Problems (CVS Errors, SCP Errors, Artifacts Not Created...)
Please check your promote logs for errors or transient glitches, like CVS disconnects or SCP problems. Sometimes one problem can manifest as several problems, as in the case of this EMFT Validation build's UM jar creation, which threw four warnings that something had gone wrong, all starting from a transient CVS checkout problem (bandwidth overload or connection reset).
[promote] [9] [13:53:18] Create & promote Update Manager jars: [promote] Running buildUpdate.sh:
[umj-co] [1] Checking out org.eclipse.releng.basebuilder from dev using HEAD cvs checkout: failed to open /home/vramaswamy/.cvspass for reading: No such file or directory cvs [checkout aborted]: recv() from server dev.eclipse.org: Connection reset by peer
The java class is not found: org/eclipse/core/launcher/Main features/*.jar: No such file or directory plugins/*.jar: No such file or directory
[umj] [7d] [13:54:47] Comparing local and remote folders MD5 sums to ensure SCP completeness...
[compare] Compare md5sums... [compare] MD5s do not match! Compare failed.
[umj] [13:54:52] ERROR! Script exiting from compareFolders.sh [promote] [9] [13:54:52] Create & promote Update Manager jars done.
In this case, the problems were:
- CVS disconnected while checking out required builder code
- Build failed looking for Eclipse Main, so no build occurred
- Copying files from temp to /var/www/technology/emft/updates/ failed as they were not created
- MD5 check failed as nothing was copied to download1.eclipse.org
In this case, the solution was to:
- Verify that nothing had been produced on either the build server or download1.eclipse.org.
- Confirm that site*.xml had not been changed in CVS, and rollback any changes for this build's ID (if any).
- Re-run the promote using the -jarsonly flag in order to bypass all the steps that completed successfully and ONLY do the UM jar creation step.
Maintenance Processes
By following a few simple rules, you can ensure that you never run out of memory or hard disc space when building, and that your neighbours on the server are similarly unaffected.
- Release builds should be kept at all times.
- Stable builds should be kept until they are considered stale, eg., M1 need not be kept once M4 or M5 is available. This is subject to your discretion or customer needs.
- Interim builds should be purged after every Milestone build so that you never have more than a few weeks of Interim builds listed.
- Nightly builds should be scrubbed every week or so in order to save space and keep your build server's downloads page clean.
Removing CVS Tags
To remove CVS tags, you can run the following commands (from any machine that can connect to dev.eclipse.org via ssh):
cvs -d [eclipse_id]@dev.eclipse.org:/cvsroot/technology -q rtag -d [build_tag] org.eclipse.emft/[subproject]; cvs -d [eclipse_id]@dev.eclipse.org:/cvsroot/technology -q rtag -d [build_tag] org.eclipse.emft/releng/[subproject];
- eclipse_id is your cvs username for dev.eclipse.org
- build_timestamp is "build_" plus the timestamp of the build for which you want to remove its tag from CVS. For example, for a milestone build 1.0.0M6a (S200604131352) (RC1, use build_200604131352.
Note that in order to remove tags from within org.eclipse.emft/releng you must be a member of the emft-releng group on dev.eclipse.org, or have similar write access via ACL.
Removing Old Builds
The simplest way to remove old builds is simply to delete them, both from the build server and from the public download1.eclipse.org server. Doing so will also (eventually) cause them to be removed from the eclipse.org mirrors.
Manual Delete From Build Server
To delete an old build, ssh to your build server, then run, for example:
cd /home/www-data/build/emft/[subproject]/downloads/drops/1.0.0; sudo -u [web_user] rm -fr N200604152353;
- web_user is the id on your build server which runs the Apache webserver processes, eg., www-data or apache
Automated Delete From Build Server
There is also a nightly crontab script that runs to purge old builds:
1 1 * * * sudo -u apache /home/www-data/build/emft/scripts/cleanupOldBuilds.sh > \ $HOME/cron_logs/cleanupOldBuilds.sh.emft.log.txt
The rules, as defined in the script, are:
- purge builds in OLD/ folder older than 30 days
- move [N] builds older than 10 days into OLD/
- move [IMS] builds older than 60 days into OLD/ (keep R builds!)
- purge old dependency downloads older than 20 days
Manual Delete From Production Server (download.eclipse.org)
When deleting from dev.eclipse.org (or download1.eclipse.org), you do not need to sudo to the web user:
cd /home/data/httpd/download.eclipse.org/technology/emft/[subproject]/downloads/drops/1.0.0; rm -fr N200604152353;
Archiving Builds on Production Server (download.eclipse.org)
Nightly builds can just be destroyed, but consumers of your component may have longer-term dependencies on Integration builds. After a couple of releases, maybe even milestone builds want to be cleared away. This can all be accomplished safely by archiving a build. A build that is in the archive doesn't take up space on the main Eclipse download server or its mirrors, but is still accessible in the event that it is needed via the download.php?file=/path/to/zipfile.zip URL.
Simply move your build from from the main download area to the archive area:
cd /home/data/httpd/download.eclipse.org/technology/emft/[subproject]/downloads/drops/[release]/[buildID] mkdir -p /home/data/httpd/archive.eclipse.org/technology/emft/[subproject]/downloads/drops/[release] mv [buildID] /home/data/httpd/archive.eclipse.org/technology/emft/[subproject]/downloads/drops/[release]/
and you're done!
Removing Update Manager Jars
Update Manager jars should be purged from build and production servers with the same frequencies as above.
Remove Jar Files
To get a list of jars (ordered by modification time) that are older than a certain age (eg., 14 days), run:
cd /home/data/httpd/download.eclipse.org/technology/emft/updates; find . -maxdepth 2 -type f -name "*eodm*" -mtime +14 \ -exec date -r {} +%s\ {} \; | sort -r | sed -e "s/[0-9]\+\ \.\///g";
Then, if you are satisfied with that list, delete them like this:
for f in \ `find . -maxdepth 2 -type f -name "*eodm*" -mtime +14 \ -exec date -r {} +%s\ {} \; | sort -r | sed -e "s/[0-9]\+\ \.\///g"`; do \ echo "Delete: "$f; rm -fr $f; \ done
Remove Entries From site*.xml
In addition to deleting jars, you must also remove the entries from site-interim.xml. This file must be edited in CVS then checked out to the local filesystem to cause the removed builds to disappear.
If you do not update the file in CVS, but only edit it locally, the next UM jar build will recreate the removed entries since it extracts the latest version of that file from CVS before adding to it. To update the file in CVS and push it to eclipse.org, ssh to your build server or to any machine that can ssh to dev.eclipse.org, then:
cd /tmp; cvs -d [eclipse_id]@dev.eclipse.org:/cvsroot/org.eclipse \ -q co -d updates www/emft/updates; cd /tmp/updates;
# edit file: use dd to delete lines, :wq to save & quit vi site-interim.xml; cvs -q ci -m "remove old builds";
scp site-interim.xml \ [eclipse_id]@dev.eclipse.org:/home/data/httpd/download.eclipse.org/technology/emft/updates cd /tmp; rm -fr /tmp/updates;
Of course, you can also edit the file in Eclipse or another editor, commit those changes, then check out the latest files and scp them to download.eclipse.org as shown above.
Build.php Dependency URL Cleanup
To remove old dependency URLs shown on your build.php page, edit the following file on your build server:
sudo -u [web_user] vi /home/www-data/build/emft/requests/dependencies.urls.txt
Note that the most recent entries are listed at the bottom of the file, so delete from the top down (starting on line 3). If you delete too many, you can always re-add them using the web UI of build.php.
Removing or Replacing a Bad Build
Yes, it happens. You need to trash a milestone build and replace it with an M5a version. We've been there. Here's the steps you need to follow to make a bad build vanish forever using a hypothetical example.
- SSH to download1.eclipse.org and delete the bad build's folder.
cd /home/data/httpd/download.eclipse.org/modeling/mdt/uml2/downloads/drops/2.1.0 rm -fr I200704091234
- Delete the build from the build server too.
- Check out your project's RSS feed from CVS, remove the bad entry, and commit your changes. When you promote the replacement build, this file will be promoted to the correct place on download1.eclipse.org. The RSS feed controls what releases are loaded in the Search CVS / Release Notes database, so you must remove the bad entry.
cd /tmp; cvs -d email@example.com:/cvsroot/org.eclipse -q co -d feeds \ www/modeling/mdt/feeds cd feeds; vi builds-uml2.xml cvs ci -m "remove bad build" builds-uml2.xml
- If you're not replacing your bad build w/ a fixed one, you'll have to manually upload the RSS feed file; otherwise, your next build will perform this step for you:
scp builds-uml2.xml \ firstname.lastname@example.com:/home/data/httpd/download.eclipse.org/modeling/mdt/feeds/
- Delete the entry from the releases table of the Search CVS database so it will vanish from the Release Notes. Use this webpage. If you don't see your build listed, then it hasn't been loaded yet, and you can safely skip this step.
- Rebuild. Promote your new build, sit back, and call it a day.
(Thanks to http://diberri.dyndns.org/html2wiki.html for assisting in migrating this document.)


text:
Photo/The Wichita Eagle, Mike Hutmacher, File
What a concept, food education occurring in schools. It sounds like it's one small step for man and if things go well, maybe one big step for mankind, or at least for mankind's children. Now if we can educate them about GMO foods we just might have something.
By The Associated Press
WASHINGTON – Kids, your days of blowing off those healthier school lunches and filling up on cookies from the vending machine are numbered. The government is onto you.
For the first time, the Agriculture Department is telling schools what sorts of snacks they can sell. The new restrictions announced Thursday fill a gap in nutrition rules that allowed many students to load up on fat, sugar and salt despite the existing guidelines for healthy meals.
"Parents will no longer have to worry that their kids are using their lunch money to buy junk food and junk drinks at school," said Margo Wootan, a nutrition lobbyist for the Center for Science in the Public Interest who pushed for the new rules.
That doesn't mean schools will be limited to doling out broccoli and brussels sprouts.
Snacks that still make the grade include granola bars, low-fat tortilla chips, fruit cups and 100 per cent fruit juice. And high school students can buy diet versions of soda, sports drinks and iced tea.
But say goodbye to some beloved school standbys, such as doughy pretzels, chocolate chip cookies and those little ice cream cups with their own spoons. Some may survive in low-fat or whole wheat versions. The idea is to weed out junk food and replace it with something with nutritional merit.
The bottom line, says Wootan: "There has to be some food in the food."
Still, 17-year-old Vanessa Herrera is partial to the Cheez-It crackers and sugar-laden Vitaminwater in her high school's vending machine. Granola bars and bags of peanuts? Not so much.
"I don't think anyone would eat it," said Herrera of Rockaway, N.J.
There are no vending machines at Lauren Jones' middle school in Hoover, Ala., but she said there's an "a la carte" stand that sells chips, ice cream and other snacks.
"Having something sweet to go with your meal is good sometimes," the 13-year-old said, although she also thinks that encouraging kids to eat healthier is worthwhile.
The federal snack rules don't take effect until the 2014-15 school year, but there's nothing to stop schools from making changes earlier.
Some students won't notice much difference. Many schools already are working to improve their offerings. Thirty-nine states have some sort of snack food policy in place.
Rachel Snyder, 17, said earlier this year her school in Washington, Ill., stripped its vending machines of sweets. She misses the pretzel-filled M&M's.
"If I want a sugary snack every now and then," Snyder said, "I should be able to buy it."
The federal rules put calorie, fat, sugar and sodium limits on almost everything sold during the day at 100,000 schools – expanding on the previous rules for meals. The Agriculture Department sets nutritional standards for schools that receive federal funds to help pay for lunches, and that covers nearly every public school and about half of private ones.
One oasis of sweetness and fat will remain: Anything students bring from home, from bagged lunches to birthday cupcakes, is exempt from the rules.
The Agriculture Department was required to draw up the rules under a law passed by Congress in 2010, championed by first lady Michelle Obama, as part of the government's effort to combat childhood obesity.
Nutritional guidelines for subsidized lunches were revised last year and put in place last fall.
Last year's rules making main lunch fare more nutritious faced criticism from some conservatives, including some Republicans in Congress, who said the government shouldn't be telling kids what to eat. Mindful of that backlash, the Agriculture Department left one of the more controversial parts of the rule, the regulation of in-school fundraisers like bake sales, up to the states.
The rules have the potential to transform what many children eat at school.
Prevention Of Poor Lifestyle Habits Best Tackled Before 13 Years
In addition to meals already subject to nutrition standards, most lunchrooms also have "a la carte" lines that sell other foods – often greasy foods like mozzarella sticks and nachos. That gives students a way to circumvent the healthy lunches. Under the rules, those lines could offer healthier pizzas, low-fat hamburgers, fruit cups or yogurt and similar fare.
One of the biggest changes will be a near-ban on high-calorie sports drinks. Many beverage companies added sports drinks to school vending machines after sodas were pulled in response to criticism from the public health community.
The rule would only allow sales in high schools of sodas and sports drinks that contain 60 calories or less in a 12-ounce serving, banning the highest-calorie versions of those beverages.
Low-calorie sports drinks – Gatorade's G2, for example – and diet drinks will be allowed in high school.
Elementary and middle schools will be allowed to sell only water, carbonated water, 100 per cent fruit or vegetable juice, and low fat and fat-free milk, including nonfat flavoured milks.
Republicans have continued to scrutinize the efforts to make school foods healthier, and at a House subcommittee hearing Thursday, Rep. Todd Rokita, R-Ind., said the "stringent rules are creating serious headaches for schools and students." (Not to mention county health agencies, the medical community, airline seat manufacturers, paramedics and the list goes on. Guess we better not mess with regulations when it comes to optimal health. We wouldn't want to mess with somebody's subsidy).
One school nutritionist testified that her school has had difficulty adjusting to the 2012 changes, and the new "a la carte" standards could also be a hardship.
The healthier foods are expensive, said Sandra Ford, president of the School Nutrition Association and director of food and nutrition services for a school district in Bradenton, Fla. She also predicted that her school district could lose $975,000 a year under the new "a la carte" guidelines because they would have to eliminate many of the popular foods they sell. What, we're worried that junk food manufacturer dollars going to the schools might dry up? Isn't that the point here? (I wonder how many by pass surgeries avoided that might work out to be.)
Riverside, CA Unified School District had implemented a la carte school salad bars years ago. They discovered that the kids loved the a la carte option. They learned what foods to eat and how much. Once the district agreed to pay the farmers in 30 days, organic agriculture production went from two acres to over 40 in a matter of two or three years. Now when the middle school kids get to high school and there isn't a salad bar, they're educated and a little pissed off at the same time. Now that's education.
In a report released at the hearing, the Government Accountability Office said that in some districts students were having trouble adjusting to the new foods, leading to increased waste and kids dropping out of the school lunch program.
The food industry has been onboard with many of the changes, and several companies worked with Congress on the child nutrition law three years ago.
Angela Chieco, a mother from Clifton Park, N.Y., sees the guidelines as a good start but says it will take a bigger campaign to wean kids off junk food.
"I try to do less sugar myself," Chieco said. "It's hard to do."
Associated Press writer Stacy A. Anderson contributed to this report.
Follow Mary Clare Jalonick on Twitter at http://twitter.com/mcjalonick
Follow Connie Cass on Twitter at http://twitter.com/ConnieCass

subset: commoncrawl


text:
Callgirl Fruitville, Florida
A couple amateur in candaulism on Fruitville would love to fuck a bisexual couple
Callgirl Fruitville, Florida
First name: Kerline, Age: 30 yo, City: Fruitville (FL)
Hi libertines, I'm Kerline, I'm 30 years old and my boyfriend is 28. We are a very open couple living in Fruitville. I'm attracted to guys who are both very tall and very short, but this remains a desire. I want a good fucker like my bichon. I want to enjoy myself. We would like to invite you over to our apartment for a visit, preferably in the evening if that is convenient for you. We love everything about ass and of course with respect and hygiene. However, we mainly prefer swinging with a trained couple. In short, we're waiting for your messages for this hot evening. We hope to see you on Fruitville! Kisses! See you soon.
Mature libertine in couple on Fruitville wants a fuck three
Callgirl Fruitville, Florida
First name: Lilyah, Age: 47 yo, City: Fruitville (FL)
Hi there, we're a naughty couple and live in Fruitville. My name is Lilyah and I am 47 years old. My husband is 46 years old. We are free on Sunday for this naughty date in Fruitville. You can come see us. We practice sadomasochism. The best for me is when I am tied up so that my man can watch you make love to me and I moan in ecstasy. We want a guy who is about the same age for this swingers plan. As a very naughty girl, I need a real man to take pleasure together. If you would like to leave a message, we will be delighted to read it. I hope to give you a date for a nice libertine encounter. Kisses. Bye.
An hour-long meeting with a very hot blonde on Fruitville
Callgirl Fruitville, Florida
First name: Laynie, Age: 31 yo, City: Fruitville (FL)
Ideally, I would like the boys who contact me to be brown and rather tall. Then the boy I'm looking for must be persistent because sexually I demand a lot. I can stay in bed all day, if my partner knows how to do it. I would like to meet you at your place as I need to be very discreet. However, I am free in the morning for this hot appointment. I am looking for an adulterous encounter with a libertine who practices libertine games. I actually need someone who is very available and imaginative to have fun. I hope for a hassle-free date on Fruitville. I'm sure I'll have a blast with you. I'm already extremely hot at the idea of meeting you. Kisses.
Cuckold couple looking for a woman in Fruitville who is open-minded and sexually liberated
Callgirl Fruitville, Florida
First name: Ylouna, Age: 41 yo, City: Fruitville (FL)
We've been into swingers dating for quite a while now. My boyfriend and I are trying out some new hot practices sometimes, these days it's exhibitionism. We would like to give you a rendezvous in the woods so that we can meet. We're finally available on Friday. We just want to have fun with you. We're on this porn site because we love playing with other swingers during naughty sessions. Now that you understand what I'm looking for, you can contact me. I'm sure I'll have a great time with you. I'll talk to you soon. Kisses.
Looking for a sexy time Fruitville? My wife and I are down for some hard play at a libertine bar
Callgirl Fruitville, Florida
First name: Ginesa, Age: 18 yo, City: Fruitville (FL)
We would like to schedule a meeting with you at our office, preferably during the week if that is convenient for you. We just want to enjoy ourselves together. We write on this libertine dating site because we love meeting other men during hot sessions. We love spending evenings in naughty clubs on Fruitville to find open-minded people. I'm partly to blame because I'm very demanding with the gentlemen and I have no taboos. To meet us, you have to leave a little note. We only want to fuck between kinky people.
I'm a naughty girl on Fruitville looking to play in a 3-way outdoor
Callgirl Fruitville, Florida
First name: Blandine, Age: 26 yo, City: Fruitville (FL)
Hi there, I'm an elegant woman in a relationship, my name is Blandine and I'm 26 years old. I live in Fruitville and I'm really naughty. We really enjoy spending evenings in libertine clubs on Fruitville to meet open-minded people. It's mostly for me because I'm tireless with men and I have no taboos. I want a nice, naughty man who will make me feel good with my boyfriend because I'm a playful lady who loves having 2 cocks for herself. We prefer to meet you at our home but if you wish we can move around Fruitville and its surroundings. We are available mostly in the evening for this future threesome. Don't hesitate to leave a message, we'll be happy to discover it. I hope to see you for a lovely libertine encounter. We kiss you. Bye bye.
A woman practicing sadomasochism on Fruitville to have a good time with a submissive guy
Callgirl Fruitville, Florida
First name: Murriel, Age: 38 yo, City: Fruitville (FL)
Hello naughty ones, I am a 38 year old libertine mother who goes by the name of Murriel. I work in a clothing store. I'm also single because I want to sleep with hot rabbits. I love cunnilingus because it gets me really wet. I need a guy who's really good at eating pussy. I'm a big fan of taking your cock in my mouth and I'm really good at it. However, I want a good fuck because I love guys without taboos with a big penis. I'm a naughty girl who loves to moan. We can see each other on Fruitville and its surroundings. I can usually meet you for a meeting at the end of the week. Ideally, I would have liked the gentlemen who write to me to be blond and quite muscular. I'm looking for a man who can keep up with me in the bedroom because I demand a lot sexually. I can stay in bed all weekend if my partner knows what they're doing. So, please leave me a message if you're interested in a one-night stand with a beautiful cougar who's very into sex. I kiss you, see you later.
A charming lady in a relationship of 42 years on Fruitville wants a guy for hot games
Callgirl Fruitville, Florida
First name: Fatimah, Age: 42 yo, City: Fruitville (FL)
Hi boys, my name is Fatimah and I'm 42 years old. I'm a really playful cougar woman. I'm here because I'm free for a night of intense sex with a younger guy than me. I want a hot date with a libertine who plays Libertine games. I need someone who is available and cool to hang out with. I am a cougar and I only want to date younger men. I want to make it clear that I'm looking for a one-time encounter lasting a few hours. In order to find each other, we can go to my villa or into town. I am available at the end of the day, I'm not contrary. To conclude, I am looking forward to hearing your comments. Before I find you. I'm sure we'll have a great time during our naughty date. Great job! Big kisses.
I'm a 49-year-old single woman looking for some naughty fun without any strings attached on Fruitville
Callgirl Fruitville, Florida
First name: Kecy, Age: 49 yo, City: Fruitville (FL)
Hello, I am a pretty girl who is married but cheating on my husband. I work as a hairdresser and it's not exciting. As I am quite hot, I decided to find a libertine. I'm looking for a guy who is younger than me. Other than that, I don't have any beauty standards. What I want is a man who's good in bed to fulfill me during our future night of debauchery. I want a hot date with a man who loves sex games. I need someone who is free and creative in order to enjoy myself. I am available at the beginning of the week and rather in the evening. You can have a date at the hotel. If you wish, you can make a comment. I hope to give you an appointment on Fruitville for this plan cul. Kisses. See you later.
My 44-year-old wife is a fan of candaulism and she's looking for some fun on Fruitville
Callgirl Fruitville, Florida
First name: Lauryana, Age: 44 yo, City: Fruitville (FL)
Welcome guys, I am a pretty F, my name is Lauryana and I am 44 years old. I moved to Fruitville and I'm pretty slutty. We're looking for a guy or couple who's good in bed, because we want to have as much fun as possible!!! The guy will really need to be athletic, sorry but that's my little whim these days. We love going to swingers clubs to have fun. We are a very open couple. I personally love threesomes because I'm without limits and my darling is okay with a trio. Since we work every day, we prefer to give you a date on the weekend and if possible at our place or in a hot club next to Fruitville. Now that you understand what I want, you can contact me. I'm sure I'll have a good time with you. I'll talk to you soon. Big kisses.
- Callgirl Myrtle Beach, South Carolina
- Callgirl Albion, New York
- Callgirl Corcoran, California
- Callgirl Berea, South Carolina
- Callgirl Haltom City, Texas
- Callgirl Kenedy, Texas
- Callgirl Macon, Georgia
- Callgirl Viera East, Florida
- Callgirl Magalia, California
- Callgirl Aurora, Colorado
- Callgirl Fremont, Ohio
- Callgirl Brownsville, Tennessee
- Callgirl Lake Jackson, Texas
- Callgirl Natchitoches, Louisiana
- Callgirl Tulsa, Oklahoma
- Callgirl Princeton, Indiana
- Callgirl Mint Hill, North Carolina
- Callgirl Cos Cob, Connecticut
- Callgirl Hiawatha, Iowa
- Callgirl Edna, Texas


text:
Happy new year, everyone.
Sunday, January 02, 2011
Caption this
62 comments:
sooooo sweet.ReplyDelete
You can where whatever you please when you shave your head with this knife!ReplyDelete
When you lose Pascal's Wager and god is Hello Kitty.ReplyDelete
If this ever shows up online - you die!ReplyDelete
You don't want to know what he's hidding behind his back...ReplyDelete
Your atheism has caused you to become confused. Without god, there is no objective design taste.ReplyDelete
DING! Baby's done.ReplyDelete
I appear to have dropped my oven mitt...ReplyDelete
"A man walks down the street in this apron, people know he's not afraid of anything."ReplyDelete
- paraphrased from Hoban Washburne on Firefly
"You know, the babies cry a lot less with this apron... Bring me the Christian children!"ReplyDelete
Wolf in sheep's clothing.ReplyDelete
"I just finished a peach, balsamic reduction...irreducibly complex my ass."ReplyDelete
"You're just lucky I'm wearing pants...."
Now that's the look of a god fearing and hating man. Hail Satan with a demented hello kitty looking twist! lolReplyDelete
Mother? Is that you? Come on in here, I have something to show you.ReplyDelete
"I cut down trees, I skip and jump,ReplyDelete
I like to press wildflowers.
I put on women's clothing,
and hang around in bars..."
"Each polar bar on my pants was killed by global warming (in my pants)..."ReplyDelete
(Deep raspy voice) Come get some!ReplyDelete
"Where's your god now?"ReplyDelete
I'm pretty OK!ReplyDelete
.....I think that sums up every reaction possible.
"Why the pink apron? Well, the one god gave me had too much blood & gore on it"ReplyDelete
"Tonight on Twilight Zone; To Serve Fundies"ReplyDelete
"I came here to cut down some bullshit and chew gum. And I'm all out of gum."ReplyDelete
- Anonymous1/03/2011 2:26 AM
" ...I saw some mormons comming down the street, and this year i wanted to be ready for them..."ReplyDelete
- Anonymous1/03/2011 3:40 AM
Im gunna call in next show and say " Ive had a personal revelation that proves existence of god. He appeared before me wearing polar bear pants, a pink apron, holding a knife; said he 'was going to cut me bad unless i believe'. "ReplyDelete
"See Dennis, this is proof of freewill."ReplyDelete
"Mention TAG again, I dare you."
I was given this apron by the invisible pink unicorn. She wouldn't be seen in it.ReplyDelete
Now, come here Yahweh, I have a present for you.
"Punch me in the face for Jesus"ReplyDelete
On this week's "Cookin' Good", the Reverend "Red" Rum.ReplyDelete
It takes the lotion from the basket...ReplyDelete
If you only knew the POWER of the Dark Side.ReplyDelete
"I'm an atheist 'cos I love to sin"ReplyDelete
Duckie never knew what the hell he was missin'!ReplyDelete
Behold! The Evil Atheist-- in pink.ReplyDelete
BWAHAHAHA! This is literally the funniest thing I have seen all year! Thanks Matt! :DReplyDelete
"I need 17 rolls of 3 mil plastic and 12 rolls of duct tape"ReplyDelete
Proof that all atheists are angry, violent, and have feminine tendencies. :)ReplyDelete
"Dillahunty International Studios"ReplyDelete
"I was wrong! Hell is real, and it's being photographed in embarassing cooking clothing forever!"ReplyDelete
There are at least 3 sins in this picture.ReplyDelete
There are only 2 options. Either I'm wearing a pink apron or I am NOT wearing a pink apron.ReplyDelete
What you BELIEVE about the pink apron is a separate issue.
Atheists across the world would like to point out that lack of belief in a god does not lead to actions or fashion sense.ReplyDelete
Believe in God or face the consequences.ReplyDelete
Tell me I'm pretty or face the consequences.
Atheists across the world would like to point out that lack of belief in a god does not lead to actions or fashion sense.ReplyDelete
What does NOT believing in unicorns MAKE you wear?
Hitchcock fans found the reveal in Psycho 2010 bewildering.ReplyDelete
Gulags, concentration camps and pink aprons.ReplyDelete
- Anonymous1/03/2011 4:51 PM
This comment has been removed by the author.ReplyDelete
- Anonymous1/03/2011 4:52 PM
This comment has been removed by the author.ReplyDelete
- Anonymous1/03/2011 4:54 PM
Uff! Wish I could edit posts!ReplyDelete
"Come over here little girl, I baked you some... Oh wait... I'm supposed to be holding the knife behind my back, not the cookies."
Atheists: Made of AwesomeReplyDelete
Be right back, I hear some Jehovah's Witnesses at the door.ReplyDelete
Thanks to ShockOfGod for donating his favourite outfit.ReplyDelete
Cake or death?ReplyDelete
Not a caption, but I think I own a pair of those exact same PJ bottoms; Joe Boxer with Polar Bears.ReplyDelete
But not the apron. Never the apron.
OK, here's a caption; "Won't you listen to reason?"ReplyDelete
"Matt lost his sanity upon discovering that the spoon had turned into, not a fork, but a knife!"ReplyDelete
"The church bake sale is coming up and I figured to fit in I'd need a hacksaw but this knife and sissy apron will do."ReplyDelete
"Where Are They Now: Strawberry Shortcake"ReplyDelete
'ISAAC!! Get down here now!! I'm on a mission from God!!!'ReplyDelete
"Who knew Buffalo Bill had a brother?"ReplyDelete
The argument from fashion.ReplyDelete
Matt's only weakness.
Well, you roast in the oven, let's use this knife to poke you and see if YOU'RE DONE!!ReplyDelete
PLEASE NOTE: The Atheist Experience has moved to a new location, and this blog is now closed to comments. To participate in future discussions, please visit http://www.freethoughtblogs.com/axp.
This blog encourages believers who disagree with us to comment. However, anonymous comments are disallowed to weed out cowardly flamers who hide behind anonymity. Commenters will only be banned when they've demonstrated they're nothing more than trolls whose behavior is intentionally offensive to the blog's readership.
Note: Only a member of this blog may post a comment.


text:
Story highlights
The new Kindle Touch 3G will have limited access to the Internet
The 3G version of the Kindle Touch with special offers costs $149
The Kindle Keyboard 3G will continue to have unfettered Internet access
Amazon has clarified that the next generation of its 3G Kindle, the Kindle Touch 3G, will not be able to browse the Internet without a WiFi connection. Users will still be able to use 3G to sync book and document purchases, but anything beyond Wikipedia will be off-limits.
Browsing was (and still is) an experimental feature on the last iteration of the Kindle, now known as the Kindle Keyboard 3G. The experiment appears to have failed as far as Amazon is concerned, as it will restrict the 3G access of the Kindle Touch 3G to browsing Wikipedia and downloading books and periodicals.
The Kindle Touch 3G's webpage does not directly note this restriction, stating only that it has "free 3G wireless" that "works globally," but a post in the official Amazon forums states that "experimental web browsing (outside of Wikipedia) on Kindle Touch 3G is only available over WiFi."
Since Amazon subsidizes all Kindle owners' 3G use, the company may have determined the model isn't cost-effective enough to support the use of the entire Internet.
The 3G version of the Kindle Touch with special offers costs $149, 50 percent more than the $99 WiFi version, so this restriction may make the jump from WiFi to 3G much harder for customers to justify when both models become available November 21.
The announcement doesn't affect the new Kindle Fire announced last week and due for launch November 15, since it is WiFi-only. The Kindle Keyboard 3G, while it is still available, will continue to have unfettered Internet access through the experimental browser.
We asked Amazon for confirmation of this policy, but have not received a response as of yet.


text:
From Americana design to French classical sculpture, Rare Coins or Chinese Antiquities, Art Glass & Pottery and Sterling Silver we represent at auction the finest items for collectors and investors alike. We bring curated catalogs of exquisite Antiques and Rare Decorative Arts from the finest Estates for sale to buyers in an advanced online and live auction system. With a global online presence, GoodLife Auctions sells worldwide on GoodLifeAuctions.com, Invaluable and Live Auctioneers.
GoodLife Auctions provides appraisals and sales of Estate Fine Jewelry, Valuable Art & Antiques and Rare Coin Collections for estate trustees, fiduciaries and private collectors. Whatever your antique, art, coin or jewelry appraisal needs may be, contact GoodLife Appraisals at +1 866 294 0150 to speak with an appraiser for an accurate and affordable valuation. We are located in Newport Beach, serving Los Angeles, Palm Springs and all of Southern California.
|Ships From:
|Newport Beach, CA
|Pre-Bidding Ends:
|# of bids:
|Current Bid:
|Shipping Costs:
|Get Estimate
|This auction is closed
Estimate: $100-$150
Description: A Persian blue and white Safavid bowl. This 18th century hand-painted Persian bowl has beautiful floral motif in a gorgeous deep blue with the aqua under-tint seen in Persian pottery. Bowl is marked on the bottom.
Dimensions: 8" D
Condition: Very Good. Repaired damage noted.
Item Location: Newport Beach, CA (92660)
Shipping Terms & Conditions: Buyer pays shipping expenses, International shipping
Payment methods:
Starting Bid: $30.00
Buyers Premium: 18%
Auction started: Jul 19, 2022 - 14:30
Auction ends: Aug 02, 2022 - 10:53
Available: 1
Auction ID: 1456
Sku: 5001
Item category: All > Fine Antiques > Asian Antiques


text:
Robina's Strand Woven Bamboo Flooring is strong and durable, making for some of the densest and hardest floors available. It is extremely stable with tensile strength comparable to steel and compressive strength higher than concrete. The lighter tones of Robina's Natural Bamboo Flooring are actually accomplished with a bleaching treatment. And Carbonized Bamboo Flooring undergoes a heating process to produce its rich caramel tones. Patinas are achieved with an additional blackening technique. Bamboo is an extremely fast-growing plant, growing up to four feet per day, reaching heights of 125 feet and 2 foot diameters. Bamboo completes its growth cycle after three to five years, making the stalk ready to harvest. The roots which remain regenerate the bamboo and eliminate replanting. Bamboo is actually a grass. Strand Woven Bamboo is literally shredded into strands and pressed together under intense compression. This technique results in a solid, heavy floor which provides all the durability of hardwoods with the sustainability of bamboo.
Carbonized Engineered5" x72" -4mm Veneer BSW7254401PM
Carbonized HDF3 3/4" x 36" -2mm veneer BSW3390201PM
Carbonized Patina Solid T&G5 3/5" x 72 1/2" BSW756201HP
Natural Engineered5" x72" -4mm Veneer BSW725440PM
Natural HDF3 3/4" x 36" -2mm veneer BSW339020PM
Natural Solid T&G3 3/4" x 72 1/2" BSW75640PP
Tiger Engineered5" x72" -4mm Veneer BSW72544VPM


text:
- Inside Athletics
- Tickets
- Fan Zone
- Media Zone
- Social
- Shop
- Donate Now
JOHNSON CITY, Tenn. (Jan. 7, 2014) – As the spring semester approaches, ETSU student-athletes will look to build upon an impressive number of academic achievements during the 2013 fall semester.
Of the 296 Buccaneer student-athletes, 197 (67 percent) were named to the Buccaneer Honor Roll for achieving a GPA of 3.0 or higher during the fall. In addition, the program also set new record highs with 96 student-athletes earning Dean's List recognition after posting GPAs of 3.7 or higher, while a program-best 36 students attained perfect 4.0 GPAs.
ETSU's overall cumulative student-athlete GPA of 3.21 during the fall was also higher than that of non-athletes at ETSU (3.0 GPA).
"We are really pleased with the continued improvement and ongoing excellence shown by our ETSU student-athletes in the classroom," said ETSU Director of Intercollegiate Athletics Dr. Richard Sander. "These numbers are an indication of not only the hard work of our student-athletes, but also the quality support provided to them by our coaches and staff – in particular our academic services area."
ETSU fans wanting to receive Buccaneer news, score updates, in-game promotions and much more sent to their mobile device can do so by signing up for "Buc Updates." Click here to sign up today!