<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.lingoport.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rwilliams</id>
	<title>Lingoport Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.lingoport.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Rwilliams"/>
	<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/Special:Contributions/Rwilliams"/>
	<updated>2026-04-30T19:04:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Transform_Framework&amp;diff=99871</id>
		<title>Transform Framework</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Transform_Framework&amp;diff=99871"/>
		<updated>2026-04-03T19:12:47Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Use the transform framework */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Localyzer supports a number of file types out of the box (See [[Supported Resource Bundles]]). However, other file types may represent user facing strings to be translated. In that case, some customization is required to on-board those projects. &lt;br /&gt;
The &#039;&#039;&#039;bash script transform framework&#039;&#039;&#039; facilitates the customization. &lt;br /&gt;
&lt;br /&gt;
= Analyze the file types = &lt;br /&gt;
If the file types fall into a category not supported by Localyzer out of the box, the first thing to do is to see what is the closest file types supported by Localyzer and TMSs/LSPs/MTs.&lt;br /&gt;
&lt;br /&gt;
= Use the transform framework =&lt;br /&gt;
The transform framework needs &#039;&#039;&#039;three scripts&#039;&#039;&#039;. The three scripts need to be in a repository, under a directory whose name will be used to identify the transform. &lt;br /&gt;
&lt;br /&gt;
The three scripts to write are:&lt;br /&gt;
* &#039;&#039;&#039;transform_from_repo.sh&#039;&#039;&#039;: How to transform the files from the repository so they fit into an LRM supported file type&lt;br /&gt;
* &#039;&#039;&#039;transform_to_repo.sh&#039;&#039;&#039;: How to transform translated/pseudo-localized files in an LRM supported file type into the repository file type&lt;br /&gt;
* &#039;&#039;&#039;transform_files_list.sh&#039;&#039;&#039;: How to transform the file names from the LRM supported file naming into the repository file naming&lt;br /&gt;
&lt;br /&gt;
Each of these script can in turn call other scripts as required.&lt;br /&gt;
Be sure that when calling other bash shell scripts to use &amp;quot;source&amp;quot; or &amp;quot;.&amp;quot; to do so.  Command Center will automatically set the above three mentioned scripts to executable when used but does not do so for other scripts that may be added as part of the transform.&lt;br /&gt;
&lt;br /&gt;
 if source &amp;quot;${TRANSFORM_DIR}/additional_code.sh&amp;quot; &amp;quot;${arg1}&amp;quot; ; then&lt;br /&gt;
     echo &amp;quot;Successfully executed ${TRANSFORM_DIR}/additional_code.sh&amp;quot;&lt;br /&gt;
 else&lt;br /&gt;
     echo &amp;quot;Failed to execute ${TRANSFORM_DIR}/additional_code.sh&amp;quot;&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
For example, under&lt;br /&gt;
* https://github.com/Lingoport/CommandCenterConfig, the main branch&lt;br /&gt;
a number of transform directories indicate what transform are available, in other words, what directories have those three scripts. &lt;br /&gt;
&lt;br /&gt;
For example, for the &amp;lt;code&amp;gt;txt2prop&amp;lt;/code&amp;gt; transform, the directory is located :&lt;br /&gt;
* https://github.com/Lingoport/CommandCenterConfig/tree/main/transforms/txt2prop&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Bash Variables ==&lt;br /&gt;
A few Bash variables are available when called from the Lingoport Jenkins jobs that use the transform framework. &lt;br /&gt;
They are set before calling the transform framework.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Transform from repository variables ===&lt;br /&gt;
 &#039;&#039;&#039;CLIENT_SOURCE_DIR&#039;&#039;&#039; : The top level directory of the workspace for this project&lt;br /&gt;
 &#039;&#039;&#039;TRANSFORM_DIR&#039;&#039;&#039; : The directory of the transform, the .sh are underneath this directory&lt;br /&gt;
 &#039;&#039;&#039;PROJECT_TMP_DIR&#039;&#039;&#039; : A tmp directory&lt;br /&gt;
&lt;br /&gt;
=== Transform to repository variables ===&lt;br /&gt;
&lt;br /&gt;
 &#039;&#039;&#039;CLIENT_SOURCE_DIR&#039;&#039;&#039; : The top level directory of the workspace for this project&lt;br /&gt;
 &#039;&#039;&#039;TRANSFORM_DIR&#039;&#039;&#039; : The transform scripts directory where the scripts are executed from.&lt;br /&gt;
 &#039;&#039;&#039;PROJECT_TMP_DIR&#039;&#039;&#039; : Where temporary files can be stashed for this project during the script execution&lt;br /&gt;
 &#039;&#039;&#039;$1&#039;&#039;&#039; : The first parameter is the list of all the files to be transformed from the translated files back to the repository&lt;br /&gt;
&lt;br /&gt;
== Example: txt2propfiles ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For a simple example, say the repository contains resource files like the following &amp;lt;code&amp;gt;strings.txt&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Strings for use in GUI&lt;br /&gt;
#################################################&lt;br /&gt;
PushIfCommits,Push if commits&lt;br /&gt;
CloseButtonText,Close&lt;br /&gt;
ApplyButtonText,Apply&lt;br /&gt;
CancelButtonText,Cancel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The file may not be in ASCII, UTF format, etc.; For instance this file is in UTF-8&lt;br /&gt;
&lt;br /&gt;
A supported file format that is close to this one is &amp;lt;code&amp;gt;properties&amp;lt;/code&amp;gt;. So the transform script will change the file name, extension, and content, so as to be a standard resource file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;strings.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Strings for use in GUI&lt;br /&gt;
#################################################&lt;br /&gt;
PushIfCommits=Push if commits&lt;br /&gt;
CloseButtonText=Close&lt;br /&gt;
ApplyButtonText=Apply&lt;br /&gt;
CancelButtonText=Cancel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transform_from_repo.sh ===&lt;br /&gt;
An &amp;lt;i&amp;gt;example&amp;lt;/i&amp;gt; snippet of bash code for this type of file may be something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
find . -name &amp;quot;string*\.txt&amp;quot; -type f &amp;gt; &amp;quot;${PROJECT_TMP_DIR}/input_files.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cat &amp;quot;${PROJECT_TMP_DIR}/input_files.txt&amp;quot; | while read -r FILEPATH&lt;br /&gt;
do&lt;br /&gt;
  FILENAME=`basename $FILEPATH`&lt;br /&gt;
  DIRNAME=`dirname $FILEPATH`&lt;br /&gt;
  SUFFIX=&amp;quot;.txt&amp;quot;&lt;br /&gt;
  ROOTNAME=${FILENAME%$SUFFIX}&lt;br /&gt;
  TARGET_NAME=&amp;quot;${ROOTNAME//-/_}.properties&amp;quot;&lt;br /&gt;
  TARGET_PATH=&amp;quot;${DIRNAME}/${TARGET_NAME}&amp;quot;&lt;br /&gt;
  echo &amp;quot;    Transform [$FILENAME] -&amp;gt; [$TARGET_NAME]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  rm $TARGET_PATH 2&amp;gt; /dev/null&lt;br /&gt;
  touch $TARGET_PATH&lt;br /&gt;
&lt;br /&gt;
  sed -i &#039;s/,,/, ,/&#039; $FILEPATH &lt;br /&gt;
  cat $FILEPATH | while read -r LINE&lt;br /&gt;
  do&lt;br /&gt;
      IFS=&#039;,&#039; tokens=( $LINE )&lt;br /&gt;
&lt;br /&gt;
      if [ -z &amp;quot;${tokens[1]}&amp;quot; ]&lt;br /&gt;
      then&lt;br /&gt;
        echo &amp;quot;${LINE}&amp;quot; &amp;gt;&amp;gt; $TARGET_PATH&lt;br /&gt;
      else&lt;br /&gt;
        KEY=${tokens[0]}&lt;br /&gt;
        VALUE=${LINE#&amp;quot;${KEY},&amp;quot;}&lt;br /&gt;
        echo &amp;quot;${KEY}=${VALUE}&amp;quot; &amp;gt;&amp;gt; $TARGET_PATH&lt;br /&gt;
      fi&lt;br /&gt;
  done&lt;br /&gt;
IFS=&#039; &#039;&lt;br /&gt;
&lt;br /&gt;
done &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transform_to_repo.sh ===&lt;br /&gt;
An &amp;lt;i&amp;gt;example&amp;lt;/i&amp;gt; snippet of bash code for this type of file may be something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
find . -name &amp;quot;string*\.txt&amp;quot; -type f &amp;gt; &amp;quot;${PROJECT_TMP_DIR}/input_files.txt&amp;quot;&lt;br /&gt;
&lt;br /&gt;
cat &amp;quot;${PROJECT_TMP_DIR}/input_files.txt&amp;quot; | while read -r FILEPATH&lt;br /&gt;
do&lt;br /&gt;
  FILENAME=`basename $FILEPATH`&lt;br /&gt;
  DIRNAME=`dirname $FILEPATH`&lt;br /&gt;
  SUFFIX=&amp;quot;.txt&amp;quot;&lt;br /&gt;
  ROOTNAME=${FILENAME%$SUFFIX}&lt;br /&gt;
  TARGET_NAME=&amp;quot;${ROOTNAME//-/_}.properties&amp;quot;&lt;br /&gt;
  TARGET_PATH=&amp;quot;${DIRNAME}/${TARGET_NAME}&amp;quot;&lt;br /&gt;
  echo &amp;quot;    Transform [$FILENAME] -&amp;gt; [$TARGET_NAME]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
  rm $TARGET_PATH 2&amp;gt; /dev/null&lt;br /&gt;
  touch $TARGET_PATH&lt;br /&gt;
&lt;br /&gt;
  sed -i &#039;s/,,/, ,/&#039; $FILEPATH &lt;br /&gt;
  cat $FILEPATH | while read -r LINE&lt;br /&gt;
  do&lt;br /&gt;
      IFS=&#039;,&#039; tokens=( $LINE )&lt;br /&gt;
&lt;br /&gt;
      if [ -z &amp;quot;${tokens[1]}&amp;quot; ]&lt;br /&gt;
      then&lt;br /&gt;
        echo &amp;quot;${LINE}&amp;quot; &amp;gt;&amp;gt; $TARGET_PATH&lt;br /&gt;
      else&lt;br /&gt;
        KEY=${tokens[0]}&lt;br /&gt;
        VALUE=${LINE#&amp;quot;${KEY},&amp;quot;}&lt;br /&gt;
        echo &amp;quot;${KEY}=${VALUE}&amp;quot; &amp;gt;&amp;gt; $TARGET_PATH&lt;br /&gt;
      fi&lt;br /&gt;
  done&lt;br /&gt;
IFS=&#039; &#039;&lt;br /&gt;
&lt;br /&gt;
done &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== transform_files_list.sh ===&lt;br /&gt;
An &amp;lt;i&amp;gt;example&amp;lt;/i&amp;gt; snippet of bash code for this type of file may be something like:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
if [ -z &amp;quot;$1&amp;quot; ]&lt;br /&gt;
  then&lt;br /&gt;
    echo &amp;quot;Error: Missing the argument like /&amp;lt;path&amp;gt;/pseudo_files.txt&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
if [ -f &amp;quot;$1&amp;quot; ]; then&lt;br /&gt;
    echo &amp;quot; File to rewrite: $1&amp;quot;&lt;br /&gt;
else&lt;br /&gt;
    echo &amp;quot; $1 not found&amp;quot;&lt;br /&gt;
    exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot; &amp;quot;&lt;br /&gt;
echo &amp;quot; --------------------------------------------&amp;quot;&lt;br /&gt;
echo &amp;quot; Files to Modify:  $1&amp;quot;&lt;br /&gt;
echo &amp;quot; for repository formatted files, not LRM OOTB ones&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# strings&amp;lt;locale&amp;gt;.properties -&amp;gt; strings&amp;lt;locale&amp;gt;.txt&lt;br /&gt;
echo &amp;quot;   &amp;gt;&amp;gt;  strings&amp;lt;locale&amp;gt;.properties to strings&amp;lt;locale&amp;gt;.txt&amp;quot;&lt;br /&gt;
sed -i &#039;s/\.properties/.txt/&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
sed -i &#039;s/strings_/strings-/&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
sed -i &#039;s/strings-zh_Hans/strings-zh-Hans/&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
sed -i &#039;s/strings-zh_Hant/strings-zh-Hant/&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
sed -i &#039;s/_/-/g&#039; &amp;quot;$1&amp;quot;&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot; &amp;quot; &lt;br /&gt;
ls -l &amp;quot;$1&amp;quot;&lt;br /&gt;
cat &amp;quot;$1&amp;quot;&lt;br /&gt;
echo &amp;quot; --------------------------------------------&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Command Center Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Transform System Files ===&lt;br /&gt;
The transform is retrieved like any system file from the repository and set as a system file. &lt;br /&gt;
&lt;br /&gt;
* Put Command Center in Maintenance Mode&lt;br /&gt;
* Go to Settings&lt;br /&gt;
* Go to System Files&lt;br /&gt;
* Add the Transform from the repository&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
[[File:Transform System File.jpg|center|600px]]&lt;br /&gt;
&lt;br /&gt;
When the repository is updated and the transform scripts are modified, update from the Edit button above to get the latest. The commit hash indicates which commit was last.&lt;br /&gt;
&lt;br /&gt;
=== Set the Transform for a Project ===&lt;br /&gt;
Now that the Transform is ready to be used, a project can be configured to run the transform. To do so, either during the creation or the edit of the project. &lt;br /&gt;
1. Make sure the project resource format is that of the transformed file, not the files in the repository. Here, that&#039;s .properties files. &lt;br /&gt;
2. Click the &#039;Use transform script&#039; checkbox and select the transform of your choice, here &#039;txt2prop&#039;&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
[[File:Transform Project Configuration.jpg|center|600px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now whenever the project is analyzed or files are sent to translation, the repository is cloned or pulled, the files identified with .txt are transformed into .properties, then analyzed or sent to translation as properties. &lt;br /&gt;
&lt;br /&gt;
Files are received from translation as properties, are analyzed for correctness, etc. as properties, then if the validations are passed, the files are transformed back in to .txt files and pushed to the repository.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Pull_Requests&amp;diff=99811</id>
		<title>Pull Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Pull_Requests&amp;diff=99811"/>
		<updated>2026-02-25T19:00:06Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Upgrade Procedure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
For GitHub, GitLab and Bitbucket, commits, Pull Requests / Merge Requests code changes can be analyzed using the Globalyzer Scanner.&lt;br /&gt;
&lt;br /&gt;
A Webhook lets a Jenkins job know to scan the code committed. Only the code modified is analyzed by the Globalyzer scanner. The result is a comment in GitHub, GitLab or Bitbucket showing issues detected. &lt;br /&gt;
&lt;br /&gt;
In the example below, one line was modified and the Globalyzer scan shows an i18n issue. The developer can decide how to handle it. &lt;br /&gt;
&lt;br /&gt;
[[File:PullRequestExample.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
This is unobtrusive and provides actionable i18n information to developers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Video Introduction to GitHub, GitLab, and Bitbucket =&lt;br /&gt;
Below are short introductions of the functionality around Globalyzer scanning for Git repository:&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;GitHub&#039;&#039;&#039; https://vimeo.com/817611647&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GitLab&#039;&#039;&#039; https://vimeo.com/817610534&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bitbucket&#039;&#039;&#039;  https://vimeo.com/826230267&lt;br /&gt;
&lt;br /&gt;
= Pull Requests via Jenkins Running on Docker =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites  ==&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; VM running Linux and Docker&lt;br /&gt;
    &amp;lt;li&amp;gt; JQ JSON Parser - Statically compiled binary version&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; https://stedolan.github.io/jq/&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; GitHub PAT credentials to connect to GitHub&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; The user for these PAT credentials has read access to the repository&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Globalyzer.com credentials for logging in to globalyzer.com&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; username&lt;br /&gt;
      &amp;lt;li&amp;gt; password&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Obtain a copy of Globalyzer Lite from https://www.globalyzer.com/gzserver/home/installclient (requires Globalyzer.com credentials)&lt;br /&gt;
    &amp;lt;li&amp;gt; A copy of your Globalyzer.license from globalyzer.com or your local globalyzer server instance.&lt;br /&gt;
    &amp;lt;li&amp;gt; Jenkins will use the following URL to download all plugins required during the installation.  This URL is required to be reachable from the VM Jenkins is being installed on prior to starting the install.  &lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; https://updates.jenkins.io/update-center.json &lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Optional:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Apache or nginx could be installed and running on the VM itself as a reverse proxy to front the Jenkins instance &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File System Configuration ==&lt;br /&gt;
  &amp;lt;p&amp;gt;&lt;br /&gt;
  If Apache is installed as per normal for many Lingoport systems, the following is required to configure Apache to permit proper connection to the Jenkins Docker container&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Create the directory structure for the volume storage used by jenkins.  Be sure there is sufficient space.   Base install will consume 650MB of space for the volume itself. &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; mkdir ~/docker/jenkins/lingoport/bin &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Place the Globalyzer License into the lingoport directory created &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; cp ~/PRC-Docker/Globalyzer.license ~/docker/jenkins/lingoport/ &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Copy the downloaded copy of Globalyzer Lite into the lingoport directory &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; cp ~/PRC-Docker/globalyzer-lite-VERSION.zip ~/docker/jenkins/lingoport/ &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Copy the jq binary into the bin directory and set the permissions &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; &lt;br /&gt;
        cp -p  ~/PRC-Docker/jq ~/docker/jenkins/lingoport/bin/&lt;br /&gt;
        chmod +x ~/docker/jenkins/lingoport/bin/jq&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Unzip the Globalyzer Lite zip file in the lingoport directory and remove the zip file once complete &amp;lt;/li&amp;gt; &lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        cd ~/docker/jenkins/lingoport&lt;br /&gt;
        unzip globalyzer-lite-VERSION.zip&lt;br /&gt;
        rm ./globalyzer-lite-VERSION.zip&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Create the .globalyzerrc file in the jenkins home directory, add the proper credentials and set the permissions &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        vi .globalyzerrc&lt;br /&gt;
        chmod 600 .globalyzerrc&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Confirm the contents of the .globalyzerrc file are entered like this:  (Note no equals or colon, just whitespace between key and value) &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        username &amp;lt;GLOBALYZER LOGIN USERNAME&amp;gt;&lt;br /&gt;
        password &amp;lt;GLOBALYZER LOGIN PASSWORD&amp;gt;&lt;br /&gt;
        server &amp;lt;URL of Globalyzer Server&amp;gt; &lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Launching the Jenkins Docker Container ==&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt; Retrieve these two items as they are now required to proceed &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Obtain the UID and GID for the user that Docker is being ran by.&lt;br /&gt;
    &amp;lt;li&amp;gt; Identify the the port that Jenkins should be listening on.&lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; In the example below it was determined to be 8085 &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; The next command line is an example of what would be used to start the docker instance for Jenkins. Here is an explanation of the switches being used when no proxy is required for the container to reach required destinations. &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    The command string will create a new container instance that will automatically restart the container unless specifically&lt;br /&gt;
    stopped.  It will also reuse the existing container on a restart of the OS.  If the container is stopped before the&lt;br /&gt;
    reboot is performed using &amp;lt;i&amp;gt; sudo docker stop &amp;quot;CONTAINTER ID&amp;quot; &amp;lt;/i&amp;gt;, it will need to be started using &amp;lt;i&amp;gt;sudo docker start &amp;quot;CONTAINER ID&amp;quot;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -d detaches the command being run from the terminal.  Normally this is something that will only be used&lt;br /&gt;
      once everything is in place and confirmed to be working.  For initial startup, its use can be ignored. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -u is for setting the uid/gid of the user that owns the volume storage identified earlier.  This user&lt;br /&gt;
    should also be the user that is starting the docker instance. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -p 8085:8080 is the port external to internal mapping identified earlier.  The 8080 would never change,&lt;br /&gt;
    only the external port is modifiable &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -p 50000:50000 is for mapping between Jenkins instances only.  Not required for standalone systems. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The JENKINS_OPTS sets the baseurl for the application &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -v mounts the prior locally created file system to the running docker instance as a volume and mas it. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The jenkins/jenkins:lts-jdk17 is the long term support image for Jenkins.  Currently, it is Jenkins 2.452.2 &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; --restart=unless-stopped \&lt;br /&gt;
      -v /USER_HOME_DIR/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk17&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt; &lt;br /&gt;
    If a proxy is required to be leveraged by the container to reach destinations the next command line would be used to start the docker instance for Jenkins instead of the previous one.  Note the additional env variables that are added to support the proxy.&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --env http_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --env https_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk17&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt;&lt;br /&gt;
    This will download the required images and start the container.  There will be a message about initial password, &lt;br /&gt;
    make note of it as it will be used to log into Jenkins&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    Jenkins initial setup is required. An admin user has been created and a password generated.&lt;br /&gt;
    Please use the following password to proceed to installation:&lt;br /&gt;
                                                                 &lt;br /&gt;
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
                                                                   &lt;br /&gt;
    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword&lt;br /&gt;
                                                                 &lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Connected Configuration ==&lt;br /&gt;
&amp;lt;p&amp;gt; Go to application using the browser and use the above password to log in initially &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Unlock-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; At this screen select Install Suggested Plugins &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Customize-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The plugins will begin to install, this will only be a few minutes. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Getting-started-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Create the Admin account.  This will be a new account outside of what was used to connect initially.  It will be the administrator account. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Create-first-admin-user-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This sets up the URL with a path to the instance.   It will include /jenkins so it should be something like “http(s)://&amp;lt;YOUR FQDN/jenkins/ &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Instance-config-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The base Jenkins system install is complete at this point. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Jenkins-ready.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Click Start using Jenkins and the Dashboard appears &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Dashboard-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The alert is caused by this running locally and not using nodes. Click on it and select “Dismiss” &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Node-details-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; If once this is cleared, this message appears.  It is due to a reverse proxy being used that needs to have some additional configuration. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Proxy-error-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; When using Apache as a reverse proxy, adding these two entries to the virtual host SSL configuration should correct the error. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
                           &lt;br /&gt;
RequestHeader set X-Forwarded-Port &amp;quot;443&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add GUI Configuration Items for Pull Requests and Commits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Install and additional plugin called “Discard Old Builds” by going to Manage Jenkins → Manage Plugins → Available Plugins and search for “Discard old builds” &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Plugins1-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Install an additional plugin called “Throttle Concurrent Builds” by going to Manage Jenkins → Manage Plugins → Available Plugins and search for “Throttle Concurrent Builds”&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Plugins2-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Once plugin is installed to go Manage Jenkins → Configure System → Throttle Concurrent Builds and select Add Category: &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Create Category Name PRC_THROTTLE and set Maximum Total Concurrent Builds = 1 and Maximum Concurrent Builds Per Node = 1.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Select “Apply” to save &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Set up the environment variables in Jenkins: &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Select the Environment Variables checkbox&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Add and add the following&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; For a GitHub Installation&lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; GITHUB_PRC_FILES = $JENKINS_HOME/lingoport/&amp;lt;globalyzer-lite-dir&amp;gt;/GitHub_PRC &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; PATH = $PATH:$JENKINS_HOME/lingoport/bin&lt;br /&gt;
      &amp;lt;li&amp;gt; If https is to be used for connecting to the git repos set to true.  If ssh is to be used to connect to git repos set to false.&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; useHTTPS = true or false &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Optional - If Proxy is required: &lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; Add entry _JAVA_OPTIONS with proxy details as shown in screenshot below &amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; Dhttp.proxyHost=&amp;lt;FQDN&amp;gt; Dhttp.proxyPort=&amp;lt;PORT&amp;gt; Dhttps.proxyHost=&amp;lt;FQDN&amp;gt; Dhttps.proxyPort=&amp;lt;PORT&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt; &lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Env-var1-jenkins.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Env-var2-jenkins.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Jenkins_proxy_for_java.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Click Apply and Save &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Add new API token to be used by GitHub Webhook &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; In Jenkins create a new API token for the user that will be running the build.  This will be required to be added to the webhook to permit connection back to the Jenkins instance &amp;lt;/p&amp;gt;&lt;br /&gt;
The credentials used for GitHub will require read access to the git repository.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Dashboard → Manage Jenkins → Manage Users → Select the gear icon on the right side of the Admin user (Admin user created earlier)&lt;br /&gt;
  &amp;lt;li&amp;gt; In the API Token section, select Add new Token&lt;br /&gt;
  &amp;lt;li&amp;gt; Set the name of the new token to GitHub-PRC-TOKEN or something that is memorable and can identify with the PRC action.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Be sure to copy the token value as it will never be displayed beyond this time. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Api-token-2.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
==Add File System Configuration Items for Pull Requests and Commits==&lt;br /&gt;
&amp;lt;p&amp;gt;Leave the GUI and go back to the file system &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Edit the github.properties file:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; /HOME_DIR/docker/jenkins/lingoport/globalyzer-lite-VERSION/GitHub_PRC/github.properties.&lt;br /&gt;
      &amp;lt;li&amp;gt; Update the github.login and github.oauth with the appropriate PAT values that were created ahead of time.&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; When using https there will need to be a .netrc file placed in the jenkins_home directory inside of the container.  This can be placed in the volume directory at /HOME_DIR/docker/jenkins/.netrc&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; login &amp;lt;GitHub login ID&amp;gt; (Not email)&lt;br /&gt;
      &amp;lt;li&amp;gt; password PAT&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; When using ssh there will need to be the ssh public and private keys stored in the /HOME_DIR/docker/jenkins/.ssh directory.  Also with ssh be sure to manually connect to the git repo prior to using the PRC scripts.  The known_hosts file needs to be updated and that is a manual process that requires manually accepting the key.  This should only be needed to be performed once.&lt;br /&gt;
  &amp;lt;li&amp;gt; Run the installer for Globalyzer-Lite.  This must be done inside of the contains so everything is properly set up in that environment&lt;br /&gt;
    &amp;lt;ol&amp;gt; &lt;br /&gt;
      &amp;lt;li&amp;gt; Obtain the container id&lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; sudo docker container ps &amp;lt;/code&amp;gt;&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; sudo docker exec -it CONTAINER ID /bin/bash &amp;lt;/code&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; cd ~/lingoport/globalyzer-lite-VERSION &amp;lt;/code&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt;./install-lite.sh &amp;lt;/code&amp;gt; (Should return Globalyzer Lite installation completed successfully)&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Jenkins Build for Pull Requests and Commits via GitHub ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into Jenkins and go to the Dashboard&lt;br /&gt;
  &amp;lt;li&amp;gt; Select New Item&lt;br /&gt;
  &amp;lt;li&amp;gt; Create an item name for the PRC build.  &lt;br /&gt;
  &amp;lt;li&amp;gt; Use an item name that is memorable, something like GitHub-PRC is fine.&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Freestyle Project&lt;br /&gt;
  &amp;lt;li&amp;gt; Select OK&lt;br /&gt;
  &amp;lt;li&amp;gt; Add a description (optional)&lt;br /&gt;
  &amp;lt;li&amp;gt; Select “This project is parameterized”&lt;br /&gt;
  &amp;lt;li&amp;gt; Add two string parameters&lt;br /&gt;
  &amp;lt;ol&amp;gt; &lt;br /&gt;
    &amp;lt;li&amp;gt; payload = NOT_SET&lt;br /&gt;
    &amp;lt;li&amp;gt; LITE_PROJECT_DEFINITION = DEFAULT&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; DEFAULT looks for the project definition to exist in the lingoport directory of the working branch as such:  lingoport/LiteProjectDefinition.xml&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Select “Throttle Concurrent Builds”&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Set Maximum Total Concurrent Builds to 1&lt;br /&gt;
      &amp;lt;li&amp;gt; Set Maximum Concurrent Builds Per Node to 1&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; In Build Triggers Section&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Select Trigger builds remotely (e.g., from scripts)&lt;br /&gt;
      &amp;lt;li&amp;gt; In the Authentication Token place a token you wish to use.  Something like HOOK for example.&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; In Build Steps Section&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Select Execute Shell&lt;br /&gt;
      &amp;lt;li&amp;gt; Place the following shell code&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; set +x &amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; $GITHUB_PRC_FILES/job_lite_pr.sh $GITHUB_PRC_FILES/pr_message.html &amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; In the Post-build Actions&lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; Select Discard Old Builds&lt;br /&gt;
        &amp;lt;li&amp;gt; Set Days to keep builds to 14&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Save the configuration&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GitHub Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; &lt;br /&gt;
Webhooks are calls made from the GitHub side down to the Jenkins instance.  They provide information required by the Jenkins build to properly scan the files that were either committed or had a pull request performed on them. This is discussed in detail in the Videos found in earlier sections of this page. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Below is a summary of the steps. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into GitHub&lt;br /&gt;
  &amp;lt;li&amp;gt; Navigate to the repository that will have pull requests and commits applied to it&lt;br /&gt;
  &amp;lt;li&amp;gt; Click on Settings → Webhooks→ Add webhook&lt;br /&gt;
  &amp;lt;li&amp;gt; Enter the following:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Payload URL &lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; URL found in Build Triggers Section of the Jenkins Build&lt;br /&gt;
          &amp;lt;li&amp;gt; It will likely require the API Token generated prior along with the username that the build in Jenkins was created&lt;br /&gt;
          &amp;lt;li&amp;gt; ht&amp;lt;span&amp;gt;tps://USER:TOKEN@JENKINS_URL/jenkins/job/BUILD_NAME/buildWithParameters?token=BUILD_TOKEN&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Content Type application/x-www-form-urlencoded&lt;br /&gt;
      &amp;lt;li&amp;gt; Radio button: Let me select individual events&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; Pushes&lt;br /&gt;
          &amp;lt;li&amp;gt; Pull Requests&lt;br /&gt;
          &amp;lt;li&amp;gt; Pushes, Pull Requests&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Using the Recent Deliveries tab it&#039;s possible to check the status of a web hook call to confirm that it worked correctly.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; There should be a build triggered for each webhook called submitted&lt;br /&gt;
      &amp;lt;li&amp;gt; If there are issues use the Redeliver button to resend&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Install Validation ===&lt;br /&gt;
&amp;lt;p&amp;gt; This completes the basic installation.  To confirm that everything is working correctly. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into GitHub and navigate to a repository&lt;br /&gt;
  &amp;lt;li&amp;gt; Make a change directly to a file in the GitHub repository and “Commit” the change (assuming Commits are enabled). &lt;br /&gt;
  &amp;lt;li&amp;gt; Switch to Jenkins and confirm that the build was triggered and successfully completed&lt;br /&gt;
  &amp;lt;li&amp;gt; Switch back to GitHub and click on the commit id for the modification in and confirm that there is an associated summary.&lt;br /&gt;
  &amp;lt;li&amp;gt; Clicking on the File/Line link in the summary should show the code line and modification made.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This is an image of the Analysis Summary in GitHub for a commit &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Intall-validation-1.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This image shows the line of code that is presented when clicking on the link in the Analysis Summary &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Install-validation-2.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
== SAML Integration (Optional) ==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To optionally leverage SAML in place of the local user login system, follow the instructions found on this page&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Docker Jenkins SAML Configuration]]&lt;br /&gt;
&lt;br /&gt;
= Jenkins Upgrade when using Docker =&lt;br /&gt;
&lt;br /&gt;
== Upgrade Required Indication ==&lt;br /&gt;
&lt;br /&gt;
When logging into Jenkins, there will be a message on the Manage Jenkins page indicating that a new version is available.&lt;br /&gt;
&lt;br /&gt;
[[file:Before_Upgrade.png |800px]]&lt;br /&gt;
&lt;br /&gt;
== Upgrade Procedure ==&lt;br /&gt;
&lt;br /&gt;
1. Log into the VM containing docker with a user that has sudo privileges.&lt;br /&gt;
&lt;br /&gt;
2. Stop the existing jenkins/jenkins:lts-jdk17 container (this may be lts-jdk21 as well)&lt;br /&gt;
   sudo docker stop &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Make a backup of the existing Jenkins directory that is mounted as a volume.  All Jenkins files are contained on the file system, there is no associated DB.&lt;br /&gt;
   $ cp -pr /home/&amp;lt;USER_DIR&amp;gt;/docker/jenkins /home/USER_DIR/docker/jenkins_&amp;lt;MMDDYYYY&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
4. Pull the latest version of the jenkins/jenkins:lts-jdk21 from docker.io.  Note that it will indicate a newer image has been downloaded.&lt;br /&gt;
 sudo docker pull jenkins/jenkins:lts-jdk21&lt;br /&gt;
        lts-jdk21: Pulling from jenkins/jenkins&lt;br /&gt;
        53c88f1dfeb7: Pull complete&lt;br /&gt;
        1354b1aa1de9: Pull complete&lt;br /&gt;
        0c31487ae971: Pull complete&lt;br /&gt;
        3c9c60b56010: Pull complete&lt;br /&gt;
        5681e84d3308: Pull complete&lt;br /&gt;
        a2375046a225: Pull complete&lt;br /&gt;
        967448ab02b6: Pull complete&lt;br /&gt;
        7eb8b3c92c00: Pull complete&lt;br /&gt;
        24446a3ce816: Pull complete&lt;br /&gt;
        f63b11f22c5e: Pull complete&lt;br /&gt;
        650135881854: Pull complete&lt;br /&gt;
        f703dc66a915: Pull complete&lt;br /&gt;
        Digest: sha256:23b84d1066dbe69f2c17288c83ac071127092d726f14b3b80444d868468619c7&lt;br /&gt;
        Status: Downloaded newer image for jenkins/jenkins:lts-jdk21&lt;br /&gt;
        docker.io/jenkins/jenkins:lts-jdk21&lt;br /&gt;
&lt;br /&gt;
5. Start the new container with the updated image using one of the two options below depending upon whether a proxy is required to be leveraged from inside of the container or not.  Adjust the home directory location as needed for the particular installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option #1&#039;&#039;&#039; - Run the newly updated container to start Jenkins with the latest&lt;br /&gt;
version (Command is the same as the one used initially to run) &lt;br /&gt;
&lt;br /&gt;
    $ sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk21&lt;br /&gt;
    $&lt;br /&gt;
    $ sudo docker container ls&lt;br /&gt;
    CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES&lt;br /&gt;
    f9fe867b7c00   jenkins/jenkins:lts-jdk21            &amp;quot;/usr/bin/tini -- /u…&amp;quot;   16 seconds ago   Up 15 seconds   0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp, 0.0.0.0:8086-&amp;gt;8080/tcp, :::8086-&amp;gt;8080/tcp   heuristic_proskuriakova&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option #2&#039;&#039;&#039; - Run the newly updated container to start Jenkins with&lt;br /&gt;
the latest version of Jenkins when a proxy is needed for outgoing communications&lt;br /&gt;
version (Command is the same as the one used initially to run) &lt;br /&gt;
&lt;br /&gt;
    $ sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --env http_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --env https_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk21&lt;br /&gt;
    $&lt;br /&gt;
    $ sudo docker container ls&lt;br /&gt;
    CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES&lt;br /&gt;
    9e2650b5ec1c   jenkins/jenkins:lts-jdk21   &amp;quot;/usr/bin/tini -- /u…&amp;quot;   33 seconds ago   Up 32 seconds   0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp, 0.0.0.0:8085-&amp;gt;8080/tcp, :::8085-&amp;gt;8080/tcp   elegant_engelbart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6. Confirm that the new version is running properly by logging in the web interface and going to the manage jenkins section.  There should not be mention of a new version being available.  &lt;br /&gt;
&lt;br /&gt;
[[file:After_Upgrade.png |800px]]&lt;br /&gt;
&lt;br /&gt;
7. At the bottom of this page, the current version will be displayed in the footer.&lt;br /&gt;
&lt;br /&gt;
8. The old container can be removed if desired at this point.&lt;br /&gt;
        sudo docker rm &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. The old image can also be removed if desired at this point.&lt;br /&gt;
        sudo docker rmi &amp;lt;IMAGE ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. The system will now be running the latest version of the Jenkins docker image and both the old images and containers will have been removed.&lt;br /&gt;
&lt;br /&gt;
= Historical Version of the Pull Request/Commit Globalyzer Scanning =&lt;br /&gt;
&lt;br /&gt;
[[ Historical Pull Request | Historical Pull Request ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Pull_Requests&amp;diff=99810</id>
		<title>Pull Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Pull_Requests&amp;diff=99810"/>
		<updated>2026-02-25T18:59:19Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Upgrade Procedure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
For GitHub, GitLab and Bitbucket, commits, Pull Requests / Merge Requests code changes can be analyzed using the Globalyzer Scanner.&lt;br /&gt;
&lt;br /&gt;
A Webhook lets a Jenkins job know to scan the code committed. Only the code modified is analyzed by the Globalyzer scanner. The result is a comment in GitHub, GitLab or Bitbucket showing issues detected. &lt;br /&gt;
&lt;br /&gt;
In the example below, one line was modified and the Globalyzer scan shows an i18n issue. The developer can decide how to handle it. &lt;br /&gt;
&lt;br /&gt;
[[File:PullRequestExample.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
This is unobtrusive and provides actionable i18n information to developers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Video Introduction to GitHub, GitLab, and Bitbucket =&lt;br /&gt;
Below are short introductions of the functionality around Globalyzer scanning for Git repository:&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;GitHub&#039;&#039;&#039; https://vimeo.com/817611647&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GitLab&#039;&#039;&#039; https://vimeo.com/817610534&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bitbucket&#039;&#039;&#039;  https://vimeo.com/826230267&lt;br /&gt;
&lt;br /&gt;
= Pull Requests via Jenkins Running on Docker =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites  ==&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; VM running Linux and Docker&lt;br /&gt;
    &amp;lt;li&amp;gt; JQ JSON Parser - Statically compiled binary version&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; https://stedolan.github.io/jq/&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; GitHub PAT credentials to connect to GitHub&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; The user for these PAT credentials has read access to the repository&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Globalyzer.com credentials for logging in to globalyzer.com&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; username&lt;br /&gt;
      &amp;lt;li&amp;gt; password&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Obtain a copy of Globalyzer Lite from https://www.globalyzer.com/gzserver/home/installclient (requires Globalyzer.com credentials)&lt;br /&gt;
    &amp;lt;li&amp;gt; A copy of your Globalyzer.license from globalyzer.com or your local globalyzer server instance.&lt;br /&gt;
    &amp;lt;li&amp;gt; Jenkins will use the following URL to download all plugins required during the installation.  This URL is required to be reachable from the VM Jenkins is being installed on prior to starting the install.  &lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; https://updates.jenkins.io/update-center.json &lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Optional:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Apache or nginx could be installed and running on the VM itself as a reverse proxy to front the Jenkins instance &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File System Configuration ==&lt;br /&gt;
  &amp;lt;p&amp;gt;&lt;br /&gt;
  If Apache is installed as per normal for many Lingoport systems, the following is required to configure Apache to permit proper connection to the Jenkins Docker container&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Create the directory structure for the volume storage used by jenkins.  Be sure there is sufficient space.   Base install will consume 650MB of space for the volume itself. &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; mkdir ~/docker/jenkins/lingoport/bin &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Place the Globalyzer License into the lingoport directory created &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; cp ~/PRC-Docker/Globalyzer.license ~/docker/jenkins/lingoport/ &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Copy the downloaded copy of Globalyzer Lite into the lingoport directory &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; cp ~/PRC-Docker/globalyzer-lite-VERSION.zip ~/docker/jenkins/lingoport/ &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Copy the jq binary into the bin directory and set the permissions &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; &lt;br /&gt;
        cp -p  ~/PRC-Docker/jq ~/docker/jenkins/lingoport/bin/&lt;br /&gt;
        chmod +x ~/docker/jenkins/lingoport/bin/jq&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Unzip the Globalyzer Lite zip file in the lingoport directory and remove the zip file once complete &amp;lt;/li&amp;gt; &lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        cd ~/docker/jenkins/lingoport&lt;br /&gt;
        unzip globalyzer-lite-VERSION.zip&lt;br /&gt;
        rm ./globalyzer-lite-VERSION.zip&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Create the .globalyzerrc file in the jenkins home directory, add the proper credentials and set the permissions &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        vi .globalyzerrc&lt;br /&gt;
        chmod 600 .globalyzerrc&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Confirm the contents of the .globalyzerrc file are entered like this:  (Note no equals or colon, just whitespace between key and value) &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        username &amp;lt;GLOBALYZER LOGIN USERNAME&amp;gt;&lt;br /&gt;
        password &amp;lt;GLOBALYZER LOGIN PASSWORD&amp;gt;&lt;br /&gt;
        server &amp;lt;URL of Globalyzer Server&amp;gt; &lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Launching the Jenkins Docker Container ==&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt; Retrieve these two items as they are now required to proceed &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Obtain the UID and GID for the user that Docker is being ran by.&lt;br /&gt;
    &amp;lt;li&amp;gt; Identify the the port that Jenkins should be listening on.&lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; In the example below it was determined to be 8085 &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; The next command line is an example of what would be used to start the docker instance for Jenkins. Here is an explanation of the switches being used when no proxy is required for the container to reach required destinations. &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    The command string will create a new container instance that will automatically restart the container unless specifically&lt;br /&gt;
    stopped.  It will also reuse the existing container on a restart of the OS.  If the container is stopped before the&lt;br /&gt;
    reboot is performed using &amp;lt;i&amp;gt; sudo docker stop &amp;quot;CONTAINTER ID&amp;quot; &amp;lt;/i&amp;gt;, it will need to be started using &amp;lt;i&amp;gt;sudo docker start &amp;quot;CONTAINER ID&amp;quot;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -d detaches the command being run from the terminal.  Normally this is something that will only be used&lt;br /&gt;
      once everything is in place and confirmed to be working.  For initial startup, its use can be ignored. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -u is for setting the uid/gid of the user that owns the volume storage identified earlier.  This user&lt;br /&gt;
    should also be the user that is starting the docker instance. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -p 8085:8080 is the port external to internal mapping identified earlier.  The 8080 would never change,&lt;br /&gt;
    only the external port is modifiable &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -p 50000:50000 is for mapping between Jenkins instances only.  Not required for standalone systems. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The JENKINS_OPTS sets the baseurl for the application &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -v mounts the prior locally created file system to the running docker instance as a volume and mas it. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The jenkins/jenkins:lts-jdk17 is the long term support image for Jenkins.  Currently, it is Jenkins 2.452.2 &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; --restart=unless-stopped \&lt;br /&gt;
      -v /USER_HOME_DIR/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk17&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt; &lt;br /&gt;
    If a proxy is required to be leveraged by the container to reach destinations the next command line would be used to start the docker instance for Jenkins instead of the previous one.  Note the additional env variables that are added to support the proxy.&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --env http_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --env https_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk17&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt;&lt;br /&gt;
    This will download the required images and start the container.  There will be a message about initial password, &lt;br /&gt;
    make note of it as it will be used to log into Jenkins&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    Jenkins initial setup is required. An admin user has been created and a password generated.&lt;br /&gt;
    Please use the following password to proceed to installation:&lt;br /&gt;
                                                                 &lt;br /&gt;
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
                                                                   &lt;br /&gt;
    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword&lt;br /&gt;
                                                                 &lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Connected Configuration ==&lt;br /&gt;
&amp;lt;p&amp;gt; Go to application using the browser and use the above password to log in initially &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Unlock-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; At this screen select Install Suggested Plugins &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Customize-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The plugins will begin to install, this will only be a few minutes. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Getting-started-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Create the Admin account.  This will be a new account outside of what was used to connect initially.  It will be the administrator account. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Create-first-admin-user-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This sets up the URL with a path to the instance.   It will include /jenkins so it should be something like “http(s)://&amp;lt;YOUR FQDN/jenkins/ &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Instance-config-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The base Jenkins system install is complete at this point. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Jenkins-ready.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Click Start using Jenkins and the Dashboard appears &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Dashboard-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The alert is caused by this running locally and not using nodes. Click on it and select “Dismiss” &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Node-details-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; If once this is cleared, this message appears.  It is due to a reverse proxy being used that needs to have some additional configuration. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Proxy-error-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; When using Apache as a reverse proxy, adding these two entries to the virtual host SSL configuration should correct the error. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
                           &lt;br /&gt;
RequestHeader set X-Forwarded-Port &amp;quot;443&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add GUI Configuration Items for Pull Requests and Commits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Install and additional plugin called “Discard Old Builds” by going to Manage Jenkins → Manage Plugins → Available Plugins and search for “Discard old builds” &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Plugins1-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Install an additional plugin called “Throttle Concurrent Builds” by going to Manage Jenkins → Manage Plugins → Available Plugins and search for “Throttle Concurrent Builds”&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Plugins2-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Once plugin is installed to go Manage Jenkins → Configure System → Throttle Concurrent Builds and select Add Category: &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Create Category Name PRC_THROTTLE and set Maximum Total Concurrent Builds = 1 and Maximum Concurrent Builds Per Node = 1.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Select “Apply” to save &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Set up the environment variables in Jenkins: &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Select the Environment Variables checkbox&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Add and add the following&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; For a GitHub Installation&lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; GITHUB_PRC_FILES = $JENKINS_HOME/lingoport/&amp;lt;globalyzer-lite-dir&amp;gt;/GitHub_PRC &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; PATH = $PATH:$JENKINS_HOME/lingoport/bin&lt;br /&gt;
      &amp;lt;li&amp;gt; If https is to be used for connecting to the git repos set to true.  If ssh is to be used to connect to git repos set to false.&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; useHTTPS = true or false &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Optional - If Proxy is required: &lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; Add entry _JAVA_OPTIONS with proxy details as shown in screenshot below &amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; Dhttp.proxyHost=&amp;lt;FQDN&amp;gt; Dhttp.proxyPort=&amp;lt;PORT&amp;gt; Dhttps.proxyHost=&amp;lt;FQDN&amp;gt; Dhttps.proxyPort=&amp;lt;PORT&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt; &lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Env-var1-jenkins.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Env-var2-jenkins.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Jenkins_proxy_for_java.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Click Apply and Save &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Add new API token to be used by GitHub Webhook &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; In Jenkins create a new API token for the user that will be running the build.  This will be required to be added to the webhook to permit connection back to the Jenkins instance &amp;lt;/p&amp;gt;&lt;br /&gt;
The credentials used for GitHub will require read access to the git repository.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Dashboard → Manage Jenkins → Manage Users → Select the gear icon on the right side of the Admin user (Admin user created earlier)&lt;br /&gt;
  &amp;lt;li&amp;gt; In the API Token section, select Add new Token&lt;br /&gt;
  &amp;lt;li&amp;gt; Set the name of the new token to GitHub-PRC-TOKEN or something that is memorable and can identify with the PRC action.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Be sure to copy the token value as it will never be displayed beyond this time. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Api-token-2.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
==Add File System Configuration Items for Pull Requests and Commits==&lt;br /&gt;
&amp;lt;p&amp;gt;Leave the GUI and go back to the file system &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Edit the github.properties file:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; /HOME_DIR/docker/jenkins/lingoport/globalyzer-lite-VERSION/GitHub_PRC/github.properties.&lt;br /&gt;
      &amp;lt;li&amp;gt; Update the github.login and github.oauth with the appropriate PAT values that were created ahead of time.&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; When using https there will need to be a .netrc file placed in the jenkins_home directory inside of the container.  This can be placed in the volume directory at /HOME_DIR/docker/jenkins/.netrc&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; login &amp;lt;GitHub login ID&amp;gt; (Not email)&lt;br /&gt;
      &amp;lt;li&amp;gt; password PAT&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; When using ssh there will need to be the ssh public and private keys stored in the /HOME_DIR/docker/jenkins/.ssh directory.  Also with ssh be sure to manually connect to the git repo prior to using the PRC scripts.  The known_hosts file needs to be updated and that is a manual process that requires manually accepting the key.  This should only be needed to be performed once.&lt;br /&gt;
  &amp;lt;li&amp;gt; Run the installer for Globalyzer-Lite.  This must be done inside of the contains so everything is properly set up in that environment&lt;br /&gt;
    &amp;lt;ol&amp;gt; &lt;br /&gt;
      &amp;lt;li&amp;gt; Obtain the container id&lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; sudo docker container ps &amp;lt;/code&amp;gt;&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; sudo docker exec -it CONTAINER ID /bin/bash &amp;lt;/code&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; cd ~/lingoport/globalyzer-lite-VERSION &amp;lt;/code&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt;./install-lite.sh &amp;lt;/code&amp;gt; (Should return Globalyzer Lite installation completed successfully)&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Jenkins Build for Pull Requests and Commits via GitHub ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into Jenkins and go to the Dashboard&lt;br /&gt;
  &amp;lt;li&amp;gt; Select New Item&lt;br /&gt;
  &amp;lt;li&amp;gt; Create an item name for the PRC build.  &lt;br /&gt;
  &amp;lt;li&amp;gt; Use an item name that is memorable, something like GitHub-PRC is fine.&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Freestyle Project&lt;br /&gt;
  &amp;lt;li&amp;gt; Select OK&lt;br /&gt;
  &amp;lt;li&amp;gt; Add a description (optional)&lt;br /&gt;
  &amp;lt;li&amp;gt; Select “This project is parameterized”&lt;br /&gt;
  &amp;lt;li&amp;gt; Add two string parameters&lt;br /&gt;
  &amp;lt;ol&amp;gt; &lt;br /&gt;
    &amp;lt;li&amp;gt; payload = NOT_SET&lt;br /&gt;
    &amp;lt;li&amp;gt; LITE_PROJECT_DEFINITION = DEFAULT&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; DEFAULT looks for the project definition to exist in the lingoport directory of the working branch as such:  lingoport/LiteProjectDefinition.xml&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Select “Throttle Concurrent Builds”&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Set Maximum Total Concurrent Builds to 1&lt;br /&gt;
      &amp;lt;li&amp;gt; Set Maximum Concurrent Builds Per Node to 1&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; In Build Triggers Section&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Select Trigger builds remotely (e.g., from scripts)&lt;br /&gt;
      &amp;lt;li&amp;gt; In the Authentication Token place a token you wish to use.  Something like HOOK for example.&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; In Build Steps Section&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Select Execute Shell&lt;br /&gt;
      &amp;lt;li&amp;gt; Place the following shell code&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; set +x &amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; $GITHUB_PRC_FILES/job_lite_pr.sh $GITHUB_PRC_FILES/pr_message.html &amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; In the Post-build Actions&lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; Select Discard Old Builds&lt;br /&gt;
        &amp;lt;li&amp;gt; Set Days to keep builds to 14&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Save the configuration&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GitHub Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; &lt;br /&gt;
Webhooks are calls made from the GitHub side down to the Jenkins instance.  They provide information required by the Jenkins build to properly scan the files that were either committed or had a pull request performed on them. This is discussed in detail in the Videos found in earlier sections of this page. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Below is a summary of the steps. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into GitHub&lt;br /&gt;
  &amp;lt;li&amp;gt; Navigate to the repository that will have pull requests and commits applied to it&lt;br /&gt;
  &amp;lt;li&amp;gt; Click on Settings → Webhooks→ Add webhook&lt;br /&gt;
  &amp;lt;li&amp;gt; Enter the following:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Payload URL &lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; URL found in Build Triggers Section of the Jenkins Build&lt;br /&gt;
          &amp;lt;li&amp;gt; It will likely require the API Token generated prior along with the username that the build in Jenkins was created&lt;br /&gt;
          &amp;lt;li&amp;gt; ht&amp;lt;span&amp;gt;tps://USER:TOKEN@JENKINS_URL/jenkins/job/BUILD_NAME/buildWithParameters?token=BUILD_TOKEN&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Content Type application/x-www-form-urlencoded&lt;br /&gt;
      &amp;lt;li&amp;gt; Radio button: Let me select individual events&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; Pushes&lt;br /&gt;
          &amp;lt;li&amp;gt; Pull Requests&lt;br /&gt;
          &amp;lt;li&amp;gt; Pushes, Pull Requests&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Using the Recent Deliveries tab it&#039;s possible to check the status of a web hook call to confirm that it worked correctly.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; There should be a build triggered for each webhook called submitted&lt;br /&gt;
      &amp;lt;li&amp;gt; If there are issues use the Redeliver button to resend&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Install Validation ===&lt;br /&gt;
&amp;lt;p&amp;gt; This completes the basic installation.  To confirm that everything is working correctly. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into GitHub and navigate to a repository&lt;br /&gt;
  &amp;lt;li&amp;gt; Make a change directly to a file in the GitHub repository and “Commit” the change (assuming Commits are enabled). &lt;br /&gt;
  &amp;lt;li&amp;gt; Switch to Jenkins and confirm that the build was triggered and successfully completed&lt;br /&gt;
  &amp;lt;li&amp;gt; Switch back to GitHub and click on the commit id for the modification in and confirm that there is an associated summary.&lt;br /&gt;
  &amp;lt;li&amp;gt; Clicking on the File/Line link in the summary should show the code line and modification made.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This is an image of the Analysis Summary in GitHub for a commit &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Intall-validation-1.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This image shows the line of code that is presented when clicking on the link in the Analysis Summary &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Install-validation-2.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
== SAML Integration (Optional) ==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To optionally leverage SAML in place of the local user login system, follow the instructions found on this page&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Docker Jenkins SAML Configuration]]&lt;br /&gt;
&lt;br /&gt;
= Jenkins Upgrade when using Docker =&lt;br /&gt;
&lt;br /&gt;
== Upgrade Required Indication ==&lt;br /&gt;
&lt;br /&gt;
When logging into Jenkins, there will be a message on the Manage Jenkins page indicating that a new version is available.&lt;br /&gt;
&lt;br /&gt;
[[file:Before_Upgrade.png |800px]]&lt;br /&gt;
&lt;br /&gt;
== Upgrade Procedure ==&lt;br /&gt;
&lt;br /&gt;
1. Log into the VM containing docker with a user that has sudo privileges.&lt;br /&gt;
&lt;br /&gt;
2. Stop the existing jenkins/jenkins:lts-jdk17 container (this may be lts-jdk21 as well)&lt;br /&gt;
   sudo docker stop &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Make a backup of the existing Jenkins directory that is mounted as a volume.  All Jenkins files are contained on the file system, there is no associated DB.&lt;br /&gt;
   $ cp -pr /home/&amp;lt;USER_DIR&amp;gt;/docker/jenkins /home/USER_DIR/docker/jenkins_&amp;lt;MMDDYYYY&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
4. Pull the latest version of the jenkins/jenkins:lts-jdk21 from docker.io.  Note that it will indicate a newer image has been downloaded.&lt;br /&gt;
 sudo docker pull jenkins/jenkins:lts-jdk21&lt;br /&gt;
        lts-jdk21: Pulling from jenkins/jenkins&lt;br /&gt;
        53c88f1dfeb7: Pull complete&lt;br /&gt;
        1354b1aa1de9: Pull complete&lt;br /&gt;
        0c31487ae971: Pull complete&lt;br /&gt;
        3c9c60b56010: Pull complete&lt;br /&gt;
        5681e84d3308: Pull complete&lt;br /&gt;
        a2375046a225: Pull complete&lt;br /&gt;
        967448ab02b6: Pull complete&lt;br /&gt;
        7eb8b3c92c00: Pull complete&lt;br /&gt;
        24446a3ce816: Pull complete&lt;br /&gt;
        f63b11f22c5e: Pull complete&lt;br /&gt;
        650135881854: Pull complete&lt;br /&gt;
        f703dc66a915: Pull complete&lt;br /&gt;
        Digest: sha256:23b84d1066dbe69f2c17288c83ac071127092d726f14b3b80444d868468619c7&lt;br /&gt;
        Status: Downloaded newer image for jenkins/jenkins:lts-jdk21&lt;br /&gt;
        da080ad7c1d0: Pull complete&lt;br /&gt;
&lt;br /&gt;
5. Start the new container with the updated image using one of the two options below depending upon whether a proxy is required to be leveraged from inside of the container or not.  Adjust the home directory location as needed for the particular installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option #1&#039;&#039;&#039; - Run the newly updated container to start Jenkins with the latest&lt;br /&gt;
version (Command is the same as the one used initially to run) &lt;br /&gt;
&lt;br /&gt;
    $ sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk21&lt;br /&gt;
    $&lt;br /&gt;
    $ sudo docker container ls&lt;br /&gt;
    CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES&lt;br /&gt;
    f9fe867b7c00   jenkins/jenkins:lts-jdk21            &amp;quot;/usr/bin/tini -- /u…&amp;quot;   16 seconds ago   Up 15 seconds   0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp, 0.0.0.0:8086-&amp;gt;8080/tcp, :::8086-&amp;gt;8080/tcp   heuristic_proskuriakova&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option #2&#039;&#039;&#039; - Run the newly updated container to start Jenkins with&lt;br /&gt;
the latest version of Jenkins when a proxy is needed for outgoing communications&lt;br /&gt;
version (Command is the same as the one used initially to run) &lt;br /&gt;
&lt;br /&gt;
    $ sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --env http_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --env https_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk21&lt;br /&gt;
    $&lt;br /&gt;
    $ sudo docker container ls&lt;br /&gt;
    CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES&lt;br /&gt;
    9e2650b5ec1c   jenkins/jenkins:lts-jdk21   &amp;quot;/usr/bin/tini -- /u…&amp;quot;   33 seconds ago   Up 32 seconds   0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp, 0.0.0.0:8085-&amp;gt;8080/tcp, :::8085-&amp;gt;8080/tcp   elegant_engelbart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6. Confirm that the new version is running properly by logging in the web interface and going to the manage jenkins section.  There should not be mention of a new version being available.  &lt;br /&gt;
&lt;br /&gt;
[[file:After_Upgrade.png |800px]]&lt;br /&gt;
&lt;br /&gt;
7. At the bottom of this page, the current version will be displayed in the footer.&lt;br /&gt;
&lt;br /&gt;
8. The old container can be removed if desired at this point.&lt;br /&gt;
        sudo docker rm &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. The old image can also be removed if desired at this point.&lt;br /&gt;
        sudo docker rmi &amp;lt;IMAGE ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. The system will now be running the latest version of the Jenkins docker image and both the old images and containers will have been removed.&lt;br /&gt;
&lt;br /&gt;
= Historical Version of the Pull Request/Commit Globalyzer Scanning =&lt;br /&gt;
&lt;br /&gt;
[[ Historical Pull Request | Historical Pull Request ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Pull_Requests&amp;diff=99809</id>
		<title>Pull Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Pull_Requests&amp;diff=99809"/>
		<updated>2026-02-25T18:58:52Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Upgrade Procedure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
For GitHub, GitLab and Bitbucket, commits, Pull Requests / Merge Requests code changes can be analyzed using the Globalyzer Scanner.&lt;br /&gt;
&lt;br /&gt;
A Webhook lets a Jenkins job know to scan the code committed. Only the code modified is analyzed by the Globalyzer scanner. The result is a comment in GitHub, GitLab or Bitbucket showing issues detected. &lt;br /&gt;
&lt;br /&gt;
In the example below, one line was modified and the Globalyzer scan shows an i18n issue. The developer can decide how to handle it. &lt;br /&gt;
&lt;br /&gt;
[[File:PullRequestExample.png|600px|center]]&lt;br /&gt;
&lt;br /&gt;
This is unobtrusive and provides actionable i18n information to developers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Video Introduction to GitHub, GitLab, and Bitbucket =&lt;br /&gt;
Below are short introductions of the functionality around Globalyzer scanning for Git repository:&lt;br /&gt;
 &lt;br /&gt;
* &#039;&#039;&#039;GitHub&#039;&#039;&#039; https://vimeo.com/817611647&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;GitLab&#039;&#039;&#039; https://vimeo.com/817610534&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bitbucket&#039;&#039;&#039;  https://vimeo.com/826230267&lt;br /&gt;
&lt;br /&gt;
= Pull Requests via Jenkins Running on Docker =&lt;br /&gt;
&lt;br /&gt;
== Prerequisites  ==&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; VM running Linux and Docker&lt;br /&gt;
    &amp;lt;li&amp;gt; JQ JSON Parser - Statically compiled binary version&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; https://stedolan.github.io/jq/&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; GitHub PAT credentials to connect to GitHub&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; The user for these PAT credentials has read access to the repository&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Globalyzer.com credentials for logging in to globalyzer.com&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; username&lt;br /&gt;
      &amp;lt;li&amp;gt; password&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Obtain a copy of Globalyzer Lite from https://www.globalyzer.com/gzserver/home/installclient (requires Globalyzer.com credentials)&lt;br /&gt;
    &amp;lt;li&amp;gt; A copy of your Globalyzer.license from globalyzer.com or your local globalyzer server instance.&lt;br /&gt;
    &amp;lt;li&amp;gt; Jenkins will use the following URL to download all plugins required during the installation.  This URL is required to be reachable from the VM Jenkins is being installed on prior to starting the install.  &lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; https://updates.jenkins.io/update-center.json &lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Optional:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Apache or nginx could be installed and running on the VM itself as a reverse proxy to front the Jenkins instance &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File System Configuration ==&lt;br /&gt;
  &amp;lt;p&amp;gt;&lt;br /&gt;
  If Apache is installed as per normal for many Lingoport systems, the following is required to configure Apache to permit proper connection to the Jenkins Docker container&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Create the directory structure for the volume storage used by jenkins.  Be sure there is sufficient space.   Base install will consume 650MB of space for the volume itself. &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; mkdir ~/docker/jenkins/lingoport/bin &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Place the Globalyzer License into the lingoport directory created &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; cp ~/PRC-Docker/Globalyzer.license ~/docker/jenkins/lingoport/ &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Copy the downloaded copy of Globalyzer Lite into the lingoport directory &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; cp ~/PRC-Docker/globalyzer-lite-VERSION.zip ~/docker/jenkins/lingoport/ &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Copy the jq binary into the bin directory and set the permissions &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt; &lt;br /&gt;
        cp -p  ~/PRC-Docker/jq ~/docker/jenkins/lingoport/bin/&lt;br /&gt;
        chmod +x ~/docker/jenkins/lingoport/bin/jq&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Unzip the Globalyzer Lite zip file in the lingoport directory and remove the zip file once complete &amp;lt;/li&amp;gt; &lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        cd ~/docker/jenkins/lingoport&lt;br /&gt;
        unzip globalyzer-lite-VERSION.zip&lt;br /&gt;
        rm ./globalyzer-lite-VERSION.zip&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Create the .globalyzerrc file in the jenkins home directory, add the proper credentials and set the permissions &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        vi .globalyzerrc&lt;br /&gt;
        chmod 600 .globalyzerrc&lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Confirm the contents of the .globalyzerrc file are entered like this:  (Note no equals or colon, just whitespace between key and value) &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;code&amp;gt;&lt;br /&gt;
        username &amp;lt;GLOBALYZER LOGIN USERNAME&amp;gt;&lt;br /&gt;
        password &amp;lt;GLOBALYZER LOGIN PASSWORD&amp;gt;&lt;br /&gt;
        server &amp;lt;URL of Globalyzer Server&amp;gt; &lt;br /&gt;
      &amp;lt;/code&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Launching the Jenkins Docker Container ==&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt; Retrieve these two items as they are now required to proceed &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Obtain the UID and GID for the user that Docker is being ran by.&lt;br /&gt;
    &amp;lt;li&amp;gt; Identify the the port that Jenkins should be listening on.&lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; In the example below it was determined to be 8085 &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;p&amp;gt; The next command line is an example of what would be used to start the docker instance for Jenkins. Here is an explanation of the switches being used when no proxy is required for the container to reach required destinations. &amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;&lt;br /&gt;
    The command string will create a new container instance that will automatically restart the container unless specifically&lt;br /&gt;
    stopped.  It will also reuse the existing container on a restart of the OS.  If the container is stopped before the&lt;br /&gt;
    reboot is performed using &amp;lt;i&amp;gt; sudo docker stop &amp;quot;CONTAINTER ID&amp;quot; &amp;lt;/i&amp;gt;, it will need to be started using &amp;lt;i&amp;gt;sudo docker start &amp;quot;CONTAINER ID&amp;quot;&amp;lt;/i&amp;gt;&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
  &amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -d detaches the command being run from the terminal.  Normally this is something that will only be used&lt;br /&gt;
      once everything is in place and confirmed to be working.  For initial startup, its use can be ignored. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -u is for setting the uid/gid of the user that owns the volume storage identified earlier.  This user&lt;br /&gt;
    should also be the user that is starting the docker instance. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -p 8085:8080 is the port external to internal mapping identified earlier.  The 8080 would never change,&lt;br /&gt;
    only the external port is modifiable &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -p 50000:50000 is for mapping between Jenkins instances only.  Not required for standalone systems. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The JENKINS_OPTS sets the baseurl for the application &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The -v mounts the prior locally created file system to the running docker instance as a volume and mas it. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; The jenkins/jenkins:lts-jdk17 is the long term support image for Jenkins.  Currently, it is Jenkins 2.452.2 &amp;lt;/li&amp;gt;&lt;br /&gt;
  &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; --restart=unless-stopped \&lt;br /&gt;
      -v /USER_HOME_DIR/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk17&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt; &lt;br /&gt;
    If a proxy is required to be leveraged by the container to reach destinations the next command line would be used to start the docker instance for Jenkins instead of the previous one.  Note the additional env variables that are added to support the proxy.&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --env http_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --env https_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk17&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;p&amp;gt;&lt;br /&gt;
    This will download the required images and start the container.  There will be a message about initial password, &lt;br /&gt;
    make note of it as it will be used to log into Jenkins&lt;br /&gt;
  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;code&amp;gt;&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    Jenkins initial setup is required. An admin user has been created and a password generated.&lt;br /&gt;
    Please use the following password to proceed to installation:&lt;br /&gt;
                                                                 &lt;br /&gt;
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;br /&gt;
                                                                   &lt;br /&gt;
    This may also be found at: /var/jenkins_home/secrets/initialAdminPassword&lt;br /&gt;
                                                                 &lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
    *************************************************************&lt;br /&gt;
  &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Browser Connected Configuration ==&lt;br /&gt;
&amp;lt;p&amp;gt; Go to application using the browser and use the above password to log in initially &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Unlock-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; At this screen select Install Suggested Plugins &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Customize-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The plugins will begin to install, this will only be a few minutes. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Getting-started-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Create the Admin account.  This will be a new account outside of what was used to connect initially.  It will be the administrator account. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Create-first-admin-user-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This sets up the URL with a path to the instance.   It will include /jenkins so it should be something like “http(s)://&amp;lt;YOUR FQDN/jenkins/ &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Instance-config-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The base Jenkins system install is complete at this point. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Jenkins-ready.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Click Start using Jenkins and the Dashboard appears &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Dashboard-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; The alert is caused by this running locally and not using nodes. Click on it and select “Dismiss” &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Node-details-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; If once this is cleared, this message appears.  It is due to a reverse proxy being used that needs to have some additional configuration. &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Proxy-error-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; When using Apache as a reverse proxy, adding these two entries to the virtual host SSL configuration should correct the error. &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
                           &lt;br /&gt;
RequestHeader set X-Forwarded-Port &amp;quot;443&amp;quot;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Add GUI Configuration Items for Pull Requests and Commits ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Install and additional plugin called “Discard Old Builds” by going to Manage Jenkins → Manage Plugins → Available Plugins and search for “Discard old builds” &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Plugins1-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Install an additional plugin called “Throttle Concurrent Builds” by going to Manage Jenkins → Manage Plugins → Available Plugins and search for “Throttle Concurrent Builds”&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Plugins2-jenkins.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Once plugin is installed to go Manage Jenkins → Configure System → Throttle Concurrent Builds and select Add Category: &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Create Category Name PRC_THROTTLE and set Maximum Total Concurrent Builds = 1 and Maximum Concurrent Builds Per Node = 1.  &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Select “Apply” to save &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; Set up the environment variables in Jenkins: &amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Select the Environment Variables checkbox&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Add and add the following&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; For a GitHub Installation&lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; GITHUB_PRC_FILES = $JENKINS_HOME/lingoport/&amp;lt;globalyzer-lite-dir&amp;gt;/GitHub_PRC &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; PATH = $PATH:$JENKINS_HOME/lingoport/bin&lt;br /&gt;
      &amp;lt;li&amp;gt; If https is to be used for connecting to the git repos set to true.  If ssh is to be used to connect to git repos set to false.&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; useHTTPS = true or false &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Optional - If Proxy is required: &lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; Add entry _JAVA_OPTIONS with proxy details as shown in screenshot below &amp;lt;/li&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; Dhttp.proxyHost=&amp;lt;FQDN&amp;gt; Dhttp.proxyPort=&amp;lt;PORT&amp;gt; Dhttps.proxyHost=&amp;lt;FQDN&amp;gt; Dhttps.proxyPort=&amp;lt;PORT&amp;gt; &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt; &lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Env-var1-jenkins.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Env-var2-jenkins.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
[[File:Jenkins_proxy_for_java.png|noframe|500px]]&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Click Apply and Save &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; Add new API token to be used by GitHub Webhook &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt; In Jenkins create a new API token for the user that will be running the build.  This will be required to be added to the webhook to permit connection back to the Jenkins instance &amp;lt;/p&amp;gt;&lt;br /&gt;
The credentials used for GitHub will require read access to the git repository.&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Dashboard → Manage Jenkins → Manage Users → Select the gear icon on the right side of the Admin user (Admin user created earlier)&lt;br /&gt;
  &amp;lt;li&amp;gt; In the API Token section, select Add new Token&lt;br /&gt;
  &amp;lt;li&amp;gt; Set the name of the new token to GitHub-PRC-TOKEN or something that is memorable and can identify with the PRC action.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Be sure to copy the token value as it will never be displayed beyond this time. &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Api-token-2.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
==Add File System Configuration Items for Pull Requests and Commits==&lt;br /&gt;
&amp;lt;p&amp;gt;Leave the GUI and go back to the file system &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Edit the github.properties file:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; /HOME_DIR/docker/jenkins/lingoport/globalyzer-lite-VERSION/GitHub_PRC/github.properties.&lt;br /&gt;
      &amp;lt;li&amp;gt; Update the github.login and github.oauth with the appropriate PAT values that were created ahead of time.&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; When using https there will need to be a .netrc file placed in the jenkins_home directory inside of the container.  This can be placed in the volume directory at /HOME_DIR/docker/jenkins/.netrc&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; login &amp;lt;GitHub login ID&amp;gt; (Not email)&lt;br /&gt;
      &amp;lt;li&amp;gt; password PAT&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; When using ssh there will need to be the ssh public and private keys stored in the /HOME_DIR/docker/jenkins/.ssh directory.  Also with ssh be sure to manually connect to the git repo prior to using the PRC scripts.  The known_hosts file needs to be updated and that is a manual process that requires manually accepting the key.  This should only be needed to be performed once.&lt;br /&gt;
  &amp;lt;li&amp;gt; Run the installer for Globalyzer-Lite.  This must be done inside of the contains so everything is properly set up in that environment&lt;br /&gt;
    &amp;lt;ol&amp;gt; &lt;br /&gt;
      &amp;lt;li&amp;gt; Obtain the container id&lt;br /&gt;
        &amp;lt;ol&amp;gt; &lt;br /&gt;
          &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; sudo docker container ps &amp;lt;/code&amp;gt;&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; sudo docker exec -it CONTAINER ID /bin/bash &amp;lt;/code&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; cd ~/lingoport/globalyzer-lite-VERSION &amp;lt;/code&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; &amp;lt;code&amp;gt;./install-lite.sh &amp;lt;/code&amp;gt; (Should return Globalyzer Lite installation completed successfully)&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Create Jenkins Build for Pull Requests and Commits via GitHub ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into Jenkins and go to the Dashboard&lt;br /&gt;
  &amp;lt;li&amp;gt; Select New Item&lt;br /&gt;
  &amp;lt;li&amp;gt; Create an item name for the PRC build.  &lt;br /&gt;
  &amp;lt;li&amp;gt; Use an item name that is memorable, something like GitHub-PRC is fine.&lt;br /&gt;
  &amp;lt;li&amp;gt; Select Freestyle Project&lt;br /&gt;
  &amp;lt;li&amp;gt; Select OK&lt;br /&gt;
  &amp;lt;li&amp;gt; Add a description (optional)&lt;br /&gt;
  &amp;lt;li&amp;gt; Select “This project is parameterized”&lt;br /&gt;
  &amp;lt;li&amp;gt; Add two string parameters&lt;br /&gt;
  &amp;lt;ol&amp;gt; &lt;br /&gt;
    &amp;lt;li&amp;gt; payload = NOT_SET&lt;br /&gt;
    &amp;lt;li&amp;gt; LITE_PROJECT_DEFINITION = DEFAULT&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; DEFAULT looks for the project definition to exist in the lingoport directory of the working branch as such:  lingoport/LiteProjectDefinition.xml&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; Select “Throttle Concurrent Builds”&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Set Maximum Total Concurrent Builds to 1&lt;br /&gt;
      &amp;lt;li&amp;gt; Set Maximum Concurrent Builds Per Node to 1&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; In Build Triggers Section&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Select Trigger builds remotely (e.g., from scripts)&lt;br /&gt;
      &amp;lt;li&amp;gt; In the Authentication Token place a token you wish to use.  Something like HOOK for example.&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt; In Build Steps Section&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Select Execute Shell&lt;br /&gt;
      &amp;lt;li&amp;gt; Place the following shell code&lt;br /&gt;
      &amp;lt;ul&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; set +x &amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; &amp;lt;code&amp;gt; $GITHUB_PRC_FILES/job_lite_pr.sh $GITHUB_PRC_FILES/pr_message.html &amp;lt;/code&amp;gt;&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ul&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; In the Post-build Actions&lt;br /&gt;
      &amp;lt;ol&amp;gt;&lt;br /&gt;
        &amp;lt;li&amp;gt; Select Discard Old Builds&lt;br /&gt;
        &amp;lt;li&amp;gt; Set Days to keep builds to 14&lt;br /&gt;
        &amp;lt;/li&amp;gt;&lt;br /&gt;
      &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Save the configuration&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GitHub Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; &lt;br /&gt;
Webhooks are calls made from the GitHub side down to the Jenkins instance.  They provide information required by the Jenkins build to properly scan the files that were either committed or had a pull request performed on them. This is discussed in detail in the Videos found in earlier sections of this page. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
Below is a summary of the steps. &lt;br /&gt;
&amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into GitHub&lt;br /&gt;
  &amp;lt;li&amp;gt; Navigate to the repository that will have pull requests and commits applied to it&lt;br /&gt;
  &amp;lt;li&amp;gt; Click on Settings → Webhooks→ Add webhook&lt;br /&gt;
  &amp;lt;li&amp;gt; Enter the following:&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Payload URL &lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; URL found in Build Triggers Section of the Jenkins Build&lt;br /&gt;
          &amp;lt;li&amp;gt; It will likely require the API Token generated prior along with the username that the build in Jenkins was created&lt;br /&gt;
          &amp;lt;li&amp;gt; ht&amp;lt;span&amp;gt;tps://USER:TOKEN@JENKINS_URL/jenkins/job/BUILD_NAME/buildWithParameters?token=BUILD_TOKEN&amp;lt;/span&amp;gt;&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; Content Type application/x-www-form-urlencoded&lt;br /&gt;
      &amp;lt;li&amp;gt; Radio button: Let me select individual events&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
          &amp;lt;li&amp;gt; Pushes&lt;br /&gt;
          &amp;lt;li&amp;gt; Pull Requests&lt;br /&gt;
          &amp;lt;li&amp;gt; Pushes, Pull Requests&lt;br /&gt;
          &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Using the Recent Deliveries tab it&#039;s possible to check the status of a web hook call to confirm that it worked correctly.&lt;br /&gt;
    &amp;lt;ol&amp;gt;&lt;br /&gt;
      &amp;lt;li&amp;gt; There should be a build triggered for each webhook called submitted&lt;br /&gt;
      &amp;lt;li&amp;gt; If there are issues use the Redeliver button to resend&lt;br /&gt;
      &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;/ol&amp;gt;&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Install Validation ===&lt;br /&gt;
&amp;lt;p&amp;gt; This completes the basic installation.  To confirm that everything is working correctly. &amp;lt;/p&amp;gt;&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
  &amp;lt;li&amp;gt; Log into GitHub and navigate to a repository&lt;br /&gt;
  &amp;lt;li&amp;gt; Make a change directly to a file in the GitHub repository and “Commit” the change (assuming Commits are enabled). &lt;br /&gt;
  &amp;lt;li&amp;gt; Switch to Jenkins and confirm that the build was triggered and successfully completed&lt;br /&gt;
  &amp;lt;li&amp;gt; Switch back to GitHub and click on the commit id for the modification in and confirm that there is an associated summary.&lt;br /&gt;
  &amp;lt;li&amp;gt; Clicking on the File/Line link in the summary should show the code line and modification made.&lt;br /&gt;
  &amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This is an image of the Analysis Summary in GitHub for a commit &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Intall-validation-1.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt; This image shows the line of code that is presented when clicking on the link in the Analysis Summary &amp;lt;/p&amp;gt;&lt;br /&gt;
[[File:Install-validation-2.png|noframe|500px]]&lt;br /&gt;
&lt;br /&gt;
== SAML Integration (Optional) ==&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
To optionally leverage SAML in place of the local user login system, follow the instructions found on this page&lt;br /&gt;
&amp;lt;p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Docker Jenkins SAML Configuration]]&lt;br /&gt;
&lt;br /&gt;
= Jenkins Upgrade when using Docker =&lt;br /&gt;
&lt;br /&gt;
== Upgrade Required Indication ==&lt;br /&gt;
&lt;br /&gt;
When logging into Jenkins, there will be a message on the Manage Jenkins page indicating that a new version is available.&lt;br /&gt;
&lt;br /&gt;
[[file:Before_Upgrade.png |800px]]&lt;br /&gt;
&lt;br /&gt;
== Upgrade Procedure ==&lt;br /&gt;
&lt;br /&gt;
1. Log into the VM containing docker with a user that has sudo privileges.&lt;br /&gt;
&lt;br /&gt;
2. Stop the existing jenkins/jenkins:lts-jdk17 container (this may be lts-jdk21 as well)&lt;br /&gt;
   sudo docker stop &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Make a backup of the existing Jenkins directory that is mounted as a volume.  All Jenkins files are contained on the file system, there is no associated DB.&lt;br /&gt;
   $ cp -pr /home/&amp;lt;USER_DIR&amp;gt;/docker/jenkins /home/USER_DIR/docker/jenkins_&amp;lt;MMDDYYYY&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
4. Pull the latest version of the jenkins/jenkins:lts-jdk21 from docker.io.  Note that it will indicate a newer image has been downloaded.&lt;br /&gt;
 sudo docker pull jenkins/jenkins:lts-jdk21&lt;br /&gt;
        lts-jdk21: Pulling from jenkins/jenkins&lt;br /&gt;
        53c88f1dfeb7: Pull complete&lt;br /&gt;
        1354b1aa1de9: Pull complete&lt;br /&gt;
        0c31487ae971: Pull complete&lt;br /&gt;
        3c9c60b56010: Pull complete&lt;br /&gt;
        5681e84d3308: Pull complete&lt;br /&gt;
        a2375046a225: Pull complete&lt;br /&gt;
        967448ab02b6: Pull complete&lt;br /&gt;
        7eb8b3c92c00: Pull complete&lt;br /&gt;
        24446a3ce816: Pull complete&lt;br /&gt;
        f63b11f22c5e: Pull complete&lt;br /&gt;
        650135881854: Pull complete&lt;br /&gt;
        f703dc66a915: Pull complete&lt;br /&gt;
        Digest: sha256:23b84d1066dbe69f2c17288c83ac071127092d726f14b3b80444d868468619c7&lt;br /&gt;
        Status: Downloaded newer image for jenkins/jenkins:lts-jdk21&lt;br /&gt;
        da080ad7c1d0: Pull complete&lt;br /&gt;
        Digest: sha256:90f7f78a7e114516216b6c0a06e00c597d6490597caec9d7bd7a95ce5c7dada0&lt;br /&gt;
        Status: Downloaded newer image for jenkins/jenkins:lts-jdk17&lt;br /&gt;
        docker.io/jenkins/jenkins:lts-jdk17&lt;br /&gt;
&lt;br /&gt;
5. Start the new container with the updated image using one of the two options below depending upon whether a proxy is required to be leveraged from inside of the container or not.  Adjust the home directory location as needed for the particular installation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option #1&#039;&#039;&#039; - Run the newly updated container to start Jenkins with the latest&lt;br /&gt;
version (Command is the same as the one used initially to run) &lt;br /&gt;
&lt;br /&gt;
    $ sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk21&lt;br /&gt;
    $&lt;br /&gt;
    $ sudo docker container ls&lt;br /&gt;
    CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS         PORTS                                                                                      NAMES&lt;br /&gt;
    f9fe867b7c00   jenkins/jenkins:lts-jdk21            &amp;quot;/usr/bin/tini -- /u…&amp;quot;   16 seconds ago   Up 15 seconds   0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp, 0.0.0.0:8086-&amp;gt;8080/tcp, :::8086-&amp;gt;8080/tcp   heuristic_proskuriakova&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Option #2&#039;&#039;&#039; - Run the newly updated container to start Jenkins with&lt;br /&gt;
the latest version of Jenkins when a proxy is needed for outgoing communications&lt;br /&gt;
version (Command is the same as the one used initially to run) &lt;br /&gt;
&lt;br /&gt;
    $ sudo docker run -d -u 1000:1000 -p 8085:8080 -p 50000:50000 \&lt;br /&gt;
      --env JENKINS_OPTS=&amp;quot;--prefix=/jenkins&amp;quot; \&lt;br /&gt;
      --env http_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --env https_proxy=&amp;quot;http://&amp;lt;PROXY_URL&amp;gt;:&amp;lt;PORT&amp;gt;&amp;quot; \&lt;br /&gt;
      --restart=unless-stopped \&lt;br /&gt;
      -v /home/centos/docker/jenkins:/var/jenkins_home jenkins/jenkins:lts-jdk21&lt;br /&gt;
    $&lt;br /&gt;
    $ sudo docker container ls&lt;br /&gt;
    CONTAINER ID   IMAGE                       COMMAND                  CREATED          STATUS          PORTS                                                                                      NAMES&lt;br /&gt;
    9e2650b5ec1c   jenkins/jenkins:lts-jdk21   &amp;quot;/usr/bin/tini -- /u…&amp;quot;   33 seconds ago   Up 32 seconds   0.0.0.0:50000-&amp;gt;50000/tcp, :::50000-&amp;gt;50000/tcp, 0.0.0.0:8085-&amp;gt;8080/tcp, :::8085-&amp;gt;8080/tcp   elegant_engelbart&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
6. Confirm that the new version is running properly by logging in the web interface and going to the manage jenkins section.  There should not be mention of a new version being available.  &lt;br /&gt;
&lt;br /&gt;
[[file:After_Upgrade.png |800px]]&lt;br /&gt;
&lt;br /&gt;
7. At the bottom of this page, the current version will be displayed in the footer.&lt;br /&gt;
&lt;br /&gt;
8. The old container can be removed if desired at this point.&lt;br /&gt;
        sudo docker rm &amp;lt;CONTAINER ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
9. The old image can also be removed if desired at this point.&lt;br /&gt;
        sudo docker rmi &amp;lt;IMAGE ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
10. The system will now be running the latest version of the Jenkins docker image and both the old images and containers will have been removed.&lt;br /&gt;
&lt;br /&gt;
= Historical Version of the Pull Request/Commit Globalyzer Scanning =&lt;br /&gt;
&lt;br /&gt;
[[ Historical Pull Request | Historical Pull Request ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99473</id>
		<title>Globalyzer and ChatGPT</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99473"/>
		<updated>2025-10-08T13:04:07Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Cost of Incorporation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ChatGPT Use in Globalyzer ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling ChatGPT Support for a Globalyzer Project ===&lt;br /&gt;
&lt;br /&gt;
In the Globalyzer Settings of each project locate &amp;quot;Apply ChatGPT prediction to Globalyzer reports&amp;quot; select &amp;quot;Yes&amp;quot;.  This will bring up a ChatGPT token form entry.  &lt;br /&gt;
* Copy your ChatGPT Token in this field.  &lt;br /&gt;
* The ChatGPT token will start with &amp;quot;sk-&amp;quot; and is generally around 50 characters in length.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Chatgpt-GZ-Enable.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
=== ChatGPT Functionality ===&lt;br /&gt;
&lt;br /&gt;
Once the Token has been added to the configuration, the next time a project analysis is performed there will be an automatic query to ChatGPT for every item identified as an issue by Globalyzer.  This occurs post Globalyzer Scan and the run details are logged in the same way as a project run.  It is important to note that the scan will only occur if a particular issue has not been previously scanned.  This means that if an analysis is performed again immediately after an analysis run, only issues which are new or changed since the previous analysis will be sent to ChatGPT.  This reduces the overall cost of incorporating ChatGPT into a Globalyzer environment. &lt;br /&gt;
&lt;br /&gt;
==== Issues Page ChatGPT Indicators ====&lt;br /&gt;
Once an analysis has completed, opening up the Issues page will show there is a new icon being provided for each issue detected as highlighted below.  This icon indicates the ChatGPT determined result for each issue as to whether ChatGPT identifies the issue as either:&lt;br /&gt;
* True positive &amp;quot;Orange&amp;quot; &lt;br /&gt;
* False positive &amp;quot;Green&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:IssuesChatgptIcons.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== Issues Page Individual Issue ChatGPT Indicators ====&lt;br /&gt;
&lt;br /&gt;
When expanding a single issue as shown below, in addition to the normally found items, there is an indicator for AI Prediction similar to what was shown prior to expanding the issue.  Also, below the code snippet there is a new button &amp;quot;AI prediction reason&amp;quot;.  Selecting this button will send another request to ChatGPT asking for a more detailed explanation of why the line item was determined to be a true or false positive.  Using this functionality will provide more information on what the determining factor was as additional time is taken by ChatGPT to analyze the reasoning.  This can sometimes result in a change from true positive to false positive or the reverse. &lt;br /&gt;
&lt;br /&gt;
[[File:IssuesAiPredictive.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== AI Prediction Reason ====&lt;br /&gt;
&lt;br /&gt;
*Currently In Progress&lt;br /&gt;
&lt;br /&gt;
=== Cost of Incorporation ===&lt;br /&gt;
&lt;br /&gt;
Although it is impossible to be completely accurate regarding the costs of leveraging ChatGPT in Globalyzer, below are some real use data collecting that should prove useful.  The Prediction Type of &amp;quot;AI Prediction&amp;quot; is the automated prediction that is obtained after each project analysis is performed.  The AI Prediction Reason is the more in-depth query to determine the reasoning that a true positive or false positive was arrived at in the AI Prediction Scan.&lt;br /&gt;
&lt;br /&gt;
*The below data was captured in October of 2025 for reference.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left; width=50%;&amp;quot;&lt;br /&gt;
! Prediction Type !! Issues Checked !! Tokens Used !! Tokens/Issue !! Positive Issues !! Negative Issues !! Input Cost !! Output Cost !! Total Cost !! Cost/Issue&lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction || 96 || 5417 || 56.43 || 48 || 48 || $0.014 || $0.015 || $0.03 || $0.003125 &lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction Reason|| TBD || TBD || TBD || TBD || TBD || TBD || TBD || TBD || TBD&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99469</id>
		<title>Globalyzer and ChatGPT</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99469"/>
		<updated>2025-10-07T20:55:18Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* AI Prediction Reason */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ChatGPT Use in Globalyzer ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling ChatGPT Support for a Globalyzer Project ===&lt;br /&gt;
&lt;br /&gt;
In the Globalyzer Settings of each project locate &amp;quot;Apply ChatGPT prediction to Globalyzer reports&amp;quot; select &amp;quot;Yes&amp;quot;.  This will bring up a ChatGPT token form entry.  &lt;br /&gt;
* Copy your ChatGPT Token in this field.  &lt;br /&gt;
* The ChatGPT token will start with &amp;quot;sk-&amp;quot; and is generally around 50 characters in length.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Chatgpt-GZ-Enable.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
=== ChatGPT Functionality ===&lt;br /&gt;
&lt;br /&gt;
Once the Token has been added to the configuration, the next time a project analysis is performed there will be an automatic query to ChatGPT for every item identified as an issue by Globalyzer.  This occurs post Globalyzer Scan and the run details are logged in the same way as a project run.  It is important to note that the scan will only occur if a particular issue has not been previously scanned.  This means that if an analysis is performed again immediately after an analysis run, only issues which are new or changed since the previous analysis will be sent to ChatGPT.  This reduces the overall cost of incorporating ChatGPT into a Globalyzer environment. &lt;br /&gt;
&lt;br /&gt;
==== Issues Page ChatGPT Indicators ====&lt;br /&gt;
Once an analysis has completed, opening up the Issues page will show there is a new icon being provided for each issue detected as highlighted below.  This icon indicates the ChatGPT determined result for each issue as to whether ChatGPT identifies the issue as either:&lt;br /&gt;
* True positive &amp;quot;Orange&amp;quot; &lt;br /&gt;
* False positive &amp;quot;Green&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:IssuesChatgptIcons.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== Issues Page Individual Issue ChatGPT Indicators ====&lt;br /&gt;
&lt;br /&gt;
When expanding a single issue as shown below, in addition to the normally found items, there is an indicator for AI Prediction similar to what was shown prior to expanding the issue.  Also, below the code snippet there is a new button &amp;quot;AI prediction reason&amp;quot;.  Selecting this button will send another request to ChatGPT asking for a more detailed explanation of why the line item was determined to be a true or false positive.  Using this functionality will provide more information on what the determining factor was as additional time is taken by ChatGPT to analyze the reasoning.  This can sometimes result in a change from true positive to false positive or the reverse. &lt;br /&gt;
&lt;br /&gt;
[[File:IssuesAiPredictive.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== AI Prediction Reason ====&lt;br /&gt;
&lt;br /&gt;
*Currently In Progress&lt;br /&gt;
&lt;br /&gt;
=== Cost of Incorporation ===&lt;br /&gt;
&lt;br /&gt;
Although it is impossible to be completely accurate regarding the costs of leveraging ChatGPT in Globalyzer, below are some real use data collecting that should prove useful.  The Prediction Type of &amp;quot;AI Prediction&amp;quot; is the automated prediction that is obtained after each project analysis is performed.  The AI Prediction Reason is the more in-depth query to determine the reasoning that a true positive or false positive was arrived at in the AI Prediction Scan.&lt;br /&gt;
&lt;br /&gt;
*The below data was captured in October of 2025 for reference.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left; width=50%;&amp;quot;&lt;br /&gt;
! Prediction Type !! Issues Checked !! Tokens Used !! Positive Issues !! Negative Issues !! Input Cost !! Output Cost !! Total Cost&lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction || 96 || 5417 || 48 || 48 || $0.014 || $0.015 || $0.03 &lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction Reason|| TBD || TBD || TBD || TBD || TBD || TBD || TBD&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Creating_a_Globalyzer_Project&amp;diff=99468</id>
		<title>Creating a Globalyzer Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Creating_a_Globalyzer_Project&amp;diff=99468"/>
		<updated>2025-10-07T20:03:34Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Step4GlobalyzerPDF.jpg|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
Both of the prompts on this page depend on files in the &#039;&#039;&#039;Settings -&amp;gt; System Files -&amp;gt; Globalyzer Lite Files&#039;&#039;&#039; and &#039;&#039;&#039;Custom Scripts&#039;&#039;&#039;.  If these are not set up then use the default settings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Script to Generate Globalyzer reports&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Apply ChatGPT Prediction to Globalyzer Reports&#039;&#039;&#039;. Enables and disables the automatic prediction of ChatGPT to all issues detected by Globalyzer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChatGPT Token&#039;&#039;&#039;. Token used by ChatGPT when leveraging ChatGPT predictions.&lt;br /&gt;
&lt;br /&gt;
For details on using ChatGPT with Globalyzer see [[Globalyzer and ChatGPT]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project Definition File&#039;&#039;&#039; Where in the repository is the Globalyzer Lite Project Definition file?  &lt;br /&gt;
&lt;br /&gt;
For example, if your repository is  &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://github.com/Acme/MyProject&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and the Lite Project Definition File is in the &#039;&#039;&#039;lingoport&#039;&#039;&#039; folder and called &#039;&#039;&#039;PDF.xml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
then the entry for Project Definition File would be:&lt;br /&gt;
&lt;br /&gt;
 /lingoport/PDF.xml&lt;br /&gt;
&lt;br /&gt;
If the path or the file is incorrect or the file is not a Globalyzer Lite Project Definition file, then the error will be: &#039;&#039;&#039;Invalid lite file&#039;&#039;&#039;.  The file needs to be correct before moving forward.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Confirm Globalyzer Configuration]]&lt;br /&gt;
&lt;br /&gt;
[[Name The Project and Type|&amp;lt;== Back to Step 3: Name the Project ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99467</id>
		<title>Globalyzer and ChatGPT</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99467"/>
		<updated>2025-10-07T20:03:05Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* AI Prediction Reason */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ChatGPT Use in Globalyzer ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling ChatGPT Support for a Globalyzer Project ===&lt;br /&gt;
&lt;br /&gt;
In the Globalyzer Settings of each project locate &amp;quot;Apply ChatGPT prediction to Globalyzer reports&amp;quot; select &amp;quot;Yes&amp;quot;.  This will bring up a ChatGPT token form entry.  &lt;br /&gt;
* Copy your ChatGPT Token in this field.  &lt;br /&gt;
* The ChatGPT token will start with &amp;quot;sk-&amp;quot; and is generally around 50 characters in length.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Chatgpt-GZ-Enable.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
=== ChatGPT Functionality ===&lt;br /&gt;
&lt;br /&gt;
Once the Token has been added to the configuration, the next time a project analysis is performed there will be an automatic query to ChatGPT for every item identified as an issue by Globalyzer.  This occurs post Globalyzer Scan and the run details are logged in the same way as a project run.  It is important to note that the scan will only occur if a particular issue has not been previously scanned.  This means that if an analysis is performed again immediately after an analysis run, only issues which are new or changed since the previous analysis will be sent to ChatGPT.  This reduces the overall cost of incorporating ChatGPT into a Globalyzer environment. &lt;br /&gt;
&lt;br /&gt;
==== Issues Page ChatGPT Indicators ====&lt;br /&gt;
Once an analysis has completed, opening up the Issues page will show there is a new icon being provided for each issue detected as highlighted below.  This icon indicates the ChatGPT determined result for each issue as to whether ChatGPT identifies the issue as either:&lt;br /&gt;
* True positive &amp;quot;Orange&amp;quot; &lt;br /&gt;
* False positive &amp;quot;Green&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:IssuesChatgptIcons.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== Issues Page Individual Issue ChatGPT Indicators ====&lt;br /&gt;
&lt;br /&gt;
When expanding a single issue as shown below, in addition to the normally found items, there is an indicator for AI Prediction similar to what was shown prior to expanding the issue.  Also, below the code snippet there is a new button &amp;quot;AI prediction reason&amp;quot;.  Selecting this button will send another request to ChatGPT asking for a more detailed explanation of why the line item was determined to be a true or false positive.  Using this functionality will provide more information on what the determining factor was as additional time is taken by ChatGPT to analyze the reasoning.  This can sometimes result in a change from true positive to false positive or the reverse. &lt;br /&gt;
&lt;br /&gt;
[[File:IssuesAiPredictive.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== AI Prediction Reason ====&lt;br /&gt;
TBD&lt;br /&gt;
&lt;br /&gt;
=== Cost of Incorporation ===&lt;br /&gt;
&lt;br /&gt;
Although it is impossible to be completely accurate regarding the costs of leveraging ChatGPT in Globalyzer, below are some real use data collecting that should prove useful.  The Prediction Type of &amp;quot;AI Prediction&amp;quot; is the automated prediction that is obtained after each project analysis is performed.  The AI Prediction Reason is the more in-depth query to determine the reasoning that a true positive or false positive was arrived at in the AI Prediction Scan.&lt;br /&gt;
&lt;br /&gt;
*The below data was captured in October of 2025 for reference.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left; width=50%;&amp;quot;&lt;br /&gt;
! Prediction Type !! Issues Checked !! Tokens Used !! Positive Issues !! Negative Issues !! Input Cost !! Output Cost !! Total Cost&lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction || 96 || 5417 || 48 || 48 || $0.014 || $0.015 || $0.03 &lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction Reason|| TBD || TBD || TBD || TBD || TBD || TBD || TBD&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99466</id>
		<title>Globalyzer and ChatGPT</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99466"/>
		<updated>2025-10-07T20:02:52Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* TBD */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ChatGPT Use in Globalyzer ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling ChatGPT Support for a Globalyzer Project ===&lt;br /&gt;
&lt;br /&gt;
In the Globalyzer Settings of each project locate &amp;quot;Apply ChatGPT prediction to Globalyzer reports&amp;quot; select &amp;quot;Yes&amp;quot;.  This will bring up a ChatGPT token form entry.  &lt;br /&gt;
* Copy your ChatGPT Token in this field.  &lt;br /&gt;
* The ChatGPT token will start with &amp;quot;sk-&amp;quot; and is generally around 50 characters in length.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Chatgpt-GZ-Enable.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
=== ChatGPT Functionality ===&lt;br /&gt;
&lt;br /&gt;
Once the Token has been added to the configuration, the next time a project analysis is performed there will be an automatic query to ChatGPT for every item identified as an issue by Globalyzer.  This occurs post Globalyzer Scan and the run details are logged in the same way as a project run.  It is important to note that the scan will only occur if a particular issue has not been previously scanned.  This means that if an analysis is performed again immediately after an analysis run, only issues which are new or changed since the previous analysis will be sent to ChatGPT.  This reduces the overall cost of incorporating ChatGPT into a Globalyzer environment. &lt;br /&gt;
&lt;br /&gt;
==== Issues Page ChatGPT Indicators ====&lt;br /&gt;
Once an analysis has completed, opening up the Issues page will show there is a new icon being provided for each issue detected as highlighted below.  This icon indicates the ChatGPT determined result for each issue as to whether ChatGPT identifies the issue as either:&lt;br /&gt;
* True positive &amp;quot;Orange&amp;quot; &lt;br /&gt;
* False positive &amp;quot;Green&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:IssuesChatgptIcons.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== Issues Page Individual Issue ChatGPT Indicators ====&lt;br /&gt;
&lt;br /&gt;
When expanding a single issue as shown below, in addition to the normally found items, there is an indicator for AI Prediction similar to what was shown prior to expanding the issue.  Also, below the code snippet there is a new button &amp;quot;AI prediction reason&amp;quot;.  Selecting this button will send another request to ChatGPT asking for a more detailed explanation of why the line item was determined to be a true or false positive.  Using this functionality will provide more information on what the determining factor was as additional time is taken by ChatGPT to analyze the reasoning.  This can sometimes result in a change from true positive to false positive or the reverse. &lt;br /&gt;
&lt;br /&gt;
[[File:IssuesAiPredictive.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== AI Prediction Reason ====&lt;br /&gt;
&lt;br /&gt;
=== Cost of Incorporation ===&lt;br /&gt;
&lt;br /&gt;
Although it is impossible to be completely accurate regarding the costs of leveraging ChatGPT in Globalyzer, below are some real use data collecting that should prove useful.  The Prediction Type of &amp;quot;AI Prediction&amp;quot; is the automated prediction that is obtained after each project analysis is performed.  The AI Prediction Reason is the more in-depth query to determine the reasoning that a true positive or false positive was arrived at in the AI Prediction Scan.&lt;br /&gt;
&lt;br /&gt;
*The below data was captured in October of 2025 for reference.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left; width=50%;&amp;quot;&lt;br /&gt;
! Prediction Type !! Issues Checked !! Tokens Used !! Positive Issues !! Negative Issues !! Input Cost !! Output Cost !! Total Cost&lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction || 96 || 5417 || 48 || 48 || $0.014 || $0.015 || $0.03 &lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction Reason|| TBD || TBD || TBD || TBD || TBD || TBD || TBD&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Creating_a_Globalyzer_Project&amp;diff=99465</id>
		<title>Creating a Globalyzer Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Creating_a_Globalyzer_Project&amp;diff=99465"/>
		<updated>2025-10-07T19:55:27Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Step4GlobalyzerPDF.jpg|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
Both of the prompts on this page depend on files in the &#039;&#039;&#039;Settings -&amp;gt; System Files -&amp;gt; Globalyzer Lite Files&#039;&#039;&#039; and &#039;&#039;&#039;Custom Scripts&#039;&#039;&#039;.  If these are not set up then use the default settings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Script to Generate Globalyzer reports&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Apply ChatGPT Prediction to Globalyzer Reports&#039;&#039;&#039;. Enables and disables the automatic prediction of ChatGPT to all issues detected by Globalyzer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ChatGPT Token&#039;&#039;&#039;. Token used by ChatGPT when leveraging ChatGPT predictions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project Definition File&#039;&#039;&#039; Where in the repository is the Globalyzer Lite Project Definition file?  &lt;br /&gt;
&lt;br /&gt;
For example, if your repository is  &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://github.com/Acme/MyProject&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and the Lite Project Definition File is in the &#039;&#039;&#039;lingoport&#039;&#039;&#039; folder and called &#039;&#039;&#039;PDF.xml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
then the entry for Project Definition File would be:&lt;br /&gt;
&lt;br /&gt;
 /lingoport/PDF.xml&lt;br /&gt;
&lt;br /&gt;
If the path or the file is incorrect or the file is not a Globalyzer Lite Project Definition file, then the error will be: &#039;&#039;&#039;Invalid lite file&#039;&#039;&#039;.  The file needs to be correct before moving forward.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Confirm Globalyzer Configuration]]&lt;br /&gt;
&lt;br /&gt;
[[Name The Project and Type|&amp;lt;== Back to Step 3: Name the Project ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Creating_a_Globalyzer_Project&amp;diff=99464</id>
		<title>Creating a Globalyzer Project</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Creating_a_Globalyzer_Project&amp;diff=99464"/>
		<updated>2025-10-07T19:29:11Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Step4GlobalyzerPDF.jpg|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
Both of the prompts on this page depend on files in the &#039;&#039;&#039;Settings -&amp;gt; System Files -&amp;gt; Globalyzer Lite Files&#039;&#039;&#039; and &#039;&#039;&#039;Custom Scripts&#039;&#039;&#039;.  If these are not set up then use the default setttings.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Script to Generate Globalyzer reports&#039;&#039;&#039;. Select the default value unless a script has been uploaded already.  Most of the time the default value will be the correct one.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Project Definition File&#039;&#039;&#039; Where in the repository is the Globalyzer Lite Project Definition file?  &lt;br /&gt;
&lt;br /&gt;
For example, if your repository is  &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;https://github.com/Acme/MyProject&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and the Lite Project Definition File is in the &#039;&#039;&#039;lingoport&#039;&#039;&#039; folder and called &#039;&#039;&#039;PDF.xml&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
then the entry for Project Definition File would be:&lt;br /&gt;
&lt;br /&gt;
 /lingoport/PDF.xml&lt;br /&gt;
&lt;br /&gt;
If the path or the file is incorrect or the file is not a Globalyzer Lite Project Definition file, then the error will be: &#039;&#039;&#039;Invalid lite file&#039;&#039;&#039;.  The file needs to be correct before moving forward.&lt;br /&gt;
&lt;br /&gt;
Select &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Confirm Globalyzer Configuration]]&lt;br /&gt;
&lt;br /&gt;
[[Name The Project and Type|&amp;lt;== Back to Step 3: Name the Project ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:Step4GlobalyzerPDF.jpg&amp;diff=99463</id>
		<title>File:Step4GlobalyzerPDF.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:Step4GlobalyzerPDF.jpg&amp;diff=99463"/>
		<updated>2025-10-07T19:27:10Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: Rwilliams uploaded a new version of File:Step4GlobalyzerPDF.jpg&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99462</id>
		<title>Globalyzer and ChatGPT</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Globalyzer_and_ChatGPT&amp;diff=99462"/>
		<updated>2025-10-07T19:07:29Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: Created page with &amp;quot;== ChatGPT Use in Globalyzer ==  === Enabling ChatGPT Support for a Globalyzer Project ===  In the Globalyzer Settings of each project locate &amp;quot;Apply ChatGPT prediction to Glob...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== ChatGPT Use in Globalyzer ==&lt;br /&gt;
&lt;br /&gt;
=== Enabling ChatGPT Support for a Globalyzer Project ===&lt;br /&gt;
&lt;br /&gt;
In the Globalyzer Settings of each project locate &amp;quot;Apply ChatGPT prediction to Globalyzer reports&amp;quot; select &amp;quot;Yes&amp;quot;.  This will bring up a ChatGPT token form entry.  &lt;br /&gt;
* Copy your ChatGPT Token in this field.  &lt;br /&gt;
* The ChatGPT token will start with &amp;quot;sk-&amp;quot; and is generally around 50 characters in length.&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Chatgpt-GZ-Enable.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
=== ChatGPT Functionality ===&lt;br /&gt;
&lt;br /&gt;
Once the Token has been added to the configuration, the next time a project analysis is performed there will be an automatic query to ChatGPT for every item identified as an issue by Globalyzer.  This occurs post Globalyzer Scan and the run details are logged in the same way as a project run.  It is important to note that the scan will only occur if a particular issue has not been previously scanned.  This means that if an analysis is performed again immediately after an analysis run, only issues which are new or changed since the previous analysis will be sent to ChatGPT.  This reduces the overall cost of incorporating ChatGPT into a Globalyzer environment. &lt;br /&gt;
&lt;br /&gt;
==== Issues Page ChatGPT Indicators ====&lt;br /&gt;
Once an analysis has completed, opening up the Issues page will show there is a new icon being provided for each issue detected as highlighted below.  This icon indicates the ChatGPT determined result for each issue as to whether ChatGPT identifies the issue as either:&lt;br /&gt;
* True positive &amp;quot;Orange&amp;quot; &lt;br /&gt;
* False positive &amp;quot;Green&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[File:IssuesChatgptIcons.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== Issues Page Individual Issue ChatGPT Indicators ====&lt;br /&gt;
&lt;br /&gt;
When expanding a single issue as shown below, in addition to the normally found items, there is an indicator for AI Prediction similar to what was shown prior to expanding the issue.  Also, below the code snippet there is a new button &amp;quot;AI prediction reason&amp;quot;.  Selecting this button will send another request to ChatGPT asking for a more detailed explanation of why the line item was determined to be a true or false positive.  Using this functionality will provide more information on what the determining factor was as additional time is taken by ChatGPT to analyze the reasoning.  This can sometimes result in a change from true positive to false positive or the reverse. &lt;br /&gt;
&lt;br /&gt;
[[File:IssuesAiPredictive.png|1024px|center]]&lt;br /&gt;
&lt;br /&gt;
==== AI Prediction Reason ====&lt;br /&gt;
&lt;br /&gt;
==TBD==&lt;br /&gt;
&lt;br /&gt;
=== Cost of Incorporation ===&lt;br /&gt;
&lt;br /&gt;
Although it is impossible to be completely accurate regarding the costs of leveraging ChatGPT in Globalyzer, below are some real use data collecting that should prove useful.  The Prediction Type of &amp;quot;AI Prediction&amp;quot; is the automated prediction that is obtained after each project analysis is performed.  The AI Prediction Reason is the more in-depth query to determine the reasoning that a true positive or false positive was arrived at in the AI Prediction Scan.&lt;br /&gt;
&lt;br /&gt;
*The below data was captured in October of 2025 for reference.&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left; width=50%;&amp;quot;&lt;br /&gt;
! Prediction Type !! Issues Checked !! Tokens Used !! Positive Issues !! Negative Issues !! Input Cost !! Output Cost !! Total Cost&lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction || 96 || 5417 || 48 || 48 || $0.014 || $0.015 || $0.03 &lt;br /&gt;
|-&lt;br /&gt;
| AI Prediction Reason|| TBD || TBD || TBD || TBD || TBD || TBD || TBD&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:IssuesChatgptIcons.png&amp;diff=99461</id>
		<title>File:IssuesChatgptIcons.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:IssuesChatgptIcons.png&amp;diff=99461"/>
		<updated>2025-10-07T18:24:58Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:IssuesAiPredictive.png&amp;diff=99460</id>
		<title>File:IssuesAiPredictive.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:IssuesAiPredictive.png&amp;diff=99460"/>
		<updated>2025-10-07T18:16:06Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: Show API prediction results in issue&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Show API prediction results in issue&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:Chatgpt-GZ-Enable.png&amp;diff=99459</id>
		<title>File:Chatgpt-GZ-Enable.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:Chatgpt-GZ-Enable.png&amp;diff=99459"/>
		<updated>2025-10-07T17:29:14Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: Show configuration for ChatGPT in Globalyzer&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Summary ==&lt;br /&gt;
Show configuration for ChatGPT in Globalyzer&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99455</id>
		<title>Custom Git Data Source Credential</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99455"/>
		<updated>2025-09-26T20:06:29Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Bitbucket / Custom Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bitbucket / Custom Git =&lt;br /&gt;
[Administrator]&lt;br /&gt;
&lt;br /&gt;
For special git repositories, such as Bitbucket, use Custom Git. It provides flexibility for special Git systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitbucket PAT Creation Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitbucket allows PATs to be created at the Project or the Repository level.  In this description the PAT was created at the repository level&lt;br /&gt;
&lt;br /&gt;
* Within the Bitbucket repository, go to Repository Settings -&amp;gt; Access Tokens select Create Repository Access Token &lt;br /&gt;
[[File:BitbucketPATCreationForm.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
* Give the token a name that can be easily identified&lt;br /&gt;
* Select the scopes of Read/Write/Delete&lt;br /&gt;
* Press Create&lt;br /&gt;
&lt;br /&gt;
There should be a new screen that appears showing the newly created PAT and the various ways to leverage it.  Be sure to save the contents of this screen as everything but the email user.email section will no longer be visible once closed.&lt;br /&gt;
&lt;br /&gt;
The sections that are of most importance have been marked in red.  These will be referenced later when filling out the configuration in Command Center.  They are, from top to bottom:&lt;br /&gt;
* Repository access token&lt;br /&gt;
* How to use this token with your Git Repository&lt;br /&gt;
* The git config user.email&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketPATCreationDetails.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Now that the PAT has been created, it can be incorporated into Command Center as follows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create a new Data Source Credential&#039;&#039;&#039;&lt;br /&gt;
* Open the Settings section (Gear Icon) from the Dashboard page&lt;br /&gt;
* Select &amp;quot;Maintenance Mode&amp;quot; (Must be an Administrator to do this) to unlock the Data Source Credentials area&lt;br /&gt;
* Select the Data Source Credentials&lt;br /&gt;
* Select the [[File:CreateIcon.jpg|30px]] (&#039;&#039;&#039;Create new credential&#039;&#039;&#039;) button on the Manage Data Source Credentials page.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select the Custom Git card&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCard.jpg|100px]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Custom Git Connection Form will open&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketGitCredentials.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enter the details for the Custom Git Form&#039;&#039;&#039;&lt;br /&gt;
* Enter a Username.&lt;br /&gt;
** The username will be x-token-auth as provided by Bitbucket as part of the git clone URL when the PAT was initially created.  This can be found in the &amp;quot;How to use this token with your Git Repository&amp;quot; when the PAT was created marked in red in the screenshot prior.&lt;br /&gt;
** Its from here: &#039;&#039;git clone https://&#039;&#039;&#039;x-token-auth&#039;&#039;&#039;:&amp;lt;PAT&amp;gt;@bitbucket.org/&amp;lt;ACCOUNT&amp;gt;/&amp;lt;REPO&amp;gt;.git&#039;&#039;&lt;br /&gt;
* Enter the Personal access token&lt;br /&gt;
** The PAT is the Token itself as provided by Bitbucket in the top text box marked in red in the screenshot prior marked as &amp;quot;Repository Access Token&amp;quot;.  This is the PAT itself.&lt;br /&gt;
* Enter the Commit author - You can put whatever you wish here&lt;br /&gt;
* Enter the Commit email&lt;br /&gt;
** If the Bitbucket provided user.email is input here, when commits occur from Command Center, within Bitbucket commits from Command Center will show as the token name provided when the PAT was created in Bitbucket.  This is the &amp;quot;git config user.email&amp;quot; token marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Git server URL, for example, &#039;&#039;https://bitbucket.org/account/&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCredentialName.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Give the new credential a name&#039;&#039;&#039;&lt;br /&gt;
* The name should be something that is easily identified when applied from a project as the being the correct PAT&lt;br /&gt;
* Assign it to applicable managers&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The system should return to the &#039;&#039;&#039;Manage Data Source Credentials&#039;&#039;&#039; page with &amp;quot;Credential created&amp;quot; note and the new credential should be listed.&lt;br /&gt;
&lt;br /&gt;
At this point, this credential can be added to a project in the same manner as any other source credential.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=LRM_strings_Support&amp;diff=99454</id>
		<title>LRM strings Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=LRM_strings_Support&amp;diff=99454"/>
		<updated>2025-09-26T15:23:37Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Regular Expression */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Example .strings file ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Class = &amp;quot;IBUILabel&amp;quot;; text = &amp;quot;or&amp;quot;; ObjectID = &amp;quot;DTz-P6-Y3D&amp;quot;; */&lt;br /&gt;
&amp;quot;DTz-P6-Y3D.text&amp;quot; = &amp;quot;or&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* Class = &amp;quot;IBUITextField&amp;quot;; placeholder = &amp;quot;Username&amp;quot;; ObjectID = &amp;quot;FiC-Ph-wbo&amp;quot;; */&lt;br /&gt;
&amp;quot;FiC-Ph-wbo.placeholder&amp;quot; = &amp;quot;Username&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* Class = &amp;quot;IBUILabel&amp;quot;; text = &amp;quot;The username or password was incorrect.&amp;quot;; ObjectID = &amp;quot;tDx-oc-GBE&amp;quot;; */&lt;br /&gt;
&amp;quot;tDx-oc-GBE.text&amp;quot; = &amp;quot;The username or \&amp;quot;password\&amp;quot; was incorrect.&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;strings&#039;&#039; parser type ==&lt;br /&gt;
=== valid IOS .strings syntax ===&lt;br /&gt;
Files that use the &#039;&#039;strings&#039;&#039; parser are expected to have valid IOS .strings syntax&lt;br /&gt;
&lt;br /&gt;
=== .strings uses the &#039;&#039;strings&#039;&#039; parser type===&lt;br /&gt;
When defining a project containing LRM Standard .strings resource files, there is no need to define a &#039;&#039;&amp;amp;lt;parser-type&amp;amp;gt;&#039;&#039; as the &#039;&#039;strings&#039;&#039; parser will always be used.&lt;br /&gt;
&lt;br /&gt;
=== unique file extension needs to define &#039;&#039;strings&#039;&#039; parser type ===&lt;br /&gt;
If a unique file extension is a valid .strings file, then the &#039;&#039;&amp;amp;lt;parser-type&amp;amp;gt;&#039;&#039; should be &#039;&#039;strings&#039;&#039; in the project definition file.&lt;br /&gt;
&lt;br /&gt;
== Missed Translations for new files ==&lt;br /&gt;
By default, LRM will &#039;&#039;&#039;ignore&#039;&#039;&#039; missed translations; text that is the same in both the base resource file and the target resource file.&lt;br /&gt;
The exception is for a new IOS file; a file that has never been processed by LRM. Typically, when a new IOS base resource file is created, the subsequent target locale files are also created. This means that the target file exists but contains text of the base locale rather than the target locale. &lt;br /&gt;
In this case, for IOS files, if the file has not been processed by LRM, then any missed translation will be contained in the next prep kit. Once the file has been processed by LRM, any new missed translations will be ignored.&lt;br /&gt;
&lt;br /&gt;
== Regular Expression ==&lt;br /&gt;
&lt;br /&gt;
When working with and IOS resource file .strings format, the default parameter regex setting will be the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%([dsf]|(d$[dsf@])|(.df)|@)|%\{w+\}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will handle most use cases correctly.  However, if the TMS being used is XTM, please consider that XTM will automatically append an integer to the parameters in the returned translations if there currently is not one present in the base resource file.  For details on this, please refer to the section :&lt;br /&gt;
* [[XTM_Cloud#XTM_Special_Instructions_-_parameters_.28e.g._.25d.2C_etc.29]]&lt;br /&gt;
&lt;br /&gt;
As noted in the XTM Cloud Special Instructions, the correct course to handle this is to modify the base resource file so that it has the integers already applied in the parameter(s). At that point the returned translations will be allowed to import without causing a parameter mismatch error due to XTM modifying the parameter automatically.&lt;br /&gt;
&lt;br /&gt;
There is one additional change that should be made to the parameter regex setting in order to pull this all together.  Modify the parameter regex in the project from the default to the below:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(%([dsf]|(\d+\$[dsf@])|(\.\d+f)|@))|%\{\w+\}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This change will take into account the possibility of there being an integer in the parameter as would be added by XTM so that the source and translations containing the XTM parameter with the integer will be correctly identified as a parameter by Localyzer allowing it to correctly validate parameter mismatches.&lt;br /&gt;
&lt;br /&gt;
Failure to make this change after both the base resource and translations have incorporated the additional integer within their respective parameter(s) will result in the inability to detect a legitimate parameter mismatch for these specific parameters as Localyzer will no longer see them as parameters and simply allow them to pass as normal strings.  This results in not having the benefit of parameter mismatch checking for those specific parameters.&lt;br /&gt;
&lt;br /&gt;
== Bad IOS comments don&#039;t cause any errors. Why not?==&lt;br /&gt;
If an IOS file has a comment that is &amp;lt;b&amp;gt;not ended properly&amp;lt;/b&amp;gt;, no error is thrown.&lt;br /&gt;
For example, if a comment doesn&#039;t have an ending &#039;&#039;&#039;*/&#039;&#039;&#039;, such as &#039;&#039;&#039;/*Bad comment&#039;&#039;&#039;, then no errors are found. &lt;br /&gt;
In other words, the file is still parsed correctly even though the comment is missing the ending syntax. Since the file is parsed correctly, LRM is able to find the key/values.&lt;br /&gt;
&lt;br /&gt;
== Command Center Configuration ==&lt;br /&gt;
&amp;lt;TO_DO&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Internal&#039;&#039;&#039; Example of Project Definition for Resources ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This section is for internal checking only, not for Command Center.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The following is an example of strings resource file definitions. See [[Supported_Resource_Bundles#Resource_Extensions| resource extensions]] for more information.&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;resource-extensions&amp;gt;&lt;br /&gt;
    &amp;lt;resource-extension&amp;gt;&lt;br /&gt;
      &#039;&#039;&#039;&amp;amp;lt;!-- parser-type not needed since .strings is a standard LRM extension that maps to the &#039;&#039;strings&#039;&#039; parser type --&amp;amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;extension&amp;gt;strings&amp;lt;/extension&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-name-pattern/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-location-pattern&amp;gt;l_c_v&amp;lt;/file-location-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-location-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-location-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;base-file-encoding&amp;gt;UTF-8&amp;lt;/base-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;localized-file-encoding&amp;gt;UTF-8&amp;lt;/localized-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;parameter-regex-pattern&amp;gt;&amp;lt;![CDATA[(%([dsf]|(\d+\$[dsf@])|(\.\d+f)|@))|%\{\w+\}]]&amp;gt;&amp;lt;/parameter-regex-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
    &amp;lt;/resource-extension&amp;gt;&lt;br /&gt;
    &amp;lt;resource-extension&amp;gt;&lt;br /&gt;
      &#039;&#039;&#039;&#039;&#039;&amp;amp;lt;!-- parser-type is required because .myext is not a standard LRM extension --&amp;amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;extension&amp;gt;&#039;&#039;myext&#039;&#039;&amp;lt;/extension&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&#039;&#039;&amp;lt;parser-type&amp;gt;strings&amp;lt;/parser-type&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-name-pattern/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-location-pattern&amp;gt;l_c_v&amp;lt;/file-location-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-location-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-location-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;base-file-encoding&amp;gt;UTF-8&amp;lt;/base-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;localized-file-encoding&amp;gt;UTF-8&amp;lt;/localized-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;parameter-regex-pattern&amp;gt;&amp;lt;![CDATA[(%([dsf]|(\d+\$[dsf@])|(\.\d+f)|@))|%\{\w+\}]]&amp;gt;&amp;lt;/parameter-regex-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
    &amp;lt;/resource-extension&amp;gt;&lt;br /&gt;
  &amp;lt;/resource-extensions&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=LRM_strings_Support&amp;diff=99453</id>
		<title>LRM strings Support</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=LRM_strings_Support&amp;diff=99453"/>
		<updated>2025-09-26T15:21:51Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Regular Expression */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Example .strings file ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
/* Class = &amp;quot;IBUILabel&amp;quot;; text = &amp;quot;or&amp;quot;; ObjectID = &amp;quot;DTz-P6-Y3D&amp;quot;; */&lt;br /&gt;
&amp;quot;DTz-P6-Y3D.text&amp;quot; = &amp;quot;or&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* Class = &amp;quot;IBUITextField&amp;quot;; placeholder = &amp;quot;Username&amp;quot;; ObjectID = &amp;quot;FiC-Ph-wbo&amp;quot;; */&lt;br /&gt;
&amp;quot;FiC-Ph-wbo.placeholder&amp;quot; = &amp;quot;Username&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
/* Class = &amp;quot;IBUILabel&amp;quot;; text = &amp;quot;The username or password was incorrect.&amp;quot;; ObjectID = &amp;quot;tDx-oc-GBE&amp;quot;; */&lt;br /&gt;
&amp;quot;tDx-oc-GBE.text&amp;quot; = &amp;quot;The username or \&amp;quot;password\&amp;quot; was incorrect.&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;strings&#039;&#039; parser type ==&lt;br /&gt;
=== valid IOS .strings syntax ===&lt;br /&gt;
Files that use the &#039;&#039;strings&#039;&#039; parser are expected to have valid IOS .strings syntax&lt;br /&gt;
&lt;br /&gt;
=== .strings uses the &#039;&#039;strings&#039;&#039; parser type===&lt;br /&gt;
When defining a project containing LRM Standard .strings resource files, there is no need to define a &#039;&#039;&amp;amp;lt;parser-type&amp;amp;gt;&#039;&#039; as the &#039;&#039;strings&#039;&#039; parser will always be used.&lt;br /&gt;
&lt;br /&gt;
=== unique file extension needs to define &#039;&#039;strings&#039;&#039; parser type ===&lt;br /&gt;
If a unique file extension is a valid .strings file, then the &#039;&#039;&amp;amp;lt;parser-type&amp;amp;gt;&#039;&#039; should be &#039;&#039;strings&#039;&#039; in the project definition file.&lt;br /&gt;
&lt;br /&gt;
== Missed Translations for new files ==&lt;br /&gt;
By default, LRM will &#039;&#039;&#039;ignore&#039;&#039;&#039; missed translations; text that is the same in both the base resource file and the target resource file.&lt;br /&gt;
The exception is for a new IOS file; a file that has never been processed by LRM. Typically, when a new IOS base resource file is created, the subsequent target locale files are also created. This means that the target file exists but contains text of the base locale rather than the target locale. &lt;br /&gt;
In this case, for IOS files, if the file has not been processed by LRM, then any missed translation will be contained in the next prep kit. Once the file has been processed by LRM, any new missed translations will be ignored.&lt;br /&gt;
&lt;br /&gt;
== Regular Expression ==&lt;br /&gt;
&lt;br /&gt;
When working with and IOS resource file .strings format, the default parameter regex setting will be the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
%([dsf]|(d$[dsf@])|(.df)|@)|%\{w+\}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will handle most use cases correctly.  However, if the TMS being used is XTM, please consider that XTM will automatically append an integer to the parameters in the returned translations if there currently is not one present in the base resource file.  For details on this, please refer to the section :&lt;br /&gt;
* [[XTM_Cloud#XTM_Special_Instructions_-_parameters_.28e.g._.25d.2C_etc.29]]&lt;br /&gt;
&lt;br /&gt;
As noted in the XTM Cloud Special Instructions, the correct course to handle this is to modify the base resource file so that it has the integers already applied in the parameter(s). At that point the returned translations will be allowed to import without causing a parameter mismatch error due to XTM modifying the parameter automatically.&lt;br /&gt;
&lt;br /&gt;
There is one additional change that should be made to the parameter regex setting in order to pull this all together.  Modify the parameter regex in the project from the default to the below:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
(%([dsf]|(\d+\$[dsf@])|(\.\d+f)|@))|%\{\w+\}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This change will take into account the possibility of there being an integer in the parameter as would be added by XTM so that the source and translations containing the XTM parameter with the integer will be correctly identified as a parameter by Localyzer allowing it to correctly validate parameter mismatches.&lt;br /&gt;
&lt;br /&gt;
Failure to make this change after both the base resource and translations have incorporated the additional integer within their respective parameter(s) will result in a failure to detect a legitimate parameter mismatch for these specific parameters as Localyzer will no longer see them as parameters and simply allow them to pass as normal strings.  This results in not having the benefit of parameter mismatch checking for those specific parameters.&lt;br /&gt;
&lt;br /&gt;
== Bad IOS comments don&#039;t cause any errors. Why not?==&lt;br /&gt;
If an IOS file has a comment that is &amp;lt;b&amp;gt;not ended properly&amp;lt;/b&amp;gt;, no error is thrown.&lt;br /&gt;
For example, if a comment doesn&#039;t have an ending &#039;&#039;&#039;*/&#039;&#039;&#039;, such as &#039;&#039;&#039;/*Bad comment&#039;&#039;&#039;, then no errors are found. &lt;br /&gt;
In other words, the file is still parsed correctly even though the comment is missing the ending syntax. Since the file is parsed correctly, LRM is able to find the key/values.&lt;br /&gt;
&lt;br /&gt;
== Command Center Configuration ==&lt;br /&gt;
&amp;lt;TO_DO&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Internal&#039;&#039;&#039; Example of Project Definition for Resources ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;This section is for internal checking only, not for Command Center.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The following is an example of strings resource file definitions. See [[Supported_Resource_Bundles#Resource_Extensions| resource extensions]] for more information.&lt;br /&gt;
&lt;br /&gt;
   &amp;lt;resource-extensions&amp;gt;&lt;br /&gt;
    &amp;lt;resource-extension&amp;gt;&lt;br /&gt;
      &#039;&#039;&#039;&amp;amp;lt;!-- parser-type not needed since .strings is a standard LRM extension that maps to the &#039;&#039;strings&#039;&#039; parser type --&amp;amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;extension&amp;gt;strings&amp;lt;/extension&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-name-pattern/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-location-pattern&amp;gt;l_c_v&amp;lt;/file-location-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-location-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-location-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;base-file-encoding&amp;gt;UTF-8&amp;lt;/base-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;localized-file-encoding&amp;gt;UTF-8&amp;lt;/localized-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;parameter-regex-pattern&amp;gt;&amp;lt;![CDATA[(%([dsf]|(\d+\$[dsf@])|(\.\d+f)|@))|%\{\w+\}]]&amp;gt;&amp;lt;/parameter-regex-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
    &amp;lt;/resource-extension&amp;gt;&lt;br /&gt;
    &amp;lt;resource-extension&amp;gt;&lt;br /&gt;
      &#039;&#039;&#039;&#039;&#039;&amp;amp;lt;!-- parser-type is required because .myext is not a standard LRM extension --&amp;amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;extension&amp;gt;&#039;&#039;myext&#039;&#039;&amp;lt;/extension&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&#039;&#039;&amp;lt;parser-type&amp;gt;strings&amp;lt;/parser-type&amp;gt;&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-name-pattern/&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;file-location-pattern&amp;gt;l_c_v&amp;lt;/file-location-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;use-location-pattern-on-dflt-locale&amp;gt;1&amp;lt;/use-location-pattern-on-dflt-locale&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;base-file-encoding&amp;gt;UTF-8&amp;lt;/base-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;localized-file-encoding&amp;gt;UTF-8&amp;lt;/localized-file-encoding&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
      &#039;&#039;&#039;&amp;lt;parameter-regex-pattern&amp;gt;&amp;lt;![CDATA[(%([dsf]|(\d+\$[dsf@])|(\.\d+f)|@))|%\{\w+\}]]&amp;gt;&amp;lt;/parameter-regex-pattern&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
    &amp;lt;/resource-extension&amp;gt;&lt;br /&gt;
  &amp;lt;/resource-extensions&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=GitHub_Pull_Requests&amp;diff=99425</id>
		<title>GitHub Pull Requests</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=GitHub_Pull_Requests&amp;diff=99425"/>
		<updated>2025-08-05T15:51:44Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Create The Github Webhook */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= GitHub Pull Requests &amp;amp; Commits Globalyzer Analysis Webhook =&lt;br /&gt;
&lt;br /&gt;
Follow these steps to set up a Webhook to automate Globalyzer&#039;s analysis on your repository&#039;s pull requests and/or commits.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Video Guide:&#039;&#039;&#039; https://vimeo.com/817611647&lt;br /&gt;
&lt;br /&gt;
== Jenkins Set Up ==&lt;br /&gt;
&lt;br /&gt;
=== Install Globalyzer Lite ===&lt;br /&gt;
1. If not done so already, move the root Globalyzer Lite folder to your Jenkins file system. Create a `lingoport` directory at the root of your Jenkins system and place the downloaded globalyzer-lite folder there (e.g., /var/lib/jenkins/lingoport/globalyzer-lite). &#039;&#039;To avoid any errors, please do not modify or move the files in this folder unless specifically directed to do so.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
2. Install Globalyzer Lite on your Jenkins system by following the instructions in the `README.txt` file (located in the globalyzer-lite folder).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Make sure to install Lite as the `jenkins` user!&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You should see the success message &amp;quot;Globalyzer Lite installation completed successfully&amp;quot; before proceeding.&lt;br /&gt;
&lt;br /&gt;
3. You will need to download the Globalyzer.license file from here: https://www.globalyzer.com/gzserver/home/installclient (you may need to log in with your Globalyzer.com credentials). Once downloaded, place the Globalyzer.license file into the `lingoport` directory from step 1.&lt;br /&gt;
&lt;br /&gt;
=== Set Up GitHub Credentials ===&lt;br /&gt;
4. In this folder, you will find the `github.properties` file. Your GitHub credentials will need to be set in this file before proceeding (failure to set these credentials will result in an error).&lt;br /&gt;
&lt;br /&gt;
* For `github.login`, enter your GitHub username. Note this is not your GitHub login email, it is the username as it appears after you sign in.&lt;br /&gt;
* For `github.oauth`, you will need to enter a Personal Access Token created for your GitHub account. To generate an access token:&lt;br /&gt;
** Sign in to GitHub.&lt;br /&gt;
** Select your profile icon on the top right hand side and select &amp;quot;Settings&amp;quot;.&lt;br /&gt;
** Scroll down and select &amp;quot;Developer settings&amp;quot;.&lt;br /&gt;
** Select &amp;quot;Personal access tokens&amp;quot; &amp;gt; &amp;quot;Tokens (classic)&amp;quot;.&lt;br /&gt;
** Select &amp;quot;Generate new token&amp;quot; &amp;gt; &amp;quot;Generate new token (classic)&amp;quot;.&lt;br /&gt;
** Add a note and expiration date as desired.&lt;br /&gt;
** Under &amp;quot;Select scopes&amp;quot;, select &amp;quot;**repo**&amp;quot;.&lt;br /&gt;
** Select &amp;quot;Generate token&amp;quot;.&lt;br /&gt;
** Copy the generated token and paste it into the file. Note that the token will disappear after the window is closed/changed.&lt;br /&gt;
&lt;br /&gt;
=== Create &amp;amp; Configure Jenkins Job ===&lt;br /&gt;
5. On Jenkins, navigate to &amp;quot;Manage Jenkins&amp;quot; &amp;gt; &amp;quot;Configure System&amp;quot; &amp;gt; &amp;quot;Global properties&amp;quot; &amp;gt; select the &amp;quot;Environment variables&amp;quot; box &amp;gt; select &amp;quot;Add&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Under name, enter `GITHUB_PRC_FILES` and for the value, enter the file path to the webhook file directory in the globalyzer-lite folder, for example: `$JENKINS_HOME/lingoport/globalyzer-lite-*.*.*_*.*/GitHub_PRC`&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Note&#039;&#039;&#039;:  Whenever a new version of Lite is downloaded, only this environment variable&#039;s value needs to be changed rather than having to reconfigure every Jenkins job.&lt;br /&gt;
&lt;br /&gt;
6. On Jenkins, select &amp;quot;New Item&amp;quot; and create a new &amp;quot;Freestyle project&amp;quot;. Give it a name, we recommend the format &amp;quot;Team.RepoName-GitHub-COMMAND&amp;quot; where COMMAND could be PullRequest, Commit, or PRC (for both PRs and commits) depending on what you would like to be scanned.&lt;br /&gt;
&lt;br /&gt;
7. Configure the project:&lt;br /&gt;
* &#039;&#039;&#039;General:&#039;&#039;&#039;&lt;br /&gt;
** Check the &amp;quot;This project is parameterized&amp;quot; box. Two **string** parameters are needed for the job to run properly.&lt;br /&gt;
** payload: The first parameter is named `payload` and the default value is `NOT_SET`. This parameter is NOT set by hand. GitHub&#039;s webhooks generate data based on the GitHub event and send the JSON data to Jenkins as the payload parameter. See the [GitHub Page](https://developer.github.com/webhooks/#payloads) for more details.&lt;br /&gt;
** LITE_PROJECT_DEFINITION: The second parameter is named `LITE_PROJECT_DEFINITION` and it&#039;s default value is `DEFAULT`. This parameter is the location of the project definition file that will be used when scanning (such as: $JENKINS_HOME/jobs/$JOB_NAME/workspace/lingoport/LiteProjectDefinition.xml). If DEFAULT, it will use the lingoport/LiteProjectDefinition.xml file from the working branch of the pull request/commit.  We highly recommend setting up concurrent build throttling as well to allow builds to process one at a time. Please refer to the [Throttle Concurrent Builds](#throttle-concurrent-builds) section at the bottom of the page for more details.&lt;br /&gt;
** Source Code Management: You may leave this as &amp;quot;None&amp;quot;. The job will locate the corresponding repo and branch through the webhook&#039;s payload data.&lt;br /&gt;
** Build Triggers:  Check the &amp;quot;Trigger builds remotely (e.g., from scripts)&amp;quot; box. Under &amp;quot;Authentication Token&amp;quot;, enter a token to trigger the build remotely, we recommend `HOOK`. This token will be used to set up the webhook in the following section.&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If your job does not have the &amp;quot;Trigger builds remotely&amp;quot; option, it is likely that your Jenkins user does not have the necessary permissions.&lt;br /&gt;
** Build: Select &amp;quot;Add build step&amp;quot; and select the &amp;quot;Execute shell&amp;quot; option. Under &amp;quot;Command&amp;quot;, enter the code to execute the `job_lite_pr.sh` file and pass `pr_message.html` as an argument. If you haven&#039;t already, configure the `GITHUB_PRC_FILES` environment variable (refer to step 5) before proceeding.&lt;br /&gt;
        bash&lt;br /&gt;
        set +x&lt;br /&gt;
        $GITHUB_PRC_FILES/job_lite_pr.sh $GITHUB_PRC_FILES/pr_message.html&lt;br /&gt;
        &lt;br /&gt;
8. Select &amp;quot;Save&amp;quot; to save the project configuration.&lt;br /&gt;
9. Install jq on the system (if not already done): https://stedolan.github.io/jq/download/. jq is used to process the incoming webhook&#039;s JSON data.&lt;br /&gt;
&lt;br /&gt;
=== Create The Github Webhook ===&lt;br /&gt;
10. Navigate to the repository where the webhook will be created.&lt;br /&gt;
&lt;br /&gt;
11. Select &amp;quot;Settings&amp;quot; &amp;gt; &amp;quot;Webhooks&amp;quot; &amp;gt; &amp;quot;Add webhook&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Note:&#039;&#039;&#039; You will need admin access to the repository to be able to access the settings.&lt;br /&gt;
&lt;br /&gt;
12. Under &amp;quot;Payload URL&amp;quot;, use the following URL to trigger the build remotely: `https://JENKINS_URL/buildByToken/buildWithParameters/build?job=JOB_NAME&amp;amp;token=TOKEN`&lt;br /&gt;
* `JENKINS_URL` is the URL to your Jenkins instance.&lt;br /&gt;
*`JOB_NAME` is the Jenkins job name you entered in step 6.&lt;br /&gt;
*`TOKEN` is the the token you entered in the &amp;quot;Build Triggers&amp;quot; subsection of step 7.&lt;br /&gt;
&lt;br /&gt;
13. Under &amp;quot;Content type&amp;quot;, select `application/x-www-form-urlencoded`.&lt;br /&gt;
&lt;br /&gt;
14. Under &amp;quot;Which events would you like to trigger this webhook?&amp;quot;, select &amp;quot;Let me select individual events&amp;quot; and then check &amp;quot;Pull Requests&amp;quot; and/or &amp;quot;Pushes&amp;quot; depending on if you want Globalyzer to scan pull requests, commits, or both.&lt;br /&gt;
&lt;br /&gt;
15. Ensure that the webhook is set to &amp;quot;Active&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
16. Select &amp;quot;Add webhook&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
17. Navigate to the repository where the webhook was added.&lt;br /&gt;
&lt;br /&gt;
18. Open/update a pull request or perform a commit depending on the option(s) you selected in step 14.&lt;br /&gt;
&lt;br /&gt;
19. Once complete, navigate to the Jenkins job that was created in step 6. If all of the connections were completed correctly, a build should have automatically been started.&lt;br /&gt;
* If the build did not start automatically, navigate to the Github repo and select &amp;quot;Settings&amp;quot; &amp;gt; &amp;quot;Webhooks&amp;quot;. Locate and select the webhook created in the last section and click &amp;quot;Recent Deliveries&amp;quot;. Check for any potential issues that may have prevented the webhook from delivering the payload before trying again. Once you are ready to try again, select &amp;quot;Redeliver&amp;quot; &amp;gt; &amp;quot;Yes, redeliver this payload&amp;quot;.&lt;br /&gt;
** If you see an error that says &amp;quot;We couldn’t deliver this payload: failed to connect to host&amp;quot;, there may be a proxy or firewall issue that is blocking the webhook. See GitHub&#039;s guide to GitHub IP addresses [https://docs.github.com/en/enterprise-cloud@latest/authentication/keeping-your-account-and-data-secure/about-githubs-ip-addresses here], and check with your IT and networking departments to set up access or forwarding of GitHub&#039;s connections before trying again.&lt;br /&gt;
** If you see a 403 error (&amp;quot;No valid crumb was included in the request&amp;quot;), you may need to use a Jenkins API token as an added security measure. From your Jenkins home page, select the user on the top right hand side of the page &amp;gt; select &amp;quot;Configure&amp;quot;. Under API Tokens, select &amp;quot;Add New Token&amp;quot; &amp;gt; enter a name &amp;gt; select &amp;quot;Generate&amp;quot;. Copy the token (note that it will disappear once the page is changed/closed). Navigate to the webhook created in step 16 and modify the URL to include the Jenkins credentials like so: `http://JENKINS_USERNAME:JENKINS_TOKEN@JENKINS_URL/...` (Note the : and @ characters.)&lt;br /&gt;
*** `JENKINS_USERNAME`: The username used to log into Jenkins. Note that this is not the full name of the user.&lt;br /&gt;
*** `JENKINS_TOKEN`: The API token generated from Jenkins.&lt;br /&gt;
** If you see a 404 error, please double check your URL from step 12. If everything looks correct, you may need to use this URL format instead for the GitHub webhook: `https://JENKINS_URL/job/JOB_NAME/buildWithParameters?token=TOKEN`.&lt;br /&gt;
&lt;br /&gt;
20. If the build...&lt;br /&gt;
* &#039;&#039;&#039;Finished Successfully:&#039;&#039;&#039; Navigate to the pull request/commit from step 18 and look at the comments.&lt;br /&gt;
** If everything was set up correctly, you should see a new comment titled &amp;quot;Globalyzer Analysis Summary&amp;quot; with a concise summary of i18n issues detected by Globalyzer Lite. With that, &#039;&#039;&#039;you are done!&#039;&#039;&#039; Future pull requests and/or commits should automatically trigger the corresponding Jenkins job and run the Globalyzer analysis.&lt;br /&gt;
** If a comment was not created on the corresponding pull request/commit, there may be an issue. Navigate to the Jenkins job &amp;gt; select the most recent build &amp;gt; select &amp;quot;Console Output&amp;quot; &amp;gt; locate and fix any errors that may have occurred. If there are no visible errors and the output &amp;quot;Globalyzer Analysis Summary added to {commit/pull-request}&amp;quot; is present but there is no comment, please contact support@lingoport.com for assistance.&lt;br /&gt;
* &#039;&#039;&#039;Failed:&#039;&#039;&#039; Select the most recent build &amp;gt; select &amp;quot;Console Output&amp;quot;. Locate and fix any errors that may have occurred before trying step 18 again.&lt;br /&gt;
** If you see the error &amp;quot;Host key verification failed&amp;quot; or &amp;quot;git@github.com: Permission denied (publickey). fatal: Could not read from remote repository.&amp;quot;, you will need to create an ssh key. If you do not already have a .ssh directory (it may be hidden) on the root of your Jenkins system, create the directory before proceeding.&lt;br /&gt;
*** If you already have a .ssh directory, check if you have a file named `id_rsa.pub`. If so, you may skip this step. If you do not, navigate to the .ssh directory and run the command `ssh-keygen`. It will ask where you want to save the key, it should default to the .ssh directory (enter the path to the Jenkins .ssh directory if not). Enter a passphrase if desired (it will ask you to enter it twice) to proceed. Once the key has been saved, navigate to the .ssh folder and you should see two new files: `id_rsa.pub` and `id_rsa`.&lt;br /&gt;
*** Next, sign in to GitHub &amp;gt; select your profile icon on the top right hand side and select &amp;quot;Settings&amp;quot; &amp;gt; select &amp;quot;SSH and GPG keys&amp;quot; &amp;gt; select &amp;quot;New SSH key&amp;quot;. Enter a title and leave the &amp;quot;Key type&amp;quot; as Authentication Key. For the &amp;quot;Key&amp;quot; field, paste the contents of the `id_rsa.pub` file and select &amp;quot;Add SSH Key&amp;quot;. It is also worth making sure that GitHub is on your list of known hosts. To check, navigate to the .ssh folder on your Jenkins system and view the `known_hosts` file. If github.com is not present in the file (or the file does not exist), you will need to add it either manually with the command: `ssh-keyscan -t rsa github.com &amp;gt;&amp;gt; &amp;lt;PATH_TO_SSH_FOLDER&amp;gt;/.ssh/known_hosts` or by letting ssh do it for you when you run a git command and entering &amp;quot;yes&amp;quot; when prompted. Once complete, try step 18 again.&lt;br /&gt;
** If you see the error &amp;quot;Error: Lite failed,  GlobalyzerLicense: Cannot find license file&amp;quot;, refer to step 3. Ensure that the file is in the `lingoport` directory (the program will attempt to look here: `/var/lib/jenkins/lingoport` for the license file). If your license has expired, please download the license again.&lt;br /&gt;
** If the build finished successfully but you see an error like so: &amp;quot;main ERROR Unable to create file /root/.globalyzer/log/globalyzer.log&amp;quot;, you may have installed Globalyzer Lite as the root user instead of the jenkins user (refer to step 2). To fix this, navigate to your Jenkins file system &amp;gt; locate the Globalyzer Lite folder &amp;gt; locate the `log4j2.xml` file. Modify the LOG_DIR variable like so: `&amp;lt;Property name=&amp;quot;LOG_DIR&amp;quot;&amp;gt;/var/lib/jenkins/.globalyzer/log/globalyzer.log&amp;lt;/Property&amp;gt;`.&lt;br /&gt;
*** If you are using an older version of Lite, you may have a `log4j.properties` file instead. If so, you want to modify the log4j.appender.FILE.File variable like so: `log4j.appender.FILE.File=/var/lib/jenkins/.globalyzer/log/globalyzer.log`.&lt;br /&gt;
*** If you see the error &amp;quot;File /var/lib/jenkins/.globalyzer/log/globalyzer.log exists and is not a directory. Unable to create directory&amp;quot; after this fix, you just need to delete the existing .globalyzer directory from your Jenkins system by running: `rm -rf /var/lib/jenkins/.globalyzer`.&lt;br /&gt;
&lt;br /&gt;
=== Optional Additions ===&lt;br /&gt;
&lt;br /&gt;
==== Throttle Concurrent Builds ====&lt;br /&gt;
- We highly recommend installing the &amp;quot;Throttle Concurrent Builds&amp;quot; plugin: https://plugins.jenkins.io/throttle-concurrents/throttling if not done so already. This allows multiple webhook calls to this job to execute one after the other, rather than all at the same time.&lt;br /&gt;
- After installing the plugin, navigate to the Jenkins job created in step 6 and select &amp;quot;Configure&amp;quot;. Select the &amp;quot;Throttle Concurrent Builds&amp;quot; checkbox. Select the &amp;quot;Throttle this project alone&amp;quot; option and configure the &amp;quot;Maximum Total Concurrent Builds&amp;quot; and &amp;quot;Maximum Concurrent Builds Per Node&amp;quot;, we recommend leaving both values as 1 to allow the job to process each build one at a time.&lt;br /&gt;
&lt;br /&gt;
==== Discard Old Builds ====&lt;br /&gt;
- We also recommend installing the &amp;quot;Discard Old Build&amp;quot; Jenkins plugin: https://plugins.jenkins.io/discard-old-build/ to automatically remove old builds. This plugin is highly configurable and helps to reduce build clutter.&lt;br /&gt;
- After installing the plugin, navigate to the Jenkins job created in step 6 and select &amp;quot;Configure&amp;quot;. Under &amp;quot;Post-build Actions&amp;quot;, select &amp;quot;Add post-build action&amp;quot;, and select &amp;quot;Discard Old Builds&amp;quot;. You can customize how the builds are discarded here (i.e., over a set number of days, keep a max number of builds, etc.).&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Localyzer_Instrumentation&amp;diff=99424</id>
		<title>Localyzer Instrumentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Localyzer_Instrumentation&amp;diff=99424"/>
		<updated>2025-07-17T13:11:05Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* InContext License &amp;amp; Version */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
To begin working with InContext Translation and InContext QA, the Localyzer version and license must be correct.&lt;br /&gt;
&lt;br /&gt;
= InContext License &amp;amp; Version =&lt;br /&gt;
&lt;br /&gt;
In order to use InContext Server, your system must have a valid license. To check the license, navigate to the Settings page&lt;br /&gt;
&lt;br /&gt;
 [[File:InContextLicense.png|center|500px]]&lt;br /&gt;
&lt;br /&gt;
If the system does not have a valid license, please contact &#039;&#039;support @ lingoport dot com&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The version of InContext Server must correspond to the version of Command Center. &lt;br /&gt;
* Command Center 3.1.35&lt;br /&gt;
* InContext Server 2.0.9&lt;br /&gt;
&lt;br /&gt;
= Next Steps =&lt;br /&gt;
To continue installation of InContext for Translation, proceed with [[InContext_Server_Installation| InContext Server Installation]]&lt;br /&gt;
&lt;br /&gt;
To learn more about Localyzer Instrumentation: &lt;br /&gt;
[[LRM_Commands_Reference#Create_Instrumented_files| LRM Instrumentation]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99250</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99250"/>
		<updated>2025-05-15T14:12:17Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using SSH.  This type of connection is not possible via the Custom Git Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
=== Additional Notes ===&lt;br /&gt;
Although this page details the process for Bitbucket, the same technique can be applied to other repositories such as GitLab as well.  The overall process would be the same.&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository Initial Setup ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;NOTE:&amp;lt;/B&amp;gt;  At this point you have a working SSH key for Bitbucket.  It&#039;s important to realize that since this is in a container it will disappear upon reinstall/upgrade of Command Center.  Making a backup of the .ssh directory in the container and having it available offline for the future can help to reduce the effort of recreating this process when this occurs&lt;br /&gt;
&lt;br /&gt;
== Script Additions to GitHub Repository ==&lt;br /&gt;
Add the custom scripts listed below to the repository directory in GitHub that previously created.  Be sure to update the scripts with your custom information as the scripts will not work as written, the details are required.&lt;br /&gt;
* clone.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** REPO - Obtain this path from the repository itself, there is normally a link that can be clicked to copy the path&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pull.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pushfiles.sh&lt;br /&gt;
** No modifications are required in this script.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
Once the scripts have been created and placed into the GitHub repository, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential.  Once the project is created, it should leverage the scripts to perform any operations required on the Bitbucket repo.  Initially it should show the list of resource files that are found when running validation.  That is a good check for the clone.sh and pull.sh scripts.  The pushfiles.sh is used when committing files back into the repository so that could take the form of a returned translation, or even a pseudo-localization file.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99249</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99249"/>
		<updated>2025-05-15T14:10:01Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Background */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using SSH.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
=== Additional Notes ===&lt;br /&gt;
Although this page details the process for Bitbucket, the same technique can be applied to other repositories such as GitLab as well.  The overall process would be the same.&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository Initial Setup ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;NOTE:&amp;lt;/B&amp;gt;  At this point you have a working SSH key for Bitbucket.  It&#039;s important to realize that since this is in a container it will disappear upon reinstall/upgrade of Command Center.  Making a backup of the .ssh directory in the container and having it available offline for the future can help to reduce the effort of recreating this process when this occurs&lt;br /&gt;
&lt;br /&gt;
== Script Additions to GitHub Repository ==&lt;br /&gt;
Add the custom scripts listed below to the repository directory in GitHub that previously created.  Be sure to update the scripts with your custom information as the scripts will not work as written, the details are required.&lt;br /&gt;
* clone.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** REPO - Obtain this path from the repository itself, there is normally a link that can be clicked to copy the path&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pull.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pushfiles.sh&lt;br /&gt;
** No modifications are required in this script.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
Once the scripts have been created and placed into the GitHub repository, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential.  Once the project is created, it should leverage the scripts to perform any operations required on the Bitbucket repo.  Initially it should show the list of resource files that are found when running validation.  That is a good check for the clone.sh and pull.sh scripts.  The pushfiles.sh is used when committing files back into the repository so that could take the form of a returned translation, or even a pseudo-localization file.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_Installation&amp;diff=99222</id>
		<title>Command Center Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_Installation&amp;diff=99222"/>
		<updated>2025-04-17T12:56:33Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Pre-Requisites=&lt;br /&gt;
Before installing or updating Command Center, please verify this section is complete. &lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
=== Basic Deployment Diagram ===&lt;br /&gt;
&lt;br /&gt;
The Lingoport system clones repository either for Globalyzer or Localyzer, or both. Access to the VM with Docker is necessary in order to install the Lingoport products. That may be internal to the customer or on a system hosted and managed by Lingoport. &lt;br /&gt;
&lt;br /&gt;
Furthermore, for Localyzer projects, resource files (files that need translation, not code) is sent to the LSP or the TMS. &lt;br /&gt;
&lt;br /&gt;
[[File:Docker Deployed Command Center.jpg|500px|center]]&lt;br /&gt;
&lt;br /&gt;
* Repositories may be inside or outside a customer&#039;s network&lt;br /&gt;
* &#039;&#039;&#039;Lingoport Command Center System&#039;&#039;&#039; may be inside or outside a customer&#039;s network&lt;br /&gt;
* Translation system, LSP may be inside or outside a customer&#039;s network. &lt;br /&gt;
&lt;br /&gt;
This leads to a number of configurations, all supported by Lingoport, with security enforced either by Lingoport or by the customer in terms of IT, Firewall, access, etc.&lt;br /&gt;
&lt;br /&gt;
=== IT ===&lt;br /&gt;
When &#039;&#039;&#039;Lingoport hosts&#039;&#039;&#039; Command Center access to the repositories and to the LSP/TMS will need to be granted. Lingoport will then be in charge of security which IP addresses have access to what part of the application or the API entry points. &lt;br /&gt;
&lt;br /&gt;
When installing Command Center &#039;&#039;&#039;on premises&#039;&#039;&#039;,  the customer &#039;&#039;&#039;IT&#039;&#039;&#039; group is very important to the successful deployment of the Lingoport applications when installing the suite on site. In particular, the IT group that sets up the Linux system must understand the usage model for the system. &lt;br /&gt;
Lingoport requires a meeting with the parties responsible for setting up and maintaining the host system &amp;lt;b&amp;gt;before&amp;lt;/b&amp;gt; installation can properly begin. The hope is that once the system is setup for installation, minimal IT interaction is necessary.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Preparations must be made with the &#039;&#039;&#039;IT&#039;&#039;&#039; team to ensure that all &#039;&#039;&#039;prerequisites&#039;&#039;&#039; are met before installation.  For new installations, this is the recommended method to use to verify that all the various actors work together well.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
Before installing Command Center, the following needs to be configured:&lt;br /&gt;
* Hardware &lt;br /&gt;
* Linux &lt;br /&gt;
* Docker&lt;br /&gt;
* Firewall&lt;br /&gt;
* Https&lt;br /&gt;
&lt;br /&gt;
The next sections on this page address each one of these points and more.&lt;br /&gt;
&lt;br /&gt;
==Hardware &amp;amp; Software Requirements==&lt;br /&gt;
The following sections describe the hardware and software requirements for Command Center.&lt;br /&gt;
&lt;br /&gt;
Please note that the Globalyzer Server installation is in a different section. &lt;br /&gt;
&lt;br /&gt;
===Hardware Requirements ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width=50%&amp;quot;&lt;br /&gt;
! Element&lt;br /&gt;
! Required&lt;br /&gt;
|-&lt;br /&gt;
! CPU&lt;br /&gt;
| 2 (4 better)&lt;br /&gt;
|-&lt;br /&gt;
! Memory&lt;br /&gt;
| 32 GB&lt;br /&gt;
|-&lt;br /&gt;
! Disk&lt;br /&gt;
| 500 GB&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The [[Terms_and_Definitions#GlobalyzerServer|Globalyzer Server]] may be hosted by Lingoport, reside on another server, or be installed on the same system.  Other Linux and Windows machines may have Globalyzer clients installed.&lt;br /&gt;
&lt;br /&gt;
===Software requirements===&lt;br /&gt;
&lt;br /&gt;
Since this is a Docker installation, most of the containers will be managed by Docker. However, volumes will be mounted on the Linux virtual machine and a database configuration file will reside on the VM: This requires Linux and a Docker installation.&lt;br /&gt;
&lt;br /&gt;
=== Support Browsers and Versions ===&lt;br /&gt;
The following browsers are supported:&lt;br /&gt;
* Chrome: 117+&lt;br /&gt;
* Edge: 117+&lt;br /&gt;
* Firefox: 71+&lt;br /&gt;
&lt;br /&gt;
==Access and Ports / Firewall==&lt;br /&gt;
&lt;br /&gt;
Command Center may need to be accessible by Lingoport and customer personnel to configure jobs, check the console if any problem arise, run jobs if necessary. Command Center needs to be accessible by many customer actors, including development teams, management, and QA, Lingoport, Translation Vendors.&lt;br /&gt;
&lt;br /&gt;
=== Ports ===&lt;br /&gt;
&lt;br /&gt;
===== Internal to company network =====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left; width=50%;&amp;quot;&lt;br /&gt;
!Services!!Ports!!Inbound (session)!!Outbound (session)!!Notes&lt;br /&gt;
|-&lt;br /&gt;
|SSH (for system config/maintenance)|| 22 || Y || N || System configuration and maintenance&lt;br /&gt;
|-&lt;br /&gt;
|Command Center || 8083 (HTTP) and/or 443 (HTTPS) || Y || N || Default 8083 (configurable at install time) HTTPS requires reverse proxy Ex: Apache and Installation of SSL certificate.&lt;br /&gt;
|-&lt;br /&gt;
|[[Terms_and_Definitions#translationvendor|Translation Vendor]] interactions: FTP/FTPS/SFTP (MemoQ, etc.) || 21 (FTP) or 443 (FTPS) or 22 (SFTP - recommended) || (FTP/S only) || Y || FTP/FTPS also require data ports (&amp;gt; 1024). Recommend SFTP if possible.&lt;br /&gt;
|-&lt;br /&gt;
|[[Terms_and_Definitions#translationvendor|Translation Vendor]] interactions: Trados Enterprise, XTM and Memsource || 80 (HTTP) optional. 443 (HTTPS) required. || (Some cases) || Y || May need to be external if XTM/Memsource not installed on premise.&lt;br /&gt;
|-&lt;br /&gt;
|SMTP/SMTPS || 25 or 465 or 587 || N || Y || Depends on corporate mail setup.&lt;br /&gt;
|-&lt;br /&gt;
|Globalyzer Server (Optional) || 80 or 443 || N || Y || Only needed when Globalyzer Server is on premises&lt;br /&gt;
|-&lt;br /&gt;
|Repository Access || 22 (SSH) 443 (HTTPS/S3) 3690 (SVN) 7990 (Bitbucket) 7999 (Bitbucket) 8080 (TFS)  || N || Y || VCS systems can vary, check with particular port(s) being used (Could be external/internal/both) &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== External access ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:left; width=50%;&amp;quot;&lt;br /&gt;
!Services!!Ports!!Inbound!!Outbound!!Notes&lt;br /&gt;
|-&lt;br /&gt;
|Lingoport SSH access || 22 || Y || N || Optional. Recommended for ease of upgrades and maintenance.&lt;br /&gt;
|-&lt;br /&gt;
|RHEL/CentOS/Ubuntu Packages || 80 (Debian)  443 (RHEL) || N || Y || Operating system packages access (Most likely external, but could be managed internally as well)&lt;br /&gt;
|-&lt;br /&gt;
|Globalyzer Server || 80 and 443 || N || Y || Access to Globalyzer Server in Lingoport Cloud for rule sets (Unless using on-premises Globalyzer Server)&lt;br /&gt;
|-&lt;br /&gt;
|hub.docker.com || 80 and 443 || N || Y || Command Center Image location&lt;br /&gt;
|-&lt;br /&gt;
|Repository Access || 22 (SSH) 443 (HTTPS/S3) 3690 (SVN) 7990 (Bitbucket) 7999 (Bitbucket) 8080 (TFS)  || N || Y || VCS systems can vary, check with particular port(s) being used (Could be external/internal/both)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==HTTPS==&lt;br /&gt;
&lt;br /&gt;
HTTPS is recommended but not necessary for the Command Center installation. HTTPS may already be set up or your IT may have a standard on how to set up HTTPS. If that&#039;s the case, go the next section. &lt;br /&gt;
&lt;br /&gt;
Otherwise, follow this link for a suggested HTTPS configuration:&lt;br /&gt;
* [[ HTTPS configuration | HTTPS Configuration ]]&lt;br /&gt;
&lt;br /&gt;
==HTTP/2==&lt;br /&gt;
&lt;br /&gt;
HTTP/2 is recommended but not necessary for the Command Center installation as it will provide a noticeable performance boost when leveraged. HTTP/2 does require HTTPS be used so this will only be possible if the previous HTTPS configuration has already been performed.  &lt;br /&gt;
&lt;br /&gt;
If HTTP/2 support will be added, follow this link for a suggested HTTP/2 configuration:&lt;br /&gt;
* [[ HTTP2 Configuration | HTTP2 Configuration ]]&lt;br /&gt;
&lt;br /&gt;
== Email Sender ==&lt;br /&gt;
Email notifications are sent to a project configured recipients . See [[ Projects_page#Create_a_new_project | Create a new project  ]] after this installation.&lt;br /&gt;
For those notifications to be sent, the following will be configured in the settings. &lt;br /&gt;
&lt;br /&gt;
The following information will then be needed:&lt;br /&gt;
* Host URL &#039;&#039;(like smpt.gmail.com for instance)&#039;&#039;&lt;br /&gt;
* Authorization method &#039;&#039;(SMTP, SMTPS, etc.)&#039;&#039;&lt;br /&gt;
* Sender email address &#039;&#039;(localyzer@customerdomain.com for instance)&#039;&#039;&lt;br /&gt;
* Sender password&lt;br /&gt;
&lt;br /&gt;
== Docker Install==&lt;br /&gt;
Docker is a platform that allows you to easily develop, test, and deploy applications as containers. This section will walk you through the process of installing Docker on a Linux system.&lt;br /&gt;
&lt;br /&gt;
The supported versions of Linux are:&lt;br /&gt;
&lt;br /&gt;
* [[Installing Docker on RedHat Enterprise Linux 8 |RedHat Enterprise Linux 8]]&lt;br /&gt;
* [[Installing Docker on CentOS 7 |CentOS 7]] (EOL June 2024)&lt;br /&gt;
* [[Installing Docker on RedHat Enterprise Linux 7|RedHat Enterprise Linux 7]] (EOL June 2024)&lt;br /&gt;
* [[Oracle Linux 8]]&lt;br /&gt;
* [[Installing Docker on Ubuntu 20.04|Ubuntu 20.04]]&lt;br /&gt;
* [[Installing_Docker_on_Amazon_Linux_2|Amazon Linux 2]]&lt;br /&gt;
&lt;br /&gt;
Other versions of Linux may work correctly, but these are the versions and processes that have been verified.&lt;br /&gt;
&lt;br /&gt;
== Credentials ==&lt;br /&gt;
&lt;br /&gt;
When deploying Command Center, the configuration determines if the user management is done by Command Center itself, via an LDAP, or via SSO (using SAML).&lt;br /&gt;
&lt;br /&gt;
=== Command Center User Database ===&lt;br /&gt;
&lt;br /&gt;
One administration user is configured when Command Center is installed. Contact support (at) lingoport (dot) com in order to get an administration user and password. That user can then create Command Center users. It is strongly recommended to change the first administration password and keep it safe.&lt;br /&gt;
&lt;br /&gt;
=== LDAP ===&lt;br /&gt;
&lt;br /&gt;
* LDAP Connection &lt;br /&gt;
* Management&lt;br /&gt;
&lt;br /&gt;
=== SSO ===&lt;br /&gt;
&lt;br /&gt;
* SSO Connection&lt;br /&gt;
* Management&lt;br /&gt;
&lt;br /&gt;
See: [[Command Center SSO Installation]]&lt;br /&gt;
&lt;br /&gt;
= New Command Center Installation =&lt;br /&gt;
&lt;br /&gt;
==sudo user==&lt;br /&gt;
A user, such as &amp;lt;code&amp;gt;centos&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ec2-user&amp;lt;/code&amp;gt;, with &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; privileges is required as the user under which to install Command Center. &lt;br /&gt;
* Note: This should not be the legacy &amp;lt;code&amp;gt;jenkins&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
==Create the database conf file==&lt;br /&gt;
Use the sudo user home for Docker, such as  /home/centos for CentOS systems and /home/ec2-user for RedHat virtual systems. &lt;br /&gt;
&lt;br /&gt;
The mysql and conf.d folders may need to be created as well.&lt;br /&gt;
 &lt;br /&gt;
 vi /home/&amp;lt;user&amp;gt;/mysql/conf.d/mysql.cnf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[client]&lt;br /&gt;
default-character-set = utf8mb4&lt;br /&gt;
[mysql]&lt;br /&gt;
default-character-set = utf8mb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration == &lt;br /&gt;
Get the installation and update scripts and the install.conf file from the main branch of this public repository:&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Lingoport/CommandCenterConfig &lt;br /&gt;
&lt;br /&gt;
You should have files such as:&lt;br /&gt;
&lt;br /&gt;
    install.conf&lt;br /&gt;
    BackupCommandCenterDatabase.sh&lt;br /&gt;
    InstallCommandCenter.sh&lt;br /&gt;
    UninstallCommandCenter.sh&lt;br /&gt;
    UpdateCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
If you need to install SSO version, the relevant files are:&lt;br /&gt;
&lt;br /&gt;
    install.conf&lt;br /&gt;
    BackupCommandCenterDatabase.sh&lt;br /&gt;
    InstallSSOCommandCenter.sh&lt;br /&gt;
    UninstallCommandCenter.sh&lt;br /&gt;
    UpdateSSOCommandCenter.sh&lt;br /&gt;
    saml_configuration.conf&lt;br /&gt;
&lt;br /&gt;
Copy the above files under your home directory, &#039;&#039;for instance&#039;&#039; &amp;lt;code&amp;gt;&amp;lt;user&amp;gt;/commandCenterInstall&amp;lt;/code&amp;gt; where &amp;lt;user&amp;gt; may be &amp;lt;code&amp;gt;/home/centos&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;/home/ec2-user&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Set up install.conf ===&lt;br /&gt;
&lt;br /&gt;
Unless directed otherwise, change the top part of the &amp;lt;code&amp;gt;install.conf&amp;lt;/code&amp;gt; file. &lt;br /&gt;
&lt;br /&gt;
Set up &amp;lt;code&amp;gt;saml_configuration.conf&amp;lt;/code&amp;gt; if you are going to use SAML&lt;br /&gt;
&lt;br /&gt;
The initial version number will be provided for the first installation. &lt;br /&gt;
&lt;br /&gt;
For updates, &amp;lt;code&amp;gt;command_center_image_version&amp;lt;/code&amp;gt; will be the only parameter to change in the &amp;lt;code&amp;gt;install.conf&amp;lt;/code&amp;gt; file. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Provide the Command Center version&lt;br /&gt;
# For *Regular* Updates, this should be the only parameter to change&lt;br /&gt;
command_center_image_version=113&lt;br /&gt;
&lt;br /&gt;
Make sure to keep a copy of that file in case you overwrite it when updating from the https://github.com/Lingoport/CommandCenterConfig Git repository&lt;br /&gt;
&lt;br /&gt;
#&lt;br /&gt;
# After Install, Updates should not need to change anything below&lt;br /&gt;
# ----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
# The Server URL: &#039;&amp;quot;https://yourserver/command-center&amp;quot;&#039;&lt;br /&gt;
serverURL=&#039;&amp;quot;https://SERVER_DNS_HERE/command-center&amp;quot;&#039;&lt;br /&gt;
&lt;br /&gt;
# Provide the home directory, lingoport/commandcenter/Lingoport_Data&lt;br /&gt;
# folder will be created&lt;br /&gt;
home_directory=/home/centos&lt;br /&gt;
&lt;br /&gt;
# Provide the Command Center server port&lt;br /&gt;
serverPort=8083&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Run InstallCommandCenter.sh==&lt;br /&gt;
&lt;br /&gt;
     chmod +x *.sh&lt;br /&gt;
     sudo ./InstallCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
If you are using sso version installer, run &lt;br /&gt;
&lt;br /&gt;
     chmod +x *.sh&lt;br /&gt;
     sudo ./InstallSSOCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
To check the running container status&lt;br /&gt;
&lt;br /&gt;
    sudo docker ps&lt;br /&gt;
&lt;br /&gt;
=== Re-install Command Center ===&lt;br /&gt;
&lt;br /&gt;
If you need to re-run the &#039;&#039;&#039;InstallCommandCenter.sh&#039;&#039;&#039;h, make sure to run &#039;&#039;&#039;UninstallCommandCenter.sh&#039;&#039;&#039; first to clean your environment.&lt;br /&gt;
* Uninstall Command Center&lt;br /&gt;
&lt;br /&gt;
   sudo ./UninstallCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
* Verify that Command Center and the database is no longer in the list&lt;br /&gt;
   sudo docker ps &lt;br /&gt;
&lt;br /&gt;
* Remove the image to download and install again&lt;br /&gt;
&lt;br /&gt;
   sudo docker image ls&lt;br /&gt;
   sudo docker image rm --force &amp;lt;command center image ID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Start the install again&lt;br /&gt;
&lt;br /&gt;
   sudo ./InstallCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note: Docker image version is not the Command Center version, check latest docker image version at  https://hub.docker.com/repository/docker/lingoport/command-center_dev/general&lt;br /&gt;
&lt;br /&gt;
You should see at least an MySQL and a Command Center container running.&lt;br /&gt;
&lt;br /&gt;
== Note: Database backup  ==&lt;br /&gt;
To backup the database, run the following script:&lt;br /&gt;
&lt;br /&gt;
     chmod +x *.sh&lt;br /&gt;
     sudo ./BackupCommandCenterDatabase.sh&lt;br /&gt;
&lt;br /&gt;
The database backup sql file will be under &#039;&#039;&#039;$home_directory/commandcenter/backup&#039;&#039;&#039; folder, named &#039;&#039;&#039;commandcenter_backup_$current_date.sql&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Right after installation, the backup is not necessary. However, as you configure and on-board projects, you may want to set up a backup strategy.&lt;br /&gt;
To backup the database periodically, schedule to run BackupCommandCenterDatabase.sh on a regular basis, for instance with a Cron service.&lt;br /&gt;
&lt;br /&gt;
== Verify Installation == &lt;br /&gt;
Log in to the URL based on the command-center-config.sh settings, so something like:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;nowiki&amp;gt;https://commandcenter.mycompany.io/command-center&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should now be able to install the licenses and create projects.&lt;br /&gt;
&lt;br /&gt;
The Command Center will initially have one Administrator user &#039;&#039;&#039;CCAdmin&#039;&#039;&#039; with the password &#039;&#039;&#039;please.reset.me&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If the installation is unsuccessful for any reason, do not try to re-install. Instead, uninstall, make any needed changes, and re-install to avoid conflicts. &lt;br /&gt;
&lt;br /&gt;
 sudo ./UninstallCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
= Command Center Update =&lt;br /&gt;
&lt;br /&gt;
== Get latest scripts ==&lt;br /&gt;
Make sure to make a copy of the &#039;&#039;&#039;install.conf&#039;&#039;&#039; file used previously in case it&#039;s overwritten by the git pull / git clone below.&lt;br /&gt;
&lt;br /&gt;
Make sure to update the installation and update scripts and the install.conf file from the main branch of this public repository:&lt;br /&gt;
* https://github.com/Lingoport/CommandCenterConfig&lt;br /&gt;
&lt;br /&gt;
Note: You may need to &amp;lt;code&amp;gt;chmod -x&amp;lt;/code&amp;gt; the scripts under DockerScripts before git pull.&lt;br /&gt;
&lt;br /&gt;
== Backup the database ==&lt;br /&gt;
You don&#039;t have to backup the current version of the database before proceeding to the update to the new version of the system, because the Update script will backup your current database automatically before updating. If you want to do the backup manually, you can use the BackupCommandCenterDatabase.sh script&lt;br /&gt;
&lt;br /&gt;
     chmod +x *.sh&lt;br /&gt;
     sudo ./BackupCommandCenterDatabase.sh&lt;br /&gt;
&lt;br /&gt;
The database backup sql file will be under $home_directory/commandcenter/backup folder, named commandcenter_backup_$current_date.sql&lt;br /&gt;
&lt;br /&gt;
To backup the database periodically, schedule to run &amp;lt;code&amp;gt;BackupCommandCenterDatabase.sh&amp;lt;/code&amp;gt;, for instance with cron services.&lt;br /&gt;
&lt;br /&gt;
=== Note: Restoring the database ===&lt;br /&gt;
&lt;br /&gt;
If later, at some point, the database needs to be restored, the following shows how to do so:&lt;br /&gt;
&lt;br /&gt;
     chmod +x *.sh&lt;br /&gt;
     sudo ./RestoreCommandCenterDatabase.sh YYYY-MM-DD&lt;br /&gt;
&lt;br /&gt;
Check your database backup sql file under &#039;&#039;&#039;$home_directory/commandcenter/backup&#039;&#039;&#039; folder, they are named &#039;&#039;&#039;commandcenter_backup_$current_date.s&#039;&#039;&#039;ql, for example, if you backup the database on 2023 September 20th, you will see a commandcenter_backup_2023-09-20.sql file, and you can use below command to restore it&lt;br /&gt;
&lt;br /&gt;
     sudo ./RestoreCommandCenterDatabase.sh 2023-09-20&lt;br /&gt;
&lt;br /&gt;
== Return to the previous version ==&lt;br /&gt;
&lt;br /&gt;
1. Stop the current active Command Center container&lt;br /&gt;
&lt;br /&gt;
You can use &amp;quot;docker ps&amp;quot; to see all active containers, and use &amp;quot;docker stop CONTAINER ID&amp;quot; to stop your current Command Center container&lt;br /&gt;
&lt;br /&gt;
2. Restart your previous Command Center server version&lt;br /&gt;
&lt;br /&gt;
You can use &amp;quot;docker ps -a&amp;quot; to see all exited containers, and use &amp;quot;docker start CONTAINER ID&amp;quot; to restart your previous version Command Center container&lt;br /&gt;
&lt;br /&gt;
3. Restore the database to match your previous Command Center server version&lt;br /&gt;
&lt;br /&gt;
     sudo ./RestoreCommandCenterDatabase.sh YYYY-MM-DD&lt;br /&gt;
&lt;br /&gt;
==Edit install.conf ==&lt;br /&gt;
&lt;br /&gt;
Change the &#039;&#039;version number&#039;&#039; in the install.conf to get the Command Center image update version.&lt;br /&gt;
&lt;br /&gt;
  command_center_image_version=&amp;lt;new version number&amp;gt;&lt;br /&gt;
&lt;br /&gt;
See full [[Command_Center_Installation#Configuration | Configuration ]] above.&lt;br /&gt;
&lt;br /&gt;
=== Moving from a non SSO to an SSO configuration ===&lt;br /&gt;
&lt;br /&gt;
If you need to update your Command Center from non SSO version to SSO version, you need to have samlpath set up in install.conf file, and idp.xml, sp.xml, saml_configuration.conf and saml-keystore.jks file must be in this directory&lt;br /&gt;
&lt;br /&gt;
  # Provide your saml directory, idp.xml, sp.xml, saml_configuration.conf and saml-keystore.jks file must be in this directory&lt;br /&gt;
  samlpath=&lt;br /&gt;
&lt;br /&gt;
See: [[Command Center SSO Installation]]&lt;br /&gt;
&lt;br /&gt;
==Run UpdateCommandCenter.sh==&lt;br /&gt;
&lt;br /&gt;
     chmod +x UpdateCommandCenter.sh&lt;br /&gt;
     sudo ./UpdateCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
If you are using SSO version installer, run UpdateSSOCommandCenter.sh instead of UpdateCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
If you are updating CommandCenter from non SSO version to SSO version, only run SwitchToSSOCommandCenter.sh &lt;br /&gt;
&lt;br /&gt;
If you are updating CommandCenter from SSO version to non-SSO version, only run SwitchToNonSSOCommandCenter.sh &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To check the running container status&lt;br /&gt;
&lt;br /&gt;
    sudo docker ps&lt;br /&gt;
&lt;br /&gt;
The database backup sql file is in $home_directory/commandcenter/ folder, named commandcenter_backup_$current_date.sql&lt;br /&gt;
&lt;br /&gt;
= Start and Stop System =&lt;br /&gt;
* From Command Center, as an administrator, go to settings and click &#039;Restart&#039;&lt;br /&gt;
* From the VM, use docker commands to stop or start Command Center. For example:&lt;br /&gt;
  &lt;br /&gt;
    sudo docker ps&lt;br /&gt;
    sudo docker stop &amp;lt;hash&amp;gt;&lt;br /&gt;
    sudo docker ps&lt;br /&gt;
    &lt;br /&gt;
    sudo docker container ls -a | grep command&lt;br /&gt;
    sudo docker start &amp;lt;hash&amp;gt;&lt;br /&gt;
    sudo docker ps&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Uninstall =&lt;br /&gt;
&lt;br /&gt;
  sudo ./UninstallCommandCenter.sh&lt;br /&gt;
  Uninstalling the Command Center Servers ...&lt;br /&gt;
&lt;br /&gt;
  sudo docker ps&lt;br /&gt;
  CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES&lt;br /&gt;
&lt;br /&gt;
= FAQ and Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Make sure the Server URL is reachable ==&lt;br /&gt;
Navigate to the server URL set up in &amp;lt;code&amp;gt;install.conf&amp;lt;/code&amp;gt;: is the login screen available?&lt;br /&gt;
&lt;br /&gt;
If it is not, first check that the docker container is up and running. Make sure both &amp;lt;code&amp;gt;lingoport/command-center&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;mysql&amp;lt;/code&amp;gt; are running.&lt;br /&gt;
&lt;br /&gt;
  sudo docker container ls -a &lt;br /&gt;
  CONTAINER ID   IMAGE                         COMMAND                  CREATED      STATUS       PORTS                                       NAMES&lt;br /&gt;
  3d9da7a80e0a   &#039;&#039;&#039;lingoport/command-center&#039;&#039;&#039;:80   &amp;quot;catalina.sh run&amp;quot;        3 days ago   Up 6 hours   0.0.0.0:8081-&amp;gt;8080/tcp, :::8081-&amp;gt;8080/tcp   pedantic_aryabhata&lt;br /&gt;
  683c55907c06   &#039;&#039;&#039;mysql&#039;&#039;&#039;:8.0                     &amp;quot;docker-entrypoint.s…&amp;quot;   3 days ago   Up 6 hours   3306/tcp, 33060/tcp                         quizzical_newton&lt;br /&gt;
&lt;br /&gt;
Check with IT that the DNS for that system is correct.&lt;br /&gt;
&lt;br /&gt;
Check with IT that the firewall allows for reaching the URL from your system.&lt;br /&gt;
&lt;br /&gt;
Ask IT to check the https and the server URL / DNS.&lt;br /&gt;
&lt;br /&gt;
== To check files on disk ==&lt;br /&gt;
To troubleshoot, it may be necessary to check files handled by Docker, such as looking for reports under Lingoport_Data. In that case, first use the Docker PS command to get the container ID of the Command Center application.&lt;br /&gt;
&lt;br /&gt;
  sudo docker container ls -a &lt;br /&gt;
  CONTAINER ID   IMAGE                         COMMAND                  CREATED      STATUS       PORTS                                       NAMES&lt;br /&gt;
  &#039;&#039;&#039;3d9da7a80e0a&#039;&#039;&#039;   &#039;&#039;&#039;lingoport/command-center&#039;&#039;&#039;:80   &amp;quot;catalina.sh run&amp;quot;        3 days ago   Up 6 hours   0.0.0.0:8081-&amp;gt;8080/tcp, :::8081-&amp;gt;8080/tcp   pedantic_aryabhata&lt;br /&gt;
  &lt;br /&gt;
With the container ID, execute the following command to run bash with access to those files:&lt;br /&gt;
&lt;br /&gt;
  sudo docker exec -it &#039;&#039;&#039;3d9da7a80e0a&#039;&#039;&#039; bash&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== How to backup and restore a system ==&lt;br /&gt;
&lt;br /&gt;
If you have a system that you want to install a new version of Command Center, but keep the current configuration, here are the steps to do that. &lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Backup the Command Center databases&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   sudo ./BackupCommandCenterDatabase.sh &lt;br /&gt;
&lt;br /&gt;
This will create two files &amp;lt;code&amp;gt;&amp;lt;home&amp;gt;/commandcenter/backup/commandcenter_backup_YYYY-MM-DD.sql&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;lt;home&amp;gt;/commandcenter/backup/LRM_backup_YYYY-MM-DD.sql&amp;lt;/code&amp;gt; Where YYYY-MM-DD is the current date.&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Stop the currently running Command Center container and its associated MySQL container&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   sudo docker ps&lt;br /&gt;
   sudo docker stop &amp;lt;Command Center Container ID&amp;gt; &amp;lt;MySQL Container ID&amp;gt;&lt;br /&gt;
   sudo docker ps&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Modify the install.conf file for the correct version of Command Center to install&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Install Command Center&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   sudo ./InstallCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
If there is an error about the container in use, remove the container that is identified and attempt the install again.  &lt;br /&gt;
&lt;br /&gt;
   sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
   sudo ./InstallCommandCenter.sh&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Verify that Command Center comes up in the browser.  Login with the CCAdmin user.  There should be no projects or configuration set up&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Restore from the database&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
   sudo ./RestoreCommandCenterDatabase.sh YYYY-MM-DD&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;Verify that Command Center is populated with the correct information&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= Next Steps =&lt;br /&gt;
Command Center is now ready to be used. Proceed to the URL configured in the installation and follow the [[Command_Center_User_Guide | User&#039;s Guide&#039;s]] steps.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=HTTP2_Configuration&amp;diff=99221</id>
		<title>HTTP2 Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=HTTP2_Configuration&amp;diff=99221"/>
		<updated>2025-04-17T12:50:01Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HTTP/2 enablement can be achieved via a reverse proxy hosted on the Linux system. The below instructions assume that the prior configuration instructions for HTTPS have already been carried out.  These instructions will add HTTP2 support to that existing configuration.  It is assumed that this will be on Apache in a CentOS / RHEL environment:&lt;br /&gt;
&lt;br /&gt;
1. Edit the Apache SSL Configuration file, and example is shown below&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/httpd/conf.d/lingoport-apps-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Locate the section that the VirtualHost Directive is defined for SSL and add the six lines from &amp;lt;IfModule&amp;gt; to &amp;lt;/IFModule&amp;gt; inclusive as shown below.  This searches for the http2_module and it if exists will attempt to use HTTP2.  If that fails for some reason it will fallback to HTTP1.1.  If the http2_module doesn&#039;t exist, it will only attempt to use HTTP/1.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName SERVER_URL_REPLACE_ME   # example: myserver.lingoport.io&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;IfModule http2_module&amp;gt;&lt;br /&gt;
        Protocols h2 http/1.1&lt;br /&gt;
    &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
    &amp;lt;IfModule !http2_module&amp;gt;&lt;br /&gt;
        Protocols http/1.1&lt;br /&gt;
    &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    AllowEncodedSlashes NoDecode&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyRequests Off&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Restart Apache to apply the settings&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart httpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4 Validation&lt;br /&gt;
&lt;br /&gt;
One method to confirm that http2 is supported after restarting Apache is via curl.  Simply run a curl command on the command-center site and the returned result will be the version of HTTP supported.  A 2 indicates that that HTTP/2 is supported and the configuration was successful.  If the return was a 1.1, then only version HTTP/1.1 support is provided.  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -sI https://&amp;lt;FQDN&amp;gt;/command-center -o/dev/null -w &#039;%{http_version}\n&#039;&lt;br /&gt;
2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To continue on Command Center installation, please go to:&lt;br /&gt;
* [[Command Center Installation | Command Center Installation ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=HTTP2_Configuration&amp;diff=99220</id>
		<title>HTTP2 Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=HTTP2_Configuration&amp;diff=99220"/>
		<updated>2025-04-17T12:44:21Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: Created page with &amp;quot;HTTP2 enablement can be achieved via a reverse proxy hosted on the Linux system. The below instructions assume that the prior configuration instructions for HTTPS have already...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;HTTP2 enablement can be achieved via a reverse proxy hosted on the Linux system. The below instructions assume that the prior configuration instructions for HTTPS have already been carried out.  These instructions will add HTTP2 support to that existing configuration.  It is assumed that this will be on Apache in a CentOS / RHEL environment:&lt;br /&gt;
&lt;br /&gt;
1. Edit the Apache SSL Configuration file, and example is shown below&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/httpd/conf.d/lingoport-apps-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
2. Locate the section that the VirtualHost Directive is defined.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
&amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
    ServerName SERVER_URL_REPLACE_ME   # example: myserver.lingoport.io&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;IfModule http2_module&amp;gt;&lt;br /&gt;
        Protocols h2 http/1.1&lt;br /&gt;
    &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
    &amp;lt;IfModule !http2_module&amp;gt;&lt;br /&gt;
        Protocols http/1.1&lt;br /&gt;
    &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    AllowEncodedSlashes NoDecode&lt;br /&gt;
    ProxyPreserveHost On&lt;br /&gt;
    ProxyRequests Off&lt;br /&gt;
&lt;br /&gt;
    ...&lt;br /&gt;
&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
3. Restart Apache to apply the settings&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo systemctl restart httpd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
4 Validation&lt;br /&gt;
&lt;br /&gt;
One method to confirm that http2 is supported after restarting Apache is via curl.  Simply run a curl command on the command-center site and the returned result will be the version of HTTP supported.  A 2 indicates that that HTTP/2 is supported and the configuration was successful.  If the return was a 1.1, then only version HTTP/1.1 support is provided.  &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ curl -sI https://&amp;lt;FQDN&amp;gt;/command-center -o/dev/null -w &#039;%{http_version}\n&#039;&lt;br /&gt;
2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To continue on Command Center installation, please go to:&lt;br /&gt;
* [[Command Center Installation | Command Center Installation ]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99195</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99195"/>
		<updated>2025-02-07T20:36:42Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Additional Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
=== Additional Notes ===&lt;br /&gt;
Although this page details the process for Bitbucket, the same technique can be applied to other repositories such as GitLab as well.  The overall process would be the same.&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository Initial Setup ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;NOTE:&amp;lt;/B&amp;gt;  At this point you have a working SSH key for Bitbucket.  It&#039;s important to realize that since this is in a container it will disappear upon reinstall/upgrade of Command Center.  Making a backup of the .ssh directory in the container and having it available offline for the future can help to reduce the effort of recreating this process when this occurs&lt;br /&gt;
&lt;br /&gt;
== Script Additions to GitHub Repository ==&lt;br /&gt;
Add the custom scripts listed below to the repository directory in GitHub that previously created.  Be sure to update the scripts with your custom information as the scripts will not work as written, the details are required.&lt;br /&gt;
* clone.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** REPO - Obtain this path from the repository itself, there is normally a link that can be clicked to copy the path&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pull.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pushfiles.sh&lt;br /&gt;
** No modifications are required in this script.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
Once the scripts have been created and placed into the GitHub repository, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential.  Once the project is created, it should leverage the scripts to perform any operations required on the Bitbucket repo.  Initially it should show the list of resource files that are found when running validation.  That is a good check for the clone.sh and pull.sh scripts.  The pushfiles.sh is used when committing files back into the repository so that could take the form of a returned translation, or even a pseudo-localization file.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99194</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99194"/>
		<updated>2025-02-07T20:35:50Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Process Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
=== Additional Notes ===&lt;br /&gt;
Although this page details the process for Bitbucket, the same technique can be applied to GitLab as well.  The overall process would be the same.&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository Initial Setup ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;NOTE:&amp;lt;/B&amp;gt;  At this point you have a working SSH key for Bitbucket.  It&#039;s important to realize that since this is in a container it will disappear upon reinstall/upgrade of Command Center.  Making a backup of the .ssh directory in the container and having it available offline for the future can help to reduce the effort of recreating this process when this occurs&lt;br /&gt;
&lt;br /&gt;
== Script Additions to GitHub Repository ==&lt;br /&gt;
Add the custom scripts listed below to the repository directory in GitHub that previously created.  Be sure to update the scripts with your custom information as the scripts will not work as written, the details are required.&lt;br /&gt;
* clone.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** REPO - Obtain this path from the repository itself, there is normally a link that can be clicked to copy the path&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pull.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pushfiles.sh&lt;br /&gt;
** No modifications are required in this script.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
Once the scripts have been created and placed into the GitHub repository, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential.  Once the project is created, it should leverage the scripts to perform any operations required on the Bitbucket repo.  Initially it should show the list of resource files that are found when running validation.  That is a good check for the clone.sh and pull.sh scripts.  The pushfiles.sh is used when committing files back into the repository so that could take the form of a returned translation, or even a pseudo-localization file.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99193</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99193"/>
		<updated>2025-02-07T20:33:40Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Connecting Command Center to Bitbucket using SSH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository Initial Setup ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;NOTE:&amp;lt;/B&amp;gt;  At this point you have a working SSH key for Bitbucket.  It&#039;s important to realize that since this is in a container it will disappear upon reinstall/upgrade of Command Center.  Making a backup of the .ssh directory in the container and having it available offline for the future can help to reduce the effort of recreating this process when this occurs&lt;br /&gt;
&lt;br /&gt;
== Script Additions to GitHub Repository ==&lt;br /&gt;
Add the custom scripts listed below to the repository directory in GitHub that previously created.  Be sure to update the scripts with your custom information as the scripts will not work as written, the details are required.&lt;br /&gt;
* clone.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** REPO - Obtain this path from the repository itself, there is normally a link that can be clicked to copy the path&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pull.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pushfiles.sh&lt;br /&gt;
** No modifications are required in this script.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
Once the scripts have been created and placed into the GitHub repository, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential.  Once the project is created, it should leverage the scripts to perform any operations required on the Bitbucket repo.  Initially it should show the list of resource files that are found when running validation.  That is a good check for the clone.sh and pull.sh scripts.  The pushfiles.sh is used when committing files back into the repository so that could take the form of a returned translation, or even a pseudo-localization file.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=System_Files&amp;diff=99189</id>
		<title>System Files</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=System_Files&amp;diff=99189"/>
		<updated>2025-02-04T18:38:53Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Custom Data Source Folder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
System files are used to enhance and customize the behavior of the system. System files are retrieved from data sources, so that they can be versioned, so typically kept in a git repository. When a system file is updated in the data source (typically a git repository), it needs to be &amp;lt;code&amp;gt;Refreshed&amp;lt;/code&amp;gt; in the System File Edit page in order for the new version to be executed. &lt;br /&gt;
&lt;br /&gt;
Examples of System Files can be found under:&lt;br /&gt;
* https://github.com/Lingoport/CommandCenterConfig/tree/main&lt;br /&gt;
&lt;br /&gt;
System files to be executed (so, not XML Parser files or  Globalyzer configuration files) will be invoked as Bash script.&lt;br /&gt;
&lt;br /&gt;
Once a System File is added to Command Center, it can be used via a project setting or as a debug script from Global settings.&lt;br /&gt;
&lt;br /&gt;
[[File:CCSystemFiles.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[File:ManageSystemFiles.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== System File Types==&lt;br /&gt;
&lt;br /&gt;
=== Globalyzer Lite File ===&lt;br /&gt;
&lt;br /&gt;
The Globalyzer Lite File is the Project Definition file that identifies what ruleset will be used for the Globalyzer analysis.  One file can be used by all the Globalyzer projects. The Globalyzer Lite File must be an XML file. &lt;br /&gt;
&lt;br /&gt;
=== Custom Script ===&lt;br /&gt;
&lt;br /&gt;
The Custom Script is used by Globalyzer to modify how the Globalyzer Scanning and reporting is done. The Custom Script should be a .sh file.  &lt;br /&gt;
&lt;br /&gt;
=== Transform Folder ===&lt;br /&gt;
&lt;br /&gt;
The transform folder, used by Localyzer,  contains scripts that modifies the resources from the repository or returning to the repository.  For example, if a TMS does not support a specific extension, the transform script can create an acceptable file to send and change it back upon return. The transform folder must contain the following scripts:&lt;br /&gt;
&lt;br /&gt;
*transform_to_repo.sh&lt;br /&gt;
*transform_from_repo.sh&lt;br /&gt;
*transform_files_list.sh&lt;br /&gt;
&lt;br /&gt;
=== XML Parser File ===&lt;br /&gt;
&lt;br /&gt;
XML Localyzer resource files can be in many forms.  An XML Parser file identifies the form of the XML resource file. &lt;br /&gt;
&lt;br /&gt;
=== Custom Data Source Folder ===&lt;br /&gt;
&lt;br /&gt;
Command Center provides several Data Source options.  Those options may not fit a specific configuration.  A custom data source can be created for an unusual configuration.  The new Custom Data Source will be listed in the options when selecting the data source for a project. Like the transform folder, the custom data source folder requires the following files:&lt;br /&gt;
&lt;br /&gt;
*clone.sh&lt;br /&gt;
*pull.sh&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
For more details on using a Custom Data Source Folder for providing and SSH repository to connect to a Bitbucket repository along with an example see [[ Command_Center_SSH_Bitbucket | Connecting to a Bitbucket Repo with SSH ]]&lt;br /&gt;
&lt;br /&gt;
=== Post Import Script === &lt;br /&gt;
This script are invoked after the import of resources files. For &#039;&#039;example&#039;&#039;, &lt;br /&gt;
* https://github.com/Lingoport/CommandCenterConfig/blob/main/postimport/translated/callwebhook.sh&lt;br /&gt;
&lt;br /&gt;
is used to tell the &amp;lt;code&amp;gt;Translated.com&amp;lt;/code&amp;gt; TMS of the success of failure of the import process. &lt;br /&gt;
&lt;br /&gt;
The following environment variables are available in a post import script:&lt;br /&gt;
&lt;br /&gt;
  LRM_GROUP&lt;br /&gt;
  LRM_PROJECT&lt;br /&gt;
  KIT_VERSION&lt;br /&gt;
  LRM_LOCALE&lt;br /&gt;
  IMPORT_STATUS = &amp;quot;success&amp;quot; or &amp;quot;failure&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Set the Post Import script on a project in the Advanced Settings configuration.&lt;br /&gt;
&lt;br /&gt;
=== Debug Script ===&lt;br /&gt;
&lt;br /&gt;
Command Center provides a way to run debug scripts to determine where things may be going wrong.&lt;br /&gt;
&lt;br /&gt;
= Creating System Files =&lt;br /&gt;
&lt;br /&gt;
Select the [[File:CreateIcon.jpg|30px]] to add a new system file.&lt;br /&gt;
&lt;br /&gt;
== Step 1: Select the data source==&lt;br /&gt;
&lt;br /&gt;
[[File:LiteDatasourcCredential.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Step 2: Choose the repository==&lt;br /&gt;
&lt;br /&gt;
[[File:LiteGitHubRepo.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Step 3: Choose the file type and path==&lt;br /&gt;
&lt;br /&gt;
[[File:SelectFileType.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
== Step 4: Name the system file ==&lt;br /&gt;
&lt;br /&gt;
Finally, name the file and &#039;&#039;&#039;Save&#039;&#039;&#039;.  The user is returned to the System Files page.  The new file will be shown in the appropriate section.  Initially, it will not be associated with a project.  To associate a system file with a project:&lt;br /&gt;
&lt;br /&gt;
# Indicate the file when creating the project&lt;br /&gt;
# Edit the configuration to add. Projects --&amp;gt; &amp;lt;an existing project&amp;gt; --&amp;gt; Project Configuration.&lt;br /&gt;
&lt;br /&gt;
= Editing System Files =&lt;br /&gt;
&lt;br /&gt;
Only an Administrator user can add or edit System Files.  A Manager can view the names of the files, but has no access.  Other users cannot select the System Files card from Settings.&lt;br /&gt;
&lt;br /&gt;
To edit a system file, hover over its entry in &#039;&#039;&#039;Settings -&amp;gt; Manage System Files&#039;&#039;&#039; and select the &#039;&#039;&#039;Edit&#039;&#039;&#039; button that appears.&lt;br /&gt;
&lt;br /&gt;
[[File:EditSystemFile.jpg|700px|center]]&lt;br /&gt;
&lt;br /&gt;
* Select any of the values, modify them, and Save.  If the Repository information does not exist, the system will error.&lt;br /&gt;
* System Files can be deleted, but they cannot be associated with projects.  Edit the projects and remove the references to the file.  Then &#039;&#039;&#039;Delete&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;NOTE:&#039;&#039;&#039; Once a system file has been edited, for example a transform, and it has been pushed into the repo, it is still necessary to press the &amp;quot;Refresh&amp;quot; button on the associated System File page in Command Center.  This action will update the contents of the System File within Command Center so it can be available to all projects that are using it.  Without pressing &amp;quot;Refresh&amp;quot; this update will not occur.&lt;br /&gt;
&lt;br /&gt;
[[Advanced_Settings|Next: Advanced Settings]]&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99188</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99188"/>
		<updated>2025-02-04T15:48:54Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository Initial Setup ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;NOTE:&amp;lt;/B&amp;gt;  At this point you have a working SSH key for Bitbucket.  It&#039;s important to realize that since this is in a container it will disappear upon reinstall/upgrade of Command Center.  Making a backup of the .ssh directory in the container and having it available offline for the future can help to reduce the effort of recreating this process when this occurs&lt;br /&gt;
&lt;br /&gt;
== Script Additions to GitHub Repository ==&lt;br /&gt;
Add the custom scripts listed below to the repository directory in GitHub that previously created.  Be sure to update the scripts with your custom information as the scripts will not work as written, the details are required.&lt;br /&gt;
* clone.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** USER_NAME&lt;br /&gt;
*** REPO&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pull.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pushfiles.sh&lt;br /&gt;
** No modifications are required in this script.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
Once the scripts have been created and placed into the GitHub repository, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential.  Once the project is created, it should leverage the scripts to perform any operations required on the Bitbucket repo.  Initially it should show the list of resource files that are found when running validation.  That is a good check for the clone.sh and pull.sh scripts.  The pushfiles.sh is used when committing files back into the repository so that could take the form of a returned translation, or even a pseudo-localization file.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99187</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99187"/>
		<updated>2025-02-04T15:45:01Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository Initial Setup ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;B&amp;gt;NOTE:&amp;lt;/B&amp;gt;  At this point you have a working SSH key for Bitbucket.  It&#039;s important to realize that since this is in a container it will disappear upon reinstall/upgrade of Command Center.  Making a backup of the .ssh directory in the container and having it available offline for the future can help to reduce the effort of recreating this process when this occurs&lt;br /&gt;
&lt;br /&gt;
== Script Additions to GitHub Repository ==&lt;br /&gt;
Add the custom scripts listed below to the repository directory in GitHub that previously created.  Be sure to update the scripts with your custom information as the scripts will not work as written, the details are required.&lt;br /&gt;
* clone.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** USER_NAME&lt;br /&gt;
*** REPO&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pull.sh&lt;br /&gt;
** Requires the following to be updated&lt;br /&gt;
*** BRANCH_NAME&lt;br /&gt;
* pushfiles.sh&lt;br /&gt;
** No modifications are required in this script.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;&amp;lt;BRANCH_NAME&amp;gt;&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
&lt;br /&gt;
Once the scripts have been created, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential and you should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99186</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99186"/>
		<updated>2025-02-04T15:35:47Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
Return to the Command Center Container to perform a connection test to the desired repository.  You should still be tomcatuser at this point.  If not, switch to tomcatuser as before.  Perform the below activities and then be sure to switch the tomcatuser shell back to nologin.&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
**NOTE:  At this point you have a working SSH key for Bitbucket.  It&#039;s&lt;br /&gt;
important to realize that since this is in a container it will&lt;br /&gt;
disappear upon reinstall/upgrade of Command Center.  Making a backup&lt;br /&gt;
of the .ssh directory and having it available for the future can help&lt;br /&gt;
to reduce the effort of recreating this process when this occurs**&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Procedure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Create a Repo for the required Shell Scripts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*clone.sh&lt;br /&gt;
**USER_NAME&lt;br /&gt;
**REPO&lt;br /&gt;
**BRANCH_NAME&lt;br /&gt;
*pull.sh&lt;br /&gt;
** BRANCH_NAME&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
** No modification needed&lt;br /&gt;
&lt;br /&gt;
Add the contents below to each of the respective files, being sure to&lt;br /&gt;
update the user_name/repo/branch where indicated.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
&lt;br /&gt;
Once the scripts have been created, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential and you should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99185</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99185"/>
		<updated>2025-02-04T15:32:10Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
Copy the public key that was created as it will need to be input into the Bitbucket Cloud Repo for the account that is being leveraged in Bitbucket.  Note this key is applied at the user level and not the repository level.&lt;br /&gt;
&lt;br /&gt;
=== Bitbucket Cloud Repo ===&lt;br /&gt;
&lt;br /&gt;
Log into the Bitbucket Cloud Server as user as the user the key will be applied.  The SSH Key must be added to an account which has write access to the repo.&lt;br /&gt;
* Click on Settings Icon to left of the User Icon&lt;br /&gt;
* Select SSH Keys in the left column&lt;br /&gt;
* Click on Add Key&lt;br /&gt;
* Provide a label as appropriate&lt;br /&gt;
* Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
** In this example it is id_rsa.pub&lt;br /&gt;
* Select Add key and the key should be listed as available&lt;br /&gt;
** Confirm the key has r/w access to the repo as noted in the next section&lt;br /&gt;
&lt;br /&gt;
**You will need reset tomcatuser to /usr/sbin/nologin shell from&lt;br /&gt;
/bin/bash as part of the below actions**&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
**NOTE:  At this point you have a working SSH key for Bitbucket.  It&#039;s&lt;br /&gt;
important to realize that since this is in a container it will&lt;br /&gt;
disappear upon reinstall/upgrade of Command Center.  Making a backup&lt;br /&gt;
of the .ssh directory and having it available for the future can help&lt;br /&gt;
to reduce the effort of recreating this process when this occurs**&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Procedure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Create a Repo for the required Shell Scripts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*clone.sh&lt;br /&gt;
**USER_NAME&lt;br /&gt;
**REPO&lt;br /&gt;
**BRANCH_NAME&lt;br /&gt;
*pull.sh&lt;br /&gt;
** BRANCH_NAME&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
** No modification needed&lt;br /&gt;
&lt;br /&gt;
Add the contents below to each of the respective files, being sure to&lt;br /&gt;
update the user_name/repo/branch where indicated.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
&lt;br /&gt;
Once the scripts have been created, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential and you should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99184</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99184"/>
		<updated>2025-02-04T15:24:22Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
== Process Overview ==&lt;br /&gt;
* Creation of a GitHub repo for storing three custom scripts (Using GitHub as example for this)&lt;br /&gt;
* Creation of a pub/private key in the Command Center Container&lt;br /&gt;
* Adding the public key to Bitbucket Cloud Repository&lt;br /&gt;
* Adding three custom scripts to the GitHub Repo&lt;br /&gt;
* Creating a Custom Data Source in Command Center to access the three scripts&lt;br /&gt;
* Leveraging the Custom Data Source from the desired Command Center Project&lt;br /&gt;
&lt;br /&gt;
== GitHub Repository ==&lt;br /&gt;
Create a new repository in GitHub that will be used for storing the three custom scripts.&lt;br /&gt;
* Create top level directory for storing the scripts&lt;br /&gt;
* This directory will contain the following three scripts as described later in the document.&lt;br /&gt;
** clone.sh&lt;br /&gt;
** pull.sh&lt;br /&gt;
** pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
== Bitbucket Cloud Repository Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Command Center Container ===&lt;br /&gt;
&lt;br /&gt;
The Bitbucket repo requires a public key be added to it that is created in Command Center by the connecting user.  Below is the process for creating the key to be shared with the Bitbucket Cloud Repo.&lt;br /&gt;
* Perform this within the container itself for Command Center&lt;br /&gt;
* Do not add a password to the key pair when prompted&lt;br /&gt;
* The key will be in the tomcatuser home directory so it must be created by the tomcatuser preferably.&lt;br /&gt;
* You will need set tomcatuser to /bin/bash shell from /usr/sbin/nologin as part of the below actions&lt;br /&gt;
&lt;br /&gt;
Follow the below command after logging into the VM and then logging into the Command Center container as the root user.&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
-   Add the key to the Bitbucket Account&lt;br /&gt;
-   This is performed on the Bitbucket Server&lt;br /&gt;
    -   SSH Key must be added to an account which has write access to the&lt;br /&gt;
        repo.&lt;br /&gt;
    -   Click on Settings Icon to left of the User Icon&lt;br /&gt;
    -   Select SSH Keys in the left column&lt;br /&gt;
    -   Click on Add Key&lt;br /&gt;
    -   Provide a label as appropriate&lt;br /&gt;
    -   Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
        -   In this example it is id\_rsa.pub&lt;br /&gt;
    -   Select Add key and the key should be listed as available&lt;br /&gt;
-   Confirm the key has r/w access to the repo&lt;br /&gt;
&lt;br /&gt;
The system doesn&#039;t allow for a shell to be used by tomcatuser, so it&lt;br /&gt;
must temporarily be set to allow this for testing and setting up the&lt;br /&gt;
ssh key.&lt;br /&gt;
&lt;br /&gt;
**You will need reset tomcatuser to /usr/sbin/nologin shell from&lt;br /&gt;
/bin/bash as part of the below actions**&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
**NOTE:  At this point you have a working SSH key for Bitbucket.  It&#039;s&lt;br /&gt;
important to realize that since this is in a container it will&lt;br /&gt;
disappear upon reinstall/upgrade of Command Center.  Making a backup&lt;br /&gt;
of the .ssh directory and having it available for the future can help&lt;br /&gt;
to reduce the effort of recreating this process when this occurs**&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Procedure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Create a Repo for the required Shell Scripts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*clone.sh&lt;br /&gt;
**USER_NAME&lt;br /&gt;
**REPO&lt;br /&gt;
**BRANCH_NAME&lt;br /&gt;
*pull.sh&lt;br /&gt;
** BRANCH_NAME&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
** No modification needed&lt;br /&gt;
&lt;br /&gt;
Add the contents below to each of the respective files, being sure to&lt;br /&gt;
update the user_name/repo/branch where indicated.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
&lt;br /&gt;
Once the scripts have been created, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential and you should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99183</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99183"/>
		<updated>2025-02-04T15:10:39Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Connecting Command Center to Bitbucket using SSH =&lt;br /&gt;
&lt;br /&gt;
== Background ==&lt;br /&gt;
Its  possible to connect Command Center to Bitbucket without using HTTPS, but instead using Bitbucket.  This type of connection is not possible via the standard Bitbucket Connector in the UI as that only supports HTTPS connections.  Follow this procedure to leverage an SSH connection to Bitbucket.&lt;br /&gt;
&lt;br /&gt;
### Github Repo for Storing Scripts&lt;br /&gt;
&lt;br /&gt;
-   Requires a repo to place Data Source Shell Scripts&lt;br /&gt;
    -   Similar in functionality to transforms&lt;br /&gt;
    -   Create top level directory for storing the scripts&lt;br /&gt;
-   This directory will contain the following three scripts as described&lt;br /&gt;
    later in the document.&lt;br /&gt;
    -   clone.sh&lt;br /&gt;
    -   pull.sh&lt;br /&gt;
    -   pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Bitbucket Cloud Repo&lt;br /&gt;
&lt;br /&gt;
-   Need an ssh public key created in the container&lt;br /&gt;
    -   Perform this within the container itself for Command Center&lt;br /&gt;
    -   Do not add a password to the key&lt;br /&gt;
    -   The key will be in the tomcatuser home directory so it must be&lt;br /&gt;
        created by the tomcatuser preferably.&lt;br /&gt;
&lt;br /&gt;
**You will need set tomcatuser to /bin/bash shell from&lt;br /&gt;
/usr/sbin/nologin as part of the below actions**&lt;br /&gt;
&lt;br /&gt;
Here is the output from the command line:&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
-   Add the key to the Bitbucket Account&lt;br /&gt;
-   This is performed on the Bitbucket Server&lt;br /&gt;
    -   SSH Key must be added to an account which has write access to the&lt;br /&gt;
        repo.&lt;br /&gt;
    -   Click on Settings Icon to left of the User Icon&lt;br /&gt;
    -   Select SSH Keys in the left column&lt;br /&gt;
    -   Click on Add Key&lt;br /&gt;
    -   Provide a label as appropriate&lt;br /&gt;
    -   Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
        -   In this example it is id\_rsa.pub&lt;br /&gt;
    -   Select Add key and the key should be listed as available&lt;br /&gt;
-   Confirm the key has r/w access to the repo&lt;br /&gt;
&lt;br /&gt;
The system doesn&#039;t allow for a shell to be used by tomcatuser, so it&lt;br /&gt;
must temporarily be set to allow this for testing and setting up the&lt;br /&gt;
ssh key.&lt;br /&gt;
&lt;br /&gt;
**You will need reset tomcatuser to /usr/sbin/nologin shell from&lt;br /&gt;
/bin/bash as part of the below actions**&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
**NOTE:  At this point you have a working SSH key for Bitbucket.  It&#039;s&lt;br /&gt;
important to realize that since this is in a container it will&lt;br /&gt;
disappear upon reinstall/upgrade of Command Center.  Making a backup&lt;br /&gt;
of the .ssh directory and having it available for the future can help&lt;br /&gt;
to reduce the effort of recreating this process when this occurs**&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Procedure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Create a Repo for the required Shell Scripts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*clone.sh&lt;br /&gt;
**USER_NAME&lt;br /&gt;
**REPO&lt;br /&gt;
**BRANCH_NAME&lt;br /&gt;
*pull.sh&lt;br /&gt;
** BRANCH_NAME&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
** No modification needed&lt;br /&gt;
&lt;br /&gt;
Add the contents below to each of the respective files, being sure to&lt;br /&gt;
update the user_name/repo/branch where indicated.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
&lt;br /&gt;
Once the scripts have been created, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential and you should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99182</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99182"/>
		<updated>2025-02-04T15:07:33Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;## Prerequisites&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Github Repo for Storing Scripts&lt;br /&gt;
&lt;br /&gt;
-   Requires a repo to place Data Source Shell Scripts&lt;br /&gt;
    -   Similar in functionality to transforms&lt;br /&gt;
    -   Create top level directory for storing the scripts&lt;br /&gt;
-   This directory will contain the following three scripts as described&lt;br /&gt;
    later in the document.&lt;br /&gt;
    -   clone.sh&lt;br /&gt;
    -   pull.sh&lt;br /&gt;
    -   pushfiles.sh&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Bitbucket Cloud Repo&lt;br /&gt;
&lt;br /&gt;
-   Need an ssh public key created in the container&lt;br /&gt;
    -   Perform this within the container itself for Command Center&lt;br /&gt;
    -   Do not add a password to the key&lt;br /&gt;
    -   The key will be in the tomcatuser home directory so it must be&lt;br /&gt;
        created by the tomcatuser preferably.&lt;br /&gt;
&lt;br /&gt;
**You will need set tomcatuser to /bin/bash shell from&lt;br /&gt;
/usr/sbin/nologin as part of the below actions**&lt;br /&gt;
&lt;br /&gt;
Here is the output from the command line:&lt;br /&gt;
&lt;br /&gt;
    root@d9dfe772ea55:/usr/local/tomcat# chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/sbin/nologin]: /bin/bash&lt;br /&gt;
    su - tomcatuser&lt;br /&gt;
    ssh-keygen -t rsa -b8192&lt;br /&gt;
    Generating public/private rsa key pair.&lt;br /&gt;
    Enter file in which to save the key (/usr/local/tomcat/.ssh/id_rsa):&lt;br /&gt;
    Creating directory /usr/local/tomcat/.ssh&lt;br /&gt;
    Enter passphrase (empty for no passphrase):&lt;br /&gt;
    Enter same passphrase again:&lt;br /&gt;
    Your identification has been saved in /usr/local/tomcat/.ssh/id_rsa&lt;br /&gt;
    Your public key has been saved in /usr/local/tomcat/.ssh/id_rsa.pub&lt;br /&gt;
    The key fingerprint is:&lt;br /&gt;
    SHA256:NwG7DJtfwj8FsXc6CWnkdzBrivXrs3rn4jkRDdUq5cc tomcatuser@d9dfe772ea55&lt;br /&gt;
    The key&#039;s randomart image is:&lt;br /&gt;
    +---[RSA 8192]----+&lt;br /&gt;
    |        . o o... |&lt;br /&gt;
    |         = +.+. .|&lt;br /&gt;
    |      . . X ==oo |&lt;br /&gt;
    |       * = Xo=+ E|&lt;br /&gt;
    |      o S = *o . |&lt;br /&gt;
    |       . = o.o   |&lt;br /&gt;
    |        . o ..   |&lt;br /&gt;
    |           o=..  |&lt;br /&gt;
    |          .+=B.  |&lt;br /&gt;
    +----[SHA256]-----+&lt;br /&gt;
&lt;br /&gt;
-   Add the key to the Bitbucket Account&lt;br /&gt;
-   This is performed on the Bitbucket Server&lt;br /&gt;
    -   SSH Key must be added to an account which has write access to the&lt;br /&gt;
        repo.&lt;br /&gt;
    -   Click on Settings Icon to left of the User Icon&lt;br /&gt;
    -   Select SSH Keys in the left column&lt;br /&gt;
    -   Click on Add Key&lt;br /&gt;
    -   Provide a label as appropriate&lt;br /&gt;
    -   Paste the public key (Be sure it&#039;s the public key!)&lt;br /&gt;
        -   In this example it is id\_rsa.pub&lt;br /&gt;
    -   Select Add key and the key should be listed as available&lt;br /&gt;
-   Confirm the key has r/w access to the repo&lt;br /&gt;
&lt;br /&gt;
The system doesn&#039;t allow for a shell to be used by tomcatuser, so it&lt;br /&gt;
must temporarily be set to allow this for testing and setting up the&lt;br /&gt;
ssh key.&lt;br /&gt;
&lt;br /&gt;
**You will need reset tomcatuser to /usr/sbin/nologin shell from&lt;br /&gt;
/bin/bash as part of the below actions**&lt;br /&gt;
&lt;br /&gt;
    cd /tmp/&lt;br /&gt;
    git clone git@bitbucket.org:&amp;lt;username&amp;gt;/&amp;lt;repo&amp;gt;.git&lt;br /&gt;
    This key is not known by any other names&lt;br /&gt;
    Are you sure you want to continue connecting (yes/no/[fingerprint])? yes&lt;br /&gt;
    Warning: Permanently added &#039;bitbucket.org&#039; (ED25519) to the list of known hosts.&lt;br /&gt;
    exit (returns you to root user)&lt;br /&gt;
    chsh tomcatuser&lt;br /&gt;
    Changing the login shell for tomcatuser&lt;br /&gt;
    Enter the new value, or press ENTER for the default&lt;br /&gt;
          Login Shell [/bin/bash]: /usr/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
At this point the key has been validated in Bitbucket as working.&lt;br /&gt;
&lt;br /&gt;
**NOTE:  At this point you have a working SSH key for Bitbucket.  It&#039;s&lt;br /&gt;
important to realize that since this is in a container it will&lt;br /&gt;
disappear upon reinstall/upgrade of Command Center.  Making a backup&lt;br /&gt;
of the .ssh directory and having it available for the future can help&lt;br /&gt;
to reduce the effort of recreating this process when this occurs**&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## Procedure&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Create a Repo for the required Shell Scripts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*clone.sh&lt;br /&gt;
**USER_NAME&lt;br /&gt;
**REPO&lt;br /&gt;
**BRANCH_NAME&lt;br /&gt;
*pull.sh&lt;br /&gt;
** BRANCH_NAME&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
** No modification needed&lt;br /&gt;
&lt;br /&gt;
Add the contents below to each of the respective files, being sure to&lt;br /&gt;
update the user_name/repo/branch where indicated.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
&lt;br /&gt;
Once the scripts have been created, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential and you should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99181</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99181"/>
		<updated>2025-02-04T15:06:14Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*clone.sh&lt;br /&gt;
**USER_NAME&lt;br /&gt;
**REPO&lt;br /&gt;
**BRANCH_NAME&lt;br /&gt;
*pull.sh&lt;br /&gt;
** BRANCH_NAME&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
** No modification needed&lt;br /&gt;
&lt;br /&gt;
Add the contents below to each of the respective files, being sure to&lt;br /&gt;
update the user_name/repo/branch where indicated.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Create a new Custom Data Source ==&lt;br /&gt;
&lt;br /&gt;
Once the scripts have been created, make the scripts accessible to Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
* When naming the Custom Data Source consider using a name that will make it easily identifiable as to what repository and branch the Custom Data Source is pointing towards.&lt;br /&gt;
* There will be one Custom Data source created for a single repo/branch used by Command Center&lt;br /&gt;
** If two branches from the same repository are required, there will be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Leveraging the Custom Data Source from Command Center ==&lt;br /&gt;
&lt;br /&gt;
At this point, when the Command Center Project is created, simply select the Custom Data Source as the Data Source Credential and you should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99180</id>
		<title>Command Center SSH Bitbucket</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Command_Center_SSH_Bitbucket&amp;diff=99180"/>
		<updated>2025-02-04T15:04:03Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;*clone.sh&lt;br /&gt;
**USER_NAME&lt;br /&gt;
**REPO&lt;br /&gt;
**BRANCH_NAME&lt;br /&gt;
*pull.sh&lt;br /&gt;
** BRANCH_NAME&lt;br /&gt;
*pushfiles.sh&lt;br /&gt;
** No modification needed&lt;br /&gt;
&lt;br /&gt;
Add the contents below to each of the respective files, being sure to&lt;br /&gt;
update the user_name/repo/branch where indicated.&lt;br /&gt;
&lt;br /&gt;
=== clone.sh ===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the USER_NAME, REPO, BRANCH where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        REPO=&amp;quot;ssh://git@bitbucket.org/&amp;lt;USER_NAME&amp;gt;/&amp;lt;REPO&amp;gt;.git&amp;quot;&lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Clone Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR      = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACES_DIR  = ${WORKSPACES_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     WORKSPACE_NAME  = ${WORKSPACE_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     REPO = ${REPO}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git clone is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git clone &amp;quot;$REPO&amp;quot; &amp;quot;$WORKSPACES_DIR/$WORKSPACE_NAME&amp;quot;&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Clone return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
===pull.sh===&lt;br /&gt;
&lt;br /&gt;
    **Be sure to supply the branch where indicated**&lt;br /&gt;
    &lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        &lt;br /&gt;
        BRANCH=&amp;quot;BRANCH_NAME&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Pull Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR         = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR  = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     BRANCH = ${BRANCH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running git pull is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # For Debugging&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git --git-dir=&amp;quot;$CLIENT_SOURCE_DIR/.git&amp;quot; --work-tree=&amp;quot;$CLIENT_SOURCE_DIR&amp;quot; pull&lt;br /&gt;
        ret=$?&lt;br /&gt;
        echo &amp;quot;Pull return status $ret&amp;quot;&lt;br /&gt;
        if [ $ret -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        # This use case only occurs when a clone was done prior and the branch was different from the desired one&lt;br /&gt;
        cur_branch=&amp;quot;$(git rev-parse --abbrev-ref HEAD)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        if [ &amp;quot;${cur_branch}&amp;quot; != &amp;quot;${BRANCH}&amp;quot; ] ; then&lt;br /&gt;
            echo &amp;quot;Branch was ${cur_branch} so switching to ${BRANCH}&amp;quot;&lt;br /&gt;
            git switch &amp;quot;${BRANCH}&amp;quot;&lt;br /&gt;
        else&lt;br /&gt;
            echo &amp;quot;Branch already at ${cur_branch}, no need to switch &amp;quot;&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
=== pushfiles.sh ===&lt;br /&gt;
&lt;br /&gt;
        #!/bin/bash&lt;br /&gt;
        echo &amp;quot;Using credential: ${CREDENTIAL_NAME}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;==================================================================&amp;quot;&lt;br /&gt;
        echo &amp;quot;CUSTOM_PUSH_FILES (${PUSH_TYPE})&amp;quot;&lt;br /&gt;
        echo &amp;quot;&amp;quot;&lt;br /&gt;
        echo &amp;quot;Custom Push Files Incoming variables:&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CUSTOM_DIR        = ${CUSTOM_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     CLIENT_SOURCE_DIR = ${CLIENT_SOURCE_DIR}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_MESSAGE    = ${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        echo &amp;quot;     IMPORT_LIST_PATH  = ${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        echo &amp;quot;User running pushfiles is $(whoami)&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        # run script&lt;br /&gt;
        cd &amp;quot;${CLIENT_SOURCE_DIR}&amp;quot; || exit 1&lt;br /&gt;
        echo &amp;quot;Files to import to the repo are: &amp;quot;&lt;br /&gt;
        cat &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        while IFS= read -r f; do&lt;br /&gt;
            git add &amp;quot;$f&amp;quot;&lt;br /&gt;
            ret=$?&lt;br /&gt;
            echo &amp;quot;Push add status $ret&amp;quot;&lt;br /&gt;
            if [ $ret -ne 0 ] ; then&lt;br /&gt;
                exit 1&lt;br /&gt;
            fi&lt;br /&gt;
        done &amp;lt; &amp;quot;${IMPORT_LIST_PATH}&amp;quot;&lt;br /&gt;
        git commit -m &amp;quot;${IMPORT_MESSAGE}&amp;quot;&lt;br /&gt;
        GIT_SSH_COMMAND=&amp;quot;ssh&amp;quot; git push &lt;br /&gt;
        ret2=$?&lt;br /&gt;
        echo &amp;quot;Push return status $ret2&amp;quot;&lt;br /&gt;
        if [ $ret2 -ne 0 ] ; then&lt;br /&gt;
           exit 1&lt;br /&gt;
        fi&lt;br /&gt;
        &lt;br /&gt;
        cd ~/ || exit 1&lt;br /&gt;
        &lt;br /&gt;
        exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Create a new Custom Data Source ===&lt;br /&gt;
&lt;br /&gt;
-   Once the scripts have been created, make the scripts accessible to&lt;br /&gt;
    Command Center by adding the directory as a new Custom Data Source&lt;br /&gt;
-   When naming the Custom Data Source consider using a name that will&lt;br /&gt;
    make it easily identifiable as to what repository and branch the&lt;br /&gt;
    Custom Data Source is pointing towards.&lt;br /&gt;
-   There will be one Custom Data source created for a single&lt;br /&gt;
    repo/branch used by Command Center&lt;br /&gt;
    -   If two branches from the same repository are required, there will&lt;br /&gt;
        be two Custom Data Sources Required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Leveraging the Custom Data Source from Command Center ===&lt;br /&gt;
&lt;br /&gt;
-   At this point, when the Command Center Project is created, simply&lt;br /&gt;
    select the Custom Data Source as the Data Source Credential and you&lt;br /&gt;
    should be all set.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Scanning_and_Filtering_FAQ&amp;diff=99179</id>
		<title>Scanning and Filtering FAQ</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Scanning_and_Filtering_FAQ&amp;diff=99179"/>
		<updated>2025-01-30T21:58:23Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;===Can I use Globalyzer to look for issues in my code that have nothing to do with internationalization?===&lt;br /&gt;
&lt;br /&gt;
Yes. In fact this is quite common. One of the added values that our customers use Globalyzer for is as a repository for regular expression searches, which they can name, describe and share among their company’s developers. See [http://www.globalyzer.com/gzserver/help/usersguide/ruleSets.html#whatAreRuleSets Rule Sets] and scroll down to &#039;&#039;&#039;General Pattern Scan Rules&#039;&#039;&#039; for more details.&lt;br /&gt;
&lt;br /&gt;
===Is there support for detecting UI alignment problems?===&lt;br /&gt;
&lt;br /&gt;
This would be handled adding new General Pattern Rules to your Rule Set that detect fixed widths.&lt;br /&gt;
&lt;br /&gt;
===What is the difference between the “Ignore” and “Invalid” Status?===&lt;br /&gt;
&lt;br /&gt;
These status choices can have any meaning, and are just a way to further break up the scan results. That said, we think that the &#039;&#039;&#039;Invalid&#039;&#039;&#039; status should be used in the cases where the scan detection is not correct. For example, say Globalyzer’s Embedded String scan found a detection that wasn’t a UI embedded string (for example, a programmatic string). In this case, you would set the result to the &#039;&#039;&#039;Invalid&#039;&#039;&#039; status. The &#039;&#039;&#039;Ignore&#039;&#039;&#039; status, on the other hand, would be used for embedded strings that do appear in the UI but that you don’t translate, for example, file extensions or program names. The &#039;&#039;&#039;TODO&#039;&#039;&#039; is another status that you could apply to scan results that you want to deal with at a later time. In the case of the Locale-Sensitive Method scan, you could apply the &#039;&#039;&#039;Ignore&#039;&#039;&#039; status to results where the method usage is not an issue and use the &#039;&#039;&#039;TODO&#039;&#039;&#039; status if you want to look at the method later.&lt;br /&gt;
&lt;br /&gt;
===How does Globalyzer determine whether or not an embedded string is an internationalization issue?===&lt;br /&gt;
&lt;br /&gt;
During the Embedded String scanning process, Globalyzer will detect all strings in the source code. Then, the Globalyzer filters are used to eliminate the programmatic strings, or strings that would not require translation. So, the scanning work is primarily in filtering out strings, rather than in detecting them.&lt;br /&gt;
&lt;br /&gt;
=== How are i18n issue priorities set? ===&lt;br /&gt;
&lt;br /&gt;
Each active issue has a priority. The priority ranges between 1 and 5, 1 being the highest - i.e. the most likely to be an internationalization issue. In addition, Strings can be marked as &#039;Concatenated&#039;, or priority 0. For Locale-Sensitive Methods, Static File References, and General Patterns, the priority is configured in the detection rules of the rule set. For Embedded Strings, priorities can be configured in retention rules, such as String Content Patterns, String Method Patterns, and String Variable Patterns. &lt;br /&gt;
&lt;br /&gt;
If a string is detected by these rules, the configured priority is assigned to the issue. If not, Globalyzer assigns a priority based on the content of the string. For example, a string containing words found in the dictionary will get a higher priority (more likely to be displayed to the end user and therefore more likely to require externalization) than one with words not found in the dictionary. Other considerations for assigning priorities to Embedded Strings include capitalization and punctuation found in the string. Priorities help focus efforts on the most important active issues.&lt;br /&gt;
&lt;br /&gt;
==== String Priorities ====&lt;br /&gt;
&lt;br /&gt;
For strings, here is the algorithm we use to determine priority:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Priority: 0 / Concatenation&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Any string which is not filtered and is concatenated is marked as 0/Concatenated. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Priority 1:&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if dictionary filtering is ON: &lt;br /&gt;
&lt;br /&gt;
Note: Dictionary filtering is turned on by default (see Window-&amp;gt;Preferences-&amp;gt;Globalyzer in the Globalyzer Workbench). &amp;lt;br&amp;gt;&lt;br /&gt;
Note: Globalyzer comes with its own dictionary. To add words to the dictionary, create a Company dictionary that is used in addition to the Globalyzer dictionary. See [[Scanning_and_Filtering_FAQ#How_can_I_add_words_to_the_dictionary_used_when_scanning.3F | How can I add words to the dictionary used when scanning?]] below for more information.&lt;br /&gt;
&lt;br /&gt;
    all words found in dictionary (one or more words)&lt;br /&gt;
    and first word character is uppercase (and second character of first word is not uppercase) &lt;br /&gt;
    and string doesn&#039;t contain non word characters (that is, string only contains letters, numbers, and/or white space)&lt;br /&gt;
&lt;br /&gt;
* if dictionary filter is OFF: &lt;br /&gt;
&lt;br /&gt;
    first word character is upper case (and second character of first word is lowercase) &lt;br /&gt;
    and string doesn&#039;t contain non word characters&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Priority 2 (not Priority 1 and):&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if dictionary filtering is ON: &lt;br /&gt;
&lt;br /&gt;
    all words found in dictionary &lt;br /&gt;
    and first word character is lowercase (i.e. first letter is lowercase) &lt;br /&gt;
    and number of words is 2 or more &lt;br /&gt;
    and string doesn&#039;t contain non word characters&lt;br /&gt;
&lt;br /&gt;
    OR&lt;br /&gt;
&lt;br /&gt;
    all words found in dictionary &lt;br /&gt;
    and first word character is uppercase (and second character of first word is lowercase) &lt;br /&gt;
    and string contains non word characters&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* if dictionary filter is OFF: &lt;br /&gt;
&lt;br /&gt;
    first word character is lowercase (i.e. first letter is lowercase) &lt;br /&gt;
    and number of words is &amp;gt;= 2 &lt;br /&gt;
    and string doesn&#039;t contain non word characters&lt;br /&gt;
&lt;br /&gt;
    OR&lt;br /&gt;
&lt;br /&gt;
    first word character is uppercase (and second character of first word is lowercase) &lt;br /&gt;
    and string contains non word characters&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Priority 3 (not Priority 1, 2 and):&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if dictionary filtering is ON: &lt;br /&gt;
&lt;br /&gt;
    all words found in dictionary (including one word phrase) &lt;br /&gt;
    and first word character is lower case (i.e. first letter is lowercase) &lt;br /&gt;
    and string contains non word characters&lt;br /&gt;
&lt;br /&gt;
* if dictionary filtering is OFF: &lt;br /&gt;
&lt;br /&gt;
    first word character is lower case (i.e. first letter is lowercase) &lt;br /&gt;
    and string contains non word characters&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Priority 4 (not Priority 1, 2, 3 and):&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if dictionary filter is ON: &lt;br /&gt;
&lt;br /&gt;
    at least one word found in dictionary&lt;br /&gt;
    and number of words is 2 or more&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Priority 5: not Priority 1, 2, 3, 4&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Locale-Sensitive Methods Priorities====&lt;br /&gt;
&lt;br /&gt;
For Locale-Sensitive Methods, General Patterns, and Static File References, our general approach is to assign it a priority 1 if the application could break if the i18n issue isn&#039;t addressed. For example, an encoding issue where you would see character corruption. We also assign priority 1 to methods that are likely to have an i18n issue, such as date/time/number formatting methods. We assign as priority 2 or 3 issues which could be addressed later, such a sorting or font issues. These priorities are defaults which can be modified in the rule set.&lt;br /&gt;
&lt;br /&gt;
===How should I filter false positive issues?=== &lt;br /&gt;
&lt;br /&gt;
See [[False Positives | False Positives]]&lt;br /&gt;
&lt;br /&gt;
Two of Globalyzer&#039;s main benefits are first in detecting possible internationalization (i18n) issues, and then in helping you hone down that list to only issues that will actually need code modifications to fix. There are three approaches that Globalyzer provides to address false positive issues in your Scan Results:&lt;br /&gt;
&lt;br /&gt;
1. Add filter rules to your Rule Set so that the next time you scan, Globalyzer will filter out those false positive detections. Since Rule Sets can be shared among team members and applied to any source code, this is a way to make a large scale effect with little effort and is our first recommendation for filtering Scan Results.&lt;br /&gt;
&lt;br /&gt;
2. Change the Scan Results Status of false positive issues to be &#039;&#039;&#039;Invalid&#039;&#039;&#039; or &#039;&#039;&#039;Ignore&#039;&#039;&#039;. The Status settings are stored with the scanning results in Globalyzer&#039;s Client database on your local machine, so as long as you don&#039;t delete your scan results or modify the source code file significantly, the Status settings will be maintained during subsequent scans. We recommend this approach when there are specific results that you need to filter that don&#039;t lend themselves to Rule Set filters, and when developers prefer that you do not modify source code.&lt;br /&gt;
&lt;br /&gt;
3. The last approach is to use one of the &#039;&#039;&#039;Ignore Comment&#039;&#039;&#039; options, which modifies the source code, and so is the most permanent resolution. Regardless whether a Rule Set filter is modified or Scan Results are deleted, or the source code file is significantly modified, Globalyzer will detect the ignore comment in the source code and skip over one or more lines of code that contain false positive i18n issues.&lt;br /&gt;
&lt;br /&gt;
In addition, Globalyzer&#039;s Dictionary, enabled by default in the &#039;&#039;&#039;Window-&amp;gt;Preferences-&amp;gt;Globalyzer&#039;&#039;&#039; page, helps to filter and prioritize the Embedded Strings that are detected. For example, strings will be filtered if there are no matching Dictionary words. Conversely, depending on the number of matching versus non-matching words as well as other applied heuristics, Globalyzer will set the priority of each Scan Result, which aids in determining which strings will most likely be translatable strings.&lt;br /&gt;
&lt;br /&gt;
===Can you tell me more about inserting comments in my source code so that Globalyzer does not detect programmatic strings?===&lt;br /&gt;
&lt;br /&gt;
The following comments can be used to tell Globalyzer some issues are not to be detected:&lt;br /&gt;
&lt;br /&gt;
1. Use Eclipse style comments: select the rows that you want to ignore in the Scan Results table; Then right-click and choose &#039;&#039;&#039;Ignore this Issue&#039;&#039;&#039;. Globalyzer will insert comments of the form $NON-NLS-[n]$ at the end of the line, where &amp;quot;n&amp;quot; refers to the nth issue on the line. For example, if there were 2 embedded strings on the line that you wanted to ignore, Globalyzer would insert: $NON-NLS-1$ $NON-NLS-2$ for the two times that you chose &#039;&#039;&#039;Ignore this Issue&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
4. Ignore &#039;&#039;&#039;all&#039;&#039;&#039; the issues on a line, choose &#039;&#039;&#039;Ignore this Line&#039;&#039;&#039;. Globalyzer will insert comments with $NON-NLS-L$ comments at the end of the line. Subsequent scans will ignore the lines with $NON-NLS-L$ comments. &lt;br /&gt;
&lt;br /&gt;
1. Insert a comment in the source code that indicates the next line does not require scanning. The comment itself is customizable in Globalyzer&#039;s project properties setting. By default it is GLOBALYZER_IGNORE_NEXT_LINE.&lt;br /&gt;
&lt;br /&gt;
2. Skip scanning a block of code by using a comment to start and a comment to end the &amp;quot;skipped block&amp;quot;. These comment commands are also customizable. By default, the keywords are: GLOBALYZER_START_IGNORE and GLOBALYZER_END_IGNORE.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note&#039;&#039;&#039;: Globalyzer Workbench also has a way to ignore issues without modifying the source – using the Status setting in the Scan Results view. A Status on the Workbench is local to that Workbench instance. It is no seen by Lite for instance. To move the Status to the Dashboard, use the Dashboard False Positive Workbench function (See [[False Positives | False Positives]] ). As long as the files don’t change too much, the Status will keep track of the issues. If you want to share your Status settings with other team members, you may choose to&lt;br /&gt;
* export your Globalyzer Project (with Scan Results checked): they will need to import the project. You will also need to make sure that the Globalyzer Server Rule Sets used by the project are set to &#039;&#039;&#039;shared&#039;&#039;&#039; so that they&#039;re available to the entire team.&lt;br /&gt;
* Use Dashboard False Positives to centralize all False Positives on the Dashboard. See the False Positives Synchronization section in the [[False Positives|False Positives]] page.&lt;br /&gt;
&lt;br /&gt;
=== Could you provide some sense of  scanning performance? ===&lt;br /&gt;
Performance will depend on the machine running the scans. Lingoport performance tests are geared towards a Continuous Globalization process where a Jenkins type system executes scanning jobs. &lt;br /&gt;
The following gives a performance benchmark for a specific machines on the two major operations when running in a Continuous Globalyzer:&lt;br /&gt;
* Login in&lt;br /&gt;
* Running the scans, with or without rule sets reload&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Benchmark System Info:&lt;br /&gt;
   Operating System Name: Windows 8.1&lt;br /&gt;
   Operating System Type: amd64&lt;br /&gt;
   Operating System Version: 6.3&lt;br /&gt;
   Processor Identifier: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel&lt;br /&gt;
   Number of Processors: 4&lt;br /&gt;
   Available processors (cores): 4&lt;br /&gt;
   Free memory (bytes): 79497416&lt;br /&gt;
   Maximum memory (bytes): 1407713280&lt;br /&gt;
   Total memory (bytes): 94896128&lt;br /&gt;
   Number of Rule Sets: 10&lt;br /&gt;
&lt;br /&gt;
Login Benchmark: 559 milliseconds&lt;br /&gt;
Login Benchmark: 324 milliseconds&lt;br /&gt;
Login Benchmark: 336 milliseconds&lt;br /&gt;
Login Benchmark: 313 milliseconds&lt;br /&gt;
Login Benchmark: 307 milliseconds&lt;br /&gt;
Login Benchmark: 306 milliseconds&lt;br /&gt;
Login Benchmark: 313 milliseconds&lt;br /&gt;
Login Benchmark: 300 milliseconds&lt;br /&gt;
Login Benchmark: 303 milliseconds&lt;br /&gt;
Login Benchmark: 290 milliseconds&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Execute Java Scan Benchmark (927 lines of code, 9 files, 190 active results):&lt;br /&gt;
Reloaded rule sets&lt;br /&gt;
Executing java scan: 2073 milliseconds&lt;br /&gt;
Executing java scan: 746 milliseconds&lt;br /&gt;
Executing java scan: 557 milliseconds&lt;br /&gt;
Executing java scan: 553 milliseconds&lt;br /&gt;
Executing java scan: 533 milliseconds&lt;br /&gt;
Executing java scan: 541 milliseconds&lt;br /&gt;
Executing java scan: 520 milliseconds&lt;br /&gt;
Executing java scan: 513 milliseconds&lt;br /&gt;
Executing java scan: 524 milliseconds&lt;br /&gt;
Executing java scan: 516 milliseconds&lt;br /&gt;
Reloaded rule sets&lt;br /&gt;
Executing java scan: 652 milliseconds&lt;br /&gt;
Executing java scan: 574 milliseconds&lt;br /&gt;
Executing java scan: 526 milliseconds&lt;br /&gt;
Executing java scan: 493 milliseconds&lt;br /&gt;
Executing java scan: 488 milliseconds&lt;br /&gt;
Executing java scan: 499 milliseconds&lt;br /&gt;
Executing java scan: 486 milliseconds&lt;br /&gt;
Executing java scan: 481 milliseconds&lt;br /&gt;
Executing java scan: 475 milliseconds&lt;br /&gt;
Executing java scan: 470 milliseconds&lt;br /&gt;
Reloaded rule sets&lt;br /&gt;
Executing java scan: 611 milliseconds&lt;br /&gt;
Executing java scan: 478 milliseconds&lt;br /&gt;
Executing java scan: 465 milliseconds&lt;br /&gt;
Executing java scan: 472 milliseconds&lt;br /&gt;
Executing java scan: 464 milliseconds&lt;br /&gt;
Executing java scan: 483 milliseconds&lt;br /&gt;
Executing java scan: 469 milliseconds&lt;br /&gt;
Executing java scan: 455 milliseconds&lt;br /&gt;
Executing java scan: 459 milliseconds&lt;br /&gt;
Executing java scan: 459 milliseconds&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== How can I scan code written in programming languages Globalyzer does not support out of the box?===&lt;br /&gt;
Globalyzer provides a set of internationalization rules in support of the main programming languages. In case your code is written in a language that is not part of the out of the box rules, you can do the following:&lt;br /&gt;
* Call Lingoport to include a new set of rules for you: This may or may not be a consulting effort by Lingoport&lt;br /&gt;
* Find a supported programming language whose constructs are close to your own and create your own rule set. To do so, please visit the [[Scanning_Unsupported_Languages | Scanning Unsupported Languages ]] page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== How can I add words to the dictionary used when scanning?===&lt;br /&gt;
If the preference &amp;lt;b&amp;gt;Filter Strings without Dictionary Words&amp;lt;/b&amp;gt; is checked (see Window-&amp;gt;Preferences-&amp;gt;Globalyzer), Globalyzer will automatically filter strings that&lt;br /&gt;
contain no dictionary words. That is, the string itself is parsed into words, and if none of the words are found in the dictionary, the string is filtered. If at least one of the words is found in the dictionary, the string is potentially active. &lt;br /&gt;
&lt;br /&gt;
The dictionary is maintained by Lingoport. If there are words you would like added to the dictionary, you can create a Company Dictionary on the Globalyzer Server and add words to that. There is one Company Dictionary per company, so all users in the company will see the same dictionary. &lt;br /&gt;
&lt;br /&gt;
To add words to the Company Dictionary, download the dictionary file from the Globalyzer Server, modify the file locally (one word per line), and then upload the dictionary file to the Server. &lt;br /&gt;
&lt;br /&gt;
To use your Company Dictionary for scanning, download the dictionary file from the Server and place in your Lingoport directory (C:\Lingoport on Windows, $HOME/lingoport on Linux, and /Applications/Lingoport on Mac). When scanning, Globalyzer will consider words in both the Lingoport Dictionary and your Company Dictionary.&lt;br /&gt;
&lt;br /&gt;
=== Are there any heuristics that can be applied to the priorities and how to set them? ===&lt;br /&gt;
In cases where a there are a large number of results being returned one approach is to try using C and P1 only initially and see if that makes it easier to find and correct the higher priority items. Adjust the sensitivity based upon what is being seen in the detection output.  Once those have been addressed its possible to make additional passes including P2-P5 enabled to look for the lower priority items.  In general when enabling the P2-P5, there may be an increase of false positives due to the sensitivity being increased, however eliminating them in entirety can mean that true positives could be missed.  That is why the stepped approach has proven effective in many cases.  Correct the &amp;quot;low hanging fruit&amp;quot; initially and then go back and dig for the harder to identify items.&lt;br /&gt;
&lt;br /&gt;
Globalyzer identifies items that that look suspect but ultimately it will be up to the developer in some cases to determine if its really an issue based upon their knowledge and the context in the code.  As you get closer to P5 the developer input will increase as the detection is getting more sensitive.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99075</id>
		<title>Custom Git Data Source Credential</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99075"/>
		<updated>2025-01-07T18:23:00Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Bitbucket / Custom Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bitbucket / Custom Git =&lt;br /&gt;
[Administrator]&lt;br /&gt;
&lt;br /&gt;
For special git repositories, such as Bitbucket, use Custom Git. It provides flexibility for special Git systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitbucket PAT Creation Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitbucket allows PATs to be created at the Project or the Repository level.  In this description the PAT was created at the repository level&lt;br /&gt;
&lt;br /&gt;
* Within the Bitbucket repository, go to Repository Settings -&amp;gt; Access Tokens select Create Repository Access Token &lt;br /&gt;
[[File:BitbucketPATCreationForm.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
* Give the token a name that can be easily identified&lt;br /&gt;
* Select the scopes of Read/Write/Delete&lt;br /&gt;
* Press Create&lt;br /&gt;
&lt;br /&gt;
There should be a new screen that appears showing the newly created PAT and the various ways to leverage it.  Be sure to save the contents of this screen as everything but the email user.email section will no longer be visible once closed.&lt;br /&gt;
&lt;br /&gt;
The sections that are of most importance have been marked in red.  These will be referenced later when filling out the configuration in Command Center.  They are, from top to bottom:&lt;br /&gt;
* Repository access token&lt;br /&gt;
* How to use this token with your Git Repository&lt;br /&gt;
* The git config user.email&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketPATCreationDetails.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Now that the PAT has been created, it can be incorporated into Command Center as follows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create a new Data Source Credential&#039;&#039;&#039;&lt;br /&gt;
* Open the Settings section (Gear Icon) from the Dashboard page&lt;br /&gt;
* Select &amp;quot;Maintenance Mode&amp;quot; (Must be an Administrator to do this) to unlock the Data Source Credentials area&lt;br /&gt;
* Select the Data Source Credentials&lt;br /&gt;
* Selecti the [[File:CreateIcon.jpg|30px]] (&#039;&#039;&#039;Create new credential&#039;&#039;&#039;) button on the Manage Data Source Credentials page.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select the Custom Git card&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCard.jpg|100px]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Custom Git Connection Form will open&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketGitCredentials.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enter the details for the Custom Git Form&#039;&#039;&#039;&lt;br /&gt;
* Enter a Username.&lt;br /&gt;
** The username will be x-token-auth as provided by Bitbucket as part of the git clone URL when the PAT was initially created.  This can be found in the &amp;quot;How to use this token with your Git Repository&amp;quot; when the PAT was created marked in red in the screenshot prior.&lt;br /&gt;
** Its from here: &#039;&#039;git clone https://&#039;&#039;&#039;x-token-auth&#039;&#039;&#039;:&amp;lt;PAT&amp;gt;@bitbucket.org/&amp;lt;ACCOUNT&amp;gt;/&amp;lt;REPO&amp;gt;.git&#039;&#039;&lt;br /&gt;
* Enter the Personal access token&lt;br /&gt;
** The PAT is the Token itself as provided by Bitbucket in the top text box marked in red in the screenshot prior marked as &amp;quot;Repository Access Token&amp;quot;.  This is the PAT itself.&lt;br /&gt;
* Enter the Commit author - You can put whatever you wish here&lt;br /&gt;
* Enter the Commit email&lt;br /&gt;
** If the Bitbucket provided user.email is input here, when commits occur from Command Center, within Bitbucket commits from Command Center will show as the token name provided when the PAT was created in Bitbucket.  This is the &amp;quot;git config user.email&amp;quot; token marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Git server URL, for example, &#039;&#039;https://bitbucket.org/account/&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCredentialName.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Give the new credential a name&#039;&#039;&#039;&lt;br /&gt;
* The name should be something that is easily identified when applied from a project as the being the correct PAT&lt;br /&gt;
* Assign it to applicable managers&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The system should return to the &#039;&#039;&#039;Manage Data Source Credentials&#039;&#039;&#039; page with &amp;quot;Credential created&amp;quot; note and the new credential should be listed.&lt;br /&gt;
&lt;br /&gt;
At this point, this credential can be added to a project in the same manner as any other source credential.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99074</id>
		<title>Custom Git Data Source Credential</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99074"/>
		<updated>2025-01-07T18:01:23Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Bitbucket / Custom Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bitbucket / Custom Git =&lt;br /&gt;
[Administrator]&lt;br /&gt;
&lt;br /&gt;
For special git repositories, such as Bitbucket, use Custom Git. It provides flexibility for special Git systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitbucket PAT Creation Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitbucket allows PATs to be created at the Project or the Repository level.  In this description the PAT was created at the repository level&lt;br /&gt;
&lt;br /&gt;
* Within the Bitbucket repository, go to Repository Settings -&amp;gt; Access Tokens select Create Repository Access Token &lt;br /&gt;
[[File:BitbucketPATCreationForm.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
* Give the token a name that can be easily identified&lt;br /&gt;
* Select the scopes of Read/Write/Delete&lt;br /&gt;
* Press Create&lt;br /&gt;
&lt;br /&gt;
There should be a new screen that appears showing the newly created PAT and the various ways to leverage it.  Be sure to save the contents of this screen as everything but the email user.email section will no longer be visible once closed.&lt;br /&gt;
&lt;br /&gt;
The sections that are of most importance have been marked in red.  These will be referenced later when filling out the configuration in Command Center.  They are, from top to bottom:&lt;br /&gt;
* Repository access token&lt;br /&gt;
* How to use this token with your Git Repository&lt;br /&gt;
* The git config user.email&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketPATCreationDetails.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Now that the PAT has been created, it can be incorporated into Command Center as follows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create a new Data Source Credential&#039;&#039;&#039;&lt;br /&gt;
* Open the Settings section (Gear Icon) from the Dashboard page&lt;br /&gt;
* Select &amp;quot;Maintenance Mode&amp;quot; (Must be an Administrator to do this) to unlock the Data Source Credentials area&lt;br /&gt;
* Select the Data Source Credentials&lt;br /&gt;
* Selecti the [[File:CreateIcon.jpg|30px]] (&#039;&#039;&#039;Create new credential&#039;&#039;&#039;) button on the Manage Data Source Credentials page.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select the Custom Git card&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCard.jpg|100px]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Custom Git Connection Form will open&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketGitCredentials.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enter the details for the Custom Git Form&#039;&#039;&#039;&lt;br /&gt;
* Enter a Username.&lt;br /&gt;
** The username will be x-token-auth as provided by Bitbucket as part of the git clone URL when the PAT was initially created.  This can be found in the &amp;quot;How to use this token with your Git Repository&amp;quot; when the PAT was created marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Personal access token&lt;br /&gt;
** The PAT is the Token itself as provided by Bitbucket in the top text box marked in red in the screenshot prior marked as &amp;quot;Repository Access Token&amp;quot;.  This is the PAT itself.&lt;br /&gt;
* Enter the Commit author - You can put whatever you wish here&lt;br /&gt;
* Enter the Commit email&lt;br /&gt;
** If the Bitbucket provided user.email is input here, when commits occur from Command Center, within Bitbucket commits from Command Center will show as the token name provided when the PAT was created in Bitbucket.  This is the &amp;quot;git config user.email&amp;quot; token marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Git server URL, for example, &#039;&#039;https://bitbucket.org/account/&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCredentialName.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Give the new credential a name&#039;&#039;&#039;&lt;br /&gt;
* The name should be something that is easily identified when applied from a project as the being the correct PAT&lt;br /&gt;
* Assign it to applicable managers&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The system should return to the &#039;&#039;&#039;Manage Data Source Credentials&#039;&#039;&#039; page with &amp;quot;Credential created&amp;quot; note and the new credential should be listed.&lt;br /&gt;
&lt;br /&gt;
At this point, this credential can be added to a project in the same manner as any other source credential.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99065</id>
		<title>Custom Git Data Source Credential</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99065"/>
		<updated>2025-01-07T17:16:38Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Bitbucket / Custom Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bitbucket / Custom Git =&lt;br /&gt;
[Administrator]&lt;br /&gt;
&lt;br /&gt;
For special git repositories, such as Bitbucket, use Custom Git. It provides flexibility for special Git systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitbucket PAT Creation Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitbucket allows PATs to be created at the Project or the Repository level.  In this description the PAT was created at the repository level&lt;br /&gt;
&lt;br /&gt;
* Within the Bitbucket repository, go to Repository Settings -&amp;gt; Access Tokens select Create Repository Access Token &lt;br /&gt;
[[File:BitbucketPATCreationForm.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
* Give the token a name that can be easily identified&lt;br /&gt;
* Select the scopes of Read/Write/Delete&lt;br /&gt;
* Press Create&lt;br /&gt;
&lt;br /&gt;
There should be a new screen that appears showing the newly created PAT and the various ways to leverage it.  Be sure to save the contents of this screen as everything but the email user.email section will no longer be visible once closed.&lt;br /&gt;
&lt;br /&gt;
The sections that are of importance have been marked in red.  These will be referenced later when filling out the configuration in Command Center.  They are, from top to bottom:&lt;br /&gt;
* Repository access token&lt;br /&gt;
* How to use this token with your Git Repository&lt;br /&gt;
* The git config user.email&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketPATCreationDetails.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Now that the PAT has been created, it can be incorporated into Command Center as follows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create a new Data Source Credential&#039;&#039;&#039;&lt;br /&gt;
* Open the Settings section (Gear Icon) from the Dashboard page&lt;br /&gt;
* Select &amp;quot;Maintenance Mode&amp;quot; (Must be an Administrator to do this) to unlock the Data Source Credentials area&lt;br /&gt;
* Select the Data Source Credentials&lt;br /&gt;
* Selecti the [[File:CreateIcon.jpg|30px]] (&#039;&#039;&#039;Create new credential&#039;&#039;&#039;) button on the Manage Data Source Credentials page.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select the Custom Git card&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCard.jpg|100px]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Custom Git Connection Form will open&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketGitCredentials.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enter the details for the Custom Git Form&#039;&#039;&#039;&lt;br /&gt;
* Enter a Username.&lt;br /&gt;
** The username will be x-token-auth as provided by Bitbucket as part of the git clone URL when the PAT was initially created.  This can be found in the &amp;quot;How to use this token with your Git Repository&amp;quot; when the PAT was created marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Personal access token&lt;br /&gt;
** The PAT is the Token itself as provided by Bitbucket in the top text box marked in red in the screenshot prior marked as &amp;quot;Repository Access Token&amp;quot;.  This is the PAT itself.&lt;br /&gt;
* Enter the Commit author - You can put whatever you wish here&lt;br /&gt;
* Enter the Commit email&lt;br /&gt;
** If the Bitbucket provided user.email is input here, when commits occur from Command Center, within Bitbucket commits from Command Center will show as the token name provided when the PAT was created in Bitbucket.  This is the &amp;quot;git config user.email&amp;quot; token marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Git server URL, for example, &#039;&#039;https://bitbucket.org/account/&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCredentialName.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Give the new credential a name&#039;&#039;&#039;&lt;br /&gt;
* The name should be something that is easily identified when applied from a project as the being the correct PAT&lt;br /&gt;
* Assign it to applicable managers&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The system should return to the &#039;&#039;&#039;Manage Data Source Credentials&#039;&#039;&#039; page with &amp;quot;Credential created&amp;quot; note and the new credential should be listed.&lt;br /&gt;
&lt;br /&gt;
At this point, this credential can be added to a project in the same manner as any other source credential.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99064</id>
		<title>Custom Git Data Source Credential</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99064"/>
		<updated>2025-01-07T17:14:55Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Bitbucket / Custom Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bitbucket / Custom Git =&lt;br /&gt;
[Administrator]&lt;br /&gt;
&lt;br /&gt;
For special git repositories, such as Bitbucket, use Custom Git. It provides flexibility for special Git systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitbucket PAT Creation Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitbucket allows PATs to be created at the Project or the Repository level.  In this description the PAT was created at the repository level&lt;br /&gt;
&lt;br /&gt;
* Within the Bitbucket repository, go to Repository Settings -&amp;gt; Access Tokens select Create Repository Access Token &lt;br /&gt;
[[File:BitbucketPATCreationForm.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
* Give the token a name that can be easily identified&lt;br /&gt;
* Select the scopes of Read/Write/Delete&lt;br /&gt;
* Press Create&lt;br /&gt;
&lt;br /&gt;
There should be a new screen that appears showing the newly created PAT and the various ways to leverage it.  Be sure to save the contents of this screen as everything but the email user.email section will no longer be visible once closed.&lt;br /&gt;
&lt;br /&gt;
The sections that are of importance have been marked in red.  These will be referenced later when filling out the configuration in Command Center.  They are, from top to bottom:&lt;br /&gt;
* Repository access token&lt;br /&gt;
* How to use this token with your Git Repository&lt;br /&gt;
* The git config user.email&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketPATCreationDetails.jpg|400px]]&lt;br /&gt;
&lt;br /&gt;
Now that the PAT has been created, it can be incorporated into Command Center as follows.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Create a new Data Source Credential&#039;&#039;&#039;&lt;br /&gt;
* Open the Settings section (Gear Icon) from the Dashboard page&lt;br /&gt;
* Select &amp;quot;Maintenance Mode&amp;quot; (Must be an Administrator to do this) to unlock the Data Source Credentials area&lt;br /&gt;
* Select the Data Source Credentials&lt;br /&gt;
* Selecti the [[File:CreateIcon.jpg|30px]] (&#039;&#039;&#039;Create new credential&#039;&#039;&#039;) button on the Manage Data Source Credentials page.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select the Custom Git card&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCard.jpg|100px]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Custom Git Connection Form will open&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketGitCredentials.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enter the details for the Custom Git Form&#039;&#039;&#039;&lt;br /&gt;
* Enter a Username.&lt;br /&gt;
** The username will be x-token-auth as provided by Bitbucket as part of the git clone URL when the PAT was initially created.  This can be found in the &amp;quot;How to use this token with your Git Repository&amp;quot; when the PAT was created marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Personal access token&lt;br /&gt;
** The PAT is the Token itself as provided by Bitbucket in the top text box marked in red in the screenshot prior marked as &amp;quot;Repository Access Token&amp;quot;.  This is the PAT itself.&lt;br /&gt;
* Enter the Commit author - You can put whatever you wish here&lt;br /&gt;
* Enter the Commit email&lt;br /&gt;
** If the Bitbucket provided user.email is input here, when commits occur from Command Center, they will show in Bitbucket with a commit author as token name provided when the PAT was created in Bitbucket.  This is the &amp;quot;git config user.email&amp;quot; token marked in red in the screenshot prior.&lt;br /&gt;
* Enter the Git server URL, for example, &#039;&#039;https://bitbucket.org/account/&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCredentialName.jpg|800px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Give the new credential a name&#039;&#039;&#039;&lt;br /&gt;
* The name should be something that is easily identified when applied from a project as the being the correct PAT&lt;br /&gt;
* Assign it to applicable managers&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The system should return to the &#039;&#039;&#039;Manage Data Source Credentials&#039;&#039;&#039; page with &amp;quot;Credential created&amp;quot; note and the new credential should be listed.&lt;br /&gt;
&lt;br /&gt;
At this point, this credential can be added to a project in the same manner as any other source credential.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:BitbucketCredentialName.jpg&amp;diff=99061</id>
		<title>File:BitbucketCredentialName.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:BitbucketCredentialName.jpg&amp;diff=99061"/>
		<updated>2025-01-07T17:13:15Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:BitbucketGitCredentials.jpg&amp;diff=99055</id>
		<title>File:BitbucketGitCredentials.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:BitbucketGitCredentials.jpg&amp;diff=99055"/>
		<updated>2025-01-07T16:58:27Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:BitbucketPATCreationDetails.jpg&amp;diff=99048</id>
		<title>File:BitbucketPATCreationDetails.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:BitbucketPATCreationDetails.jpg&amp;diff=99048"/>
		<updated>2025-01-07T16:44:17Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=File:BitbucketPATCreationForm.jpg&amp;diff=99047</id>
		<title>File:BitbucketPATCreationForm.jpg</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=File:BitbucketPATCreationForm.jpg&amp;diff=99047"/>
		<updated>2025-01-07T16:41:23Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99043</id>
		<title>Custom Git Data Source Credential</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99043"/>
		<updated>2025-01-07T15:09:05Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Bitbucket / Custom Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bitbucket / Custom Git =&lt;br /&gt;
[Administrator]&lt;br /&gt;
&lt;br /&gt;
For special git repositories, such as Bitbucket, use Custom Git. It provides flexibility for special Git systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitbucket PAT Creation Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitbucket allows PATs to be created at the Project or the Repository level.  In this description the PAT was created at the repository level&lt;br /&gt;
&lt;br /&gt;
* Within the Bitbucket repository, go to Repository Settings -&amp;gt; Access Tokens select Create Repository Access Token &lt;br /&gt;
[[File:BitbucketPATCreationForm.jpg|600px]]&lt;br /&gt;
* Give the token a name that can be easily identified&lt;br /&gt;
* Select the scopes of Read/Write/Delete&lt;br /&gt;
* Press Create&lt;br /&gt;
&lt;br /&gt;
There should be a new screen that appears showing the newly created PAT and the various ways to leverage it.  Be sure to save the contents of this screen as everything but the email user.email section will no longer be visible once closed.&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketPATCreationDetails.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
The Administrator can create the data source credentials by selecting the [[File:CreateIcon.jpg|30px]] (&#039;&#039;&#039;Create new credential&#039;&#039;&#039;) button on the Manage Data Source Credentials page.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select the Custom Git card&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCard.jpg|100px]] &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Custom Git Connection Form will open&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketUsername.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enter the details for the Custom Git Form&#039;&#039;&#039;&lt;br /&gt;
* Enter a Username.&lt;br /&gt;
** The username will be x-token-auth as provided by Bitbucket as part of the git clone URL provided by Bitbucket when the PAT was initially created.&lt;br /&gt;
* Enter the Personal access token&lt;br /&gt;
** The PAT is the Token itself as provided by Bitbucket in the first text box that was created by the Bitbucket service.  Be sure not to add the username portion or the @&amp;lt;URL&amp;gt; portion to this.&lt;br /&gt;
* Enter the Commit author&lt;br /&gt;
* Enter the Commit email&lt;br /&gt;
** If the Bitbucket provided user.email is input here, when commits occur from Command Center, they will show in Bitbucket with a commit author as token name provided when the PAT was created in Bitbucket&lt;br /&gt;
* Enter the URL, for example, &#039;&#039;https://bitbucket.org/account/&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
[[File:BitbucketGitCredentials.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Give the new credential a name&#039;&#039;&#039;&lt;br /&gt;
* The name should be something that is easily identified when applied from a project as the being the correct PAT&lt;br /&gt;
* Assign it to applicable managers&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCredentialName.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
The system should return to the &#039;&#039;&#039;Manage Data Source Credentials&#039;&#039;&#039; page with &amp;quot;Credential created&amp;quot; note and the new credential should be listed.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
	<entry>
		<id>https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99042</id>
		<title>Custom Git Data Source Credential</title>
		<link rel="alternate" type="text/html" href="https://wiki.lingoport.com/index.php?title=Custom_Git_Data_Source_Credential&amp;diff=99042"/>
		<updated>2025-01-07T15:06:00Z</updated>

		<summary type="html">&lt;p&gt;Rwilliams: /* Bitbucket / Custom Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bitbucket / Custom Git =&lt;br /&gt;
[Administrator]&lt;br /&gt;
&lt;br /&gt;
For special git repositories, such as Bitbucket, use Custom Git. It provides flexibility for special Git systems.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Bitbucket PAT Creation Notes&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Bitbucket allows PATs to be created at the Project or the Repository level.  In this description the PAT was created at the repository level&lt;br /&gt;
&lt;br /&gt;
* Within the Bitbucket repository, go to Repository Settings -&amp;gt; Access Tokens select Create Repository Access Token &lt;br /&gt;
[[File:BitbucketPATCreationForm.jpg|600px]]&lt;br /&gt;
* Give the token a name that can be easily identified&lt;br /&gt;
* Select the scopes of Read/Write/Delete&lt;br /&gt;
* Press Create&lt;br /&gt;
&lt;br /&gt;
There should be a new screen that appears showing the newly created PAT and the various ways to leverage it.  Be sure to save the contents of this screen as everything but the email user.email section will no longer be visible once closed.&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketPATCreationDetails.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
The Administrator can create the data source credentials by selecting the [[File:CreateIcon.jpg|30px]] (&#039;&#039;&#039;Create new credential&#039;&#039;&#039;) button on the Manage Data Source Credentials page.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Select the Custom Git card&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCard.jpg|100px]] &lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketUsername.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Enter the details for the Custom Git Form&#039;&#039;&#039;&lt;br /&gt;
* Enter a Username.&lt;br /&gt;
** The username will be x-token-auth as provided by Bitbucket as part of the git clone URL provided by Bitbucket when the PAT was initially created.&lt;br /&gt;
* Enter the Personal access token&lt;br /&gt;
** The PAT is the Token itself as provided by Bitbucket in the first text box that was created by the Bitbucket service.  Be sure not to add the username portion or the @&amp;lt;URL&amp;gt; portion to this.&lt;br /&gt;
* Enter the Commit author&lt;br /&gt;
* Enter the Commit email&lt;br /&gt;
** If the Bitbucket provided user.email is input here, when commits occur from Command Center, they will show in Bitbucket with a commit author as token name provided when the PAT was created in Bitbucket&lt;br /&gt;
* Enter the URL, for example, &#039;&#039;https://bitbucket.org/account/&#039;&#039; &lt;br /&gt;
* &#039;&#039;&#039;Next&#039;&#039;&#039;&lt;br /&gt;
[[File:BitbucketGitCredentials.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Give the new credential a name&#039;&#039;&#039;&lt;br /&gt;
* The name should be something that is easily identified when applied from a project as the being the correct PAT&lt;br /&gt;
* Assign it to applicable managers&lt;br /&gt;
* &#039;&#039;&#039;Create&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[File:BitbucketCredentialName.jpg|600px]]&lt;br /&gt;
&lt;br /&gt;
The system should return to the &#039;&#039;&#039;Manage Data Source Credentials&#039;&#039;&#039; page with &amp;quot;Credential created&amp;quot; note and the new credential should be listed.&lt;/div&gt;</summary>
		<author><name>Rwilliams</name></author>
	</entry>
</feed>