diff --git a/.github/workflows/createrelease.yml b/.github/workflows/createrelease.yml
index aeec9b7..0ccd803 100644
--- a/.github/workflows/createrelease.yml
+++ b/.github/workflows/createrelease.yml
@@ -46,7 +46,7 @@ jobs:
- name: Publish API
if: ${{ github.event.release.prerelease == false }}
- run: dotnet publish "TestHosts\TestHosts\TestHosts.csproj" --configuration Release --output publishOutput -r win-x64 --self-contained
+ run: dotnet publish "TestHosts\TestHosts\TestHosts.csproj" --configuration Release --output publishOutput -r linux-x64 --self-contained
- name: Build Release Package
run: |
@@ -60,7 +60,7 @@ jobs:
path: testhosts.zip
deploystaging:
- runs-on: stagingserver
+ runs-on: [stagingserver, linux]
needs: buildlinux
environment: staging
name: "Deploy to Staging"
@@ -70,30 +70,76 @@ jobs:
uses: actions/download-artifact@v4.1.8
with:
name: testhosts
-
- - name: Remove existing Windows service
+ path: /tmp/testhosts # Download to a temporary directory
+
+ - name: Remove existing service (if applicable)
run: |
- $serviceName = "Transaction Processing - Test Hosts"
- # Check if the service exists
- if (Get-Service -Name $serviceName -ErrorAction SilentlyContinue) {
- Stop-Service -Name $serviceName
- sc.exe delete $serviceName
- }
-
+ SERVICE_NAME="testhosts"
+ if systemctl is-active --quiet "$SERVICE_NAME"; then
+ echo "Stopping existing service..."
+ sudo systemctl stop "$SERVICE_NAME"
+ fi
+ if systemctl is-enabled --quiet "$SERVICE_NAME"; then
+ echo "Disabling existing service..."
+ sudo systemctl disable "$SERVICE_NAME"
+ fi
+ if [ -f "/etc/systemd/system/${SERVICE_NAME}.service" ]; then
+ echo "Removing existing service unit file..."
+ sudo rm "/etc/systemd/system/${SERVICE_NAME}.service"
+ sudo systemctl daemon-reload
+ fi
+
- name: Unzip the files
run: |
- Expand-Archive -Path testhosts.zip -DestinationPath "C:\txnproc\transactionprocessing\testhosts" -Force
-
- - name: Install as a Windows service
+ sudo mkdir -p /opt/txnproc/transactionprocessing/testhosts
+ sudo unzip -o /tmp/testhosts/testhosts.zip -d /opt/txnproc/transactionprocessing/testhosts
+
+ # IMPORTANT: Add a step to ensure the .NET runtime is installed on the server
+ # This assumes it's not already there. If your base image already has it, you can skip this.
+ - name: Install .NET Runtime
+ run: |
+ # Example for Ubuntu. Adjust based on your .NET version (e.g., 8.0, 7.0)
+ # and if you need the SDK or just the runtime.
+ # This uses Microsoft's package repository for the latest versions.
+ wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
+ sudo dpkg -i packages-microsoft-prod.deb
+ rm packages-microsoft-prod.deb
+ sudo apt update
+ sudo apt install -y aspnetcore-runtime-9.0
+
+ - name: Install and Start as a Linux service
run: |
- $serviceName = "Transaction Processing - Test Hosts"
- $servicePath = "C:\txnproc\transactionprocessing\TestHosts\TestHosts.exe"
-
- New-Service -Name $serviceName -BinaryPathName $servicePath -Description "Transaction Processing - Test Hosts" -DisplayName "Transaction Processing - Test Hosts" -StartupType Automatic
- Start-Service -Name $serviceName
+ SERVICE_NAME="testhosts"
+ # The WorkingDirectory is crucial for .NET apps to find appsettings.json and other files
+ WORKING_DIRECTORY="/opt/txnproc/transactionprocessing/testhosts"
+ DLL_NAME="TestHosts.dll" # Your application's DLL
+ SERVICE_DESCRIPTION="Transaction Processing - Test Hosts"
+
+ # Create a systemd service file
+ echo "[Unit]" | sudo tee /etc/systemd/system/${SERVICE_NAME}.service
+ echo "Description=${SERVICE_DESCRIPTION}" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "After=network.target" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "[Service]" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ # IMPORTANT: Use 'dotnet' to run your DLL
+ echo "ExecStart=/usr/bin/dotnet ${WORKING_DIRECTORY}/${DLL_NAME}" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "WorkingDirectory=${WORKING_DIRECTORY}" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "Restart=always" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "User=youruser" # IMPORTANT: Change to a dedicated, less privileged user
+ echo "Group=yourgroup" # IMPORTANT: Change to a dedicated, less privileged group
+ echo "Environment=ASPNETCORE_ENVIRONMENT=Production" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service # Example
+ echo "" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "[Install]" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "WantedBy=multi-user.target" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+
+ # Reload systemd, enable, and start the service
+ sudo systemctl daemon-reload
+ sudo systemctl enable "$SERVICE_NAME"
+ sudo systemctl start "$SERVICE_NAME"
+ sudo systemctl status "$SERVICE_NAME" --no-pager # For debugging/verification
deployproduction:
- runs-on: productionserver
+ runs-on: [productionserver, linux]
needs: [buildlinux, deploystaging]
environment: production
name: "Deploy to Production"
@@ -103,24 +149,70 @@ jobs:
uses: actions/download-artifact@v4.1.8
with:
name: testhosts
-
- - name: Remove existing Windows service
+ path: /tmp/testhosts # Download to a temporary directory
+
+ - name: Remove existing service (if applicable)
run: |
- $serviceName = "Transaction Processing - Test Hosts"
- # Check if the service exists
- if (Get-Service -Name $serviceName -ErrorAction SilentlyContinue) {
- Stop-Service -Name $serviceName
- sc.exe delete $serviceName
- }
-
+ SERVICE_NAME="testhosts"
+ if systemctl is-active --quiet "$SERVICE_NAME"; then
+ echo "Stopping existing service..."
+ sudo systemctl stop "$SERVICE_NAME"
+ fi
+ if systemctl is-enabled --quiet "$SERVICE_NAME"; then
+ echo "Disabling existing service..."
+ sudo systemctl disable "$SERVICE_NAME"
+ fi
+ if [ -f "/etc/systemd/system/${SERVICE_NAME}.service" ]; then
+ echo "Removing existing service unit file..."
+ sudo rm "/etc/systemd/system/${SERVICE_NAME}.service"
+ sudo systemctl daemon-reload
+ fi
+
- name: Unzip the files
run: |
- Expand-Archive -Path testhosts.zip -DestinationPath "C:\txnproc\transactionprocessing\testhosts" -Force
-
- - name: Install as a Windows service
+ sudo mkdir -p /opt/txnproc/transactionprocessing/testhosts
+ sudo unzip -o /tmp/testhosts/testhosts.zip -d /opt/txnproc/transactionprocessing/testhosts
+
+ # IMPORTANT: Add a step to ensure the .NET runtime is installed on the server
+ # This assumes it's not already there. If your base image already has it, you can skip this.
+ - name: Install .NET Runtime
+ run: |
+ # Example for Ubuntu. Adjust based on your .NET version (e.g., 8.0, 7.0)
+ # and if you need the SDK or just the runtime.
+ # This uses Microsoft's package repository for the latest versions.
+ wget https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
+ sudo dpkg -i packages-microsoft-prod.deb
+ rm packages-microsoft-prod.deb
+ sudo apt update
+ sudo apt install -y aspnetcore-runtime-9.0
+
+ - name: Install and Start as a Linux service
run: |
- $serviceName = "Transaction Processing - Test Hosts"
- $servicePath = "C:\txnproc\transactionprocessing\TestHosts\TestHosts.exe"
-
- New-Service -Name $serviceName -BinaryPathName $servicePath -Description "Transaction Processing - Test Hosts" -DisplayName "Transaction Processing - Test Hosts" -StartupType Automatic
- Start-Service -Name $serviceName
+ SERVICE_NAME="testhosts"
+ # The WorkingDirectory is crucial for .NET apps to find appsettings.json and other files
+ WORKING_DIRECTORY="/opt/txnproc/transactionprocessing/testhosts"
+ DLL_NAME="TestHosts.dll" # Your application's DLL
+ SERVICE_DESCRIPTION="Transaction Processing - Test Hosts"
+
+ # Create a systemd service file
+ echo "[Unit]" | sudo tee /etc/systemd/system/${SERVICE_NAME}.service
+ echo "Description=${SERVICE_DESCRIPTION}" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "After=network.target" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "[Service]" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ # IMPORTANT: Use 'dotnet' to run your DLL
+ echo "ExecStart=/usr/bin/dotnet ${WORKING_DIRECTORY}/${DLL_NAME}" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "WorkingDirectory=${WORKING_DIRECTORY}" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "Restart=always" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "User=youruser" # IMPORTANT: Change to a dedicated, less privileged user
+ echo "Group=yourgroup" # IMPORTANT: Change to a dedicated, less privileged group
+ echo "Environment=ASPNETCORE_ENVIRONMENT=Production" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service # Example
+ echo "" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "[Install]" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+ echo "WantedBy=multi-user.target" | sudo tee -a /etc/systemd/system/${SERVICE_NAME}.service
+
+ # Reload systemd, enable, and start the service
+ sudo systemctl daemon-reload
+ sudo systemctl enable "$SERVICE_NAME"
+ sudo systemctl start "$SERVICE_NAME"
+ sudo systemctl status "$SERVICE_NAME" --no-pager # For debugging/verification
diff --git a/TestHosts/TestHosts/TestHosts.csproj b/TestHosts/TestHosts/TestHosts.csproj
index 1e899a0..bae9274 100644
--- a/TestHosts/TestHosts/TestHosts.csproj
+++ b/TestHosts/TestHosts/TestHosts.csproj
@@ -21,7 +21,7 @@
-
+
diff --git a/TestHosts/TestHosts/appsettings.staging.json b/TestHosts/TestHosts/appsettings.staging.json
index 5aa1f58..b0bfd90 100644
--- a/TestHosts/TestHosts/appsettings.staging.json
+++ b/TestHosts/TestHosts/appsettings.staging.json
@@ -1,7 +1,7 @@
{
"ConnectionStrings": {
- "TestBankReadModel": "server=192.168.1.167,1433;user id=sa;password=Sc0tland;database=TestBankReadModel;Encrypt=false",
- "PataPawaReadModel": "server=192.168.1.167,1433;user id=sa;password=Sc0tland;database=PataPawaReadModel;Encrypt=false"
+ "TestBankReadModel": "server=192.168.1.163,1433;user id=sa;password=Sc0tland;database=TestBankReadModel;Encrypt=false",
+ "PataPawaReadModel": "server=192.168.1.163,1433;user id=sa;password=Sc0tland;database=PataPawaReadModel;Encrypt=false"
},
"AllowedHosts": "*"
}
\ No newline at end of file