In the last part of this series, we looked at how to use the web installer to download the media content to a local folder. The method to download the bits applies to both full and express editions of the Azure DevOps Server. Once we have the installer bits, we can use unattended methods to perform the complete install of Azure DevOps Server. And, that is the subject of today’s post.
There are different installation methods that are supported (source: docs.microsoft.com).
A single-server deployment is the easiest deployment, because the application tier and data tier are on the same machine.
- Dual servers
A dual-server deployment, with separate application and data tiers can provide better performance for larger teams and teams with heavier usage.
This type of deployment, which involves multiple application and data tiers, often provides better performance for larger teams and teams with heavier usage. By using more than one server, you improve high availability and disaster recovery ability.
Today, we will look at the single server installation method and how that can be achieved using the unattended process.
Installing Azure DevOps Server
When the installer is used to download the media contents, it creates a folder called packages and downloads all relevant components into that.
Note that I have copied the web installer to the root of the downloads folder.
We can invoke the silent install of the Azure DevOps Server using the /Silent parameter.
This installs the DevOps Server. You can verify this by looking at C:\Program Files\Azure DevOps Server 2019 folder.
At this point time, we only have the bits installed on the system but DevOps Server is not configured yet. If you used the GUI to start the install, at the end of the install you will be prompted with a configuration wizard. However, since we are trying to achieve all that at the command line and in an unattended fashion, we need to figure out the process to perform silent configuration of the DevOps Server. This is easy. We need to use the tfsconfig.exe in the Tools folder and supply a unattend configuration file. Now, I don’t know what that unattend file schema looks like. Once again, the tfsconfig command has the necessary options to generate that configuration file.
cd "Program Files\Azure DevOps Server 2019\Tools"
TfsConfig unattend /create /type:Basic /unattendfile:C:\downloads\unattend.ini
Once the tfsconfig command is complete, we should see the unattend.ini file in C:\Downloads. Here is how it looks.
Assembly=Microsoft.TeamFoundation.Admin, Version=18.104.22.168, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
; You can submit information about your Azure DevOps Server configuration and administration experience to Microsoft.
; One of the following configuration Scenarios:
; NewServerBasic: Configure a new server with only the essential services.
; NewServerAdvanced: Configure a new server with essential and other optional features.
; NewServerAzure: Configure a new server with Azure SQL integration.
; ProductionUpgrade: Upgrade an existing production server.
; PreProductionUpgrade: Perform a pre-production upgrade using backed up production databases.
; ApplicationTierOnlyBasic: Basic application tier-only configuration using existing settings.
; ApplicationTierOnlyAdvanced: Application tier-only configuration that allows full setting customization.
; Clone: Create a new deployment from an existing deployment.
; Whether SQL Express will be installed as part of configuration
; Provide the configured SQL instance in the form of Server, ServerName\InstanceName or Server,Port
; You can elect to create an existing set of empty databases (Tfs_<label>Configuration, Tfs_<label>Warehouse and Tfs_<label>Analysis)
; Determines whether a configuration database will get created
; Database label controls the names of the configuration databases. Database name will be Tfs_<label>Configuration, Tfs_<label>Warehouse and Tfs_<label>Analysis
; Boolean to determine whether the account is a built-in account
; Account that the DevOps web site will run as. On a domain joined machine, this can be a domain account or NT Authority\Network Service. On a workgroup machine, it can be a local account or NT Authority\Local Service
ServiceAccountName=NT AUTHORITY\NETWORK SERVICE
; The LCID to use for this Azure DevOps Server installation.
; The host name portion of the web site URL. This is typically the machine name but can be customized for more advanced scenarios such as HTTPS or NLB
; The web site virtual directory name can be either empty or up to 8 alphanumeric characters.
; SiteBindings is a semi-colon separated list of bindings, each of which consists
; of 4 or 6 parts (4 for http, 6 for https):
; A single http binding on port 8080, for all unassigned IP addresses, with no host header
; A single https binding on port 443, for all unassigned IP addresses, having a host header 'contoso.com',
; including a generated self-signed certificate that will be stored in the Personal store
; on the local machine.
; Two bindings separated by a semi-colon
; A single https binding on port 443 with a certificate thumbprint.
; DevOps will look for the thumbprint in the Personal store for the local
; The Public URL is the primary URL that users specify to connect to the system and is the URL used in the text of e-mail alerts.
; The Windows file system folder used by Azure DevOps Server to cache data.
; Determines if Email notifications will be enabled.
; Determines if SSH service will be enabled.
; The port used by the SSH service.
; Configure Search in DevOps deployment.
; You can select to install new search service or use an existing search service
; Determines whether an initial collection will be created. This can be disabled for advanced scenarios such as different SQL instances by using the create collection wizard in the administration console after configuring the server.
; The name of the collection
; The description for the collection
The above auto-generated unattend.ini file specifies that an install of SQL Express needs to be installed and the DevOps Server endpoint will be listening at port 8080 and with a virtual directory called tfs.
Note: Since InstallSQLExpress is set to True, the installer gets downloaded and installed.
This INI file can be supplied to the tfconfig.exe to configure Azure DevOps Server in an unattended method.
tfsconfig.exe unattend /unattendfile:C:\downloads\unattend.ini
Once the install is complete, you can access the Azure DevOps Server at http://<localhostname>:8080/tfs.
This is it for today! We will see some more install methods in the next post.