100% found this document useful (4 votes)
24 views66 pages

Where Can Buy Accelerating Unity Through Automation: Power Up Your Unity Workflow by Offloading Intensive Tasks Simon Jackson Ebook With Cheap Price

Your

Uploaded by

prietlvarm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (4 votes)
24 views66 pages

Where Can Buy Accelerating Unity Through Automation: Power Up Your Unity Workflow by Offloading Intensive Tasks Simon Jackson Ebook With Cheap Price

Your

Uploaded by

prietlvarm
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 66

Download Full Version ebookmass - Visit ebookmass.

com

Accelerating Unity Through Automation: Power Up


Your Unity Workflow by Offloading Intensive Tasks
Simon Jackson

https://ebookmass.com/product/accelerating-unity-through-
automation-power-up-your-unity-workflow-by-offloading-
intensive-tasks-simon-jackson/

OR CLICK HERE

DOWLOAD NOW

Discover More Ebook - Explore Now at ebookmass.com


Instant digital products (PDF, ePub, MOBI) ready for you
Download now and discover formats that fit your needs...

Team Unity John Ross

https://ebookmass.com/product/team-unity-john-ross/

ebookmass.com

Unity and the Holy Spirit John E. Hare

https://ebookmass.com/product/unity-and-the-holy-spirit-john-e-hare/

ebookmass.com

eTextbook 978-1133934813 Religion in Japan: Unity and


Diversity

https://ebookmass.com/product/etextbook-978-1133934813-religion-in-
japan-unity-and-diversity/

ebookmass.com

Nutrition for Health and Health Care (MindTap Course List)


7th Edition Linda Kelly Debruyne

https://ebookmass.com/product/nutrition-for-health-and-health-care-
mindtap-course-list-7th-edition-linda-kelly-debruyne/

ebookmass.com
Kanski's Clinical Ophthalmology: A Systematic Approach 9th
Edition John Salmon

https://ebookmass.com/product/kanskis-clinical-ophthalmology-a-
systematic-approach-9th-edition-john-salmon/

ebookmass.com

The Woman in the Library Sulari Gentill

https://ebookmass.com/product/the-woman-in-the-library-sulari-
gentill-6/

ebookmass.com

The Pursuit of Excellence : The Uncommon Behaviors of the


World’s Most Productive Achievers Ryan Hawk

https://ebookmass.com/product/the-pursuit-of-excellence-the-uncommon-
behaviors-of-the-worlds-most-productive-achievers-ryan-hawk/

ebookmass.com

Adobe Premiere Pro CC For Dummies 1st Edition John Carucci

https://ebookmass.com/product/adobe-premiere-pro-cc-for-dummies-1st-
edition-john-carucci/

ebookmass.com

Creating the Qur’an Stephen J. Shoemaker

https://ebookmass.com/product/creating-the-quran-stephen-j-shoemaker/

ebookmass.com
The Skunk, the Tibetan Fox and Their Wolf Omega (Omegas of
Animals: SD Book 6) Lorelei M. Hart & Wendy Rathbone

https://ebookmass.com/product/the-skunk-the-tibetan-fox-and-their-
wolf-omega-omegas-of-animals-sd-book-6-lorelei-m-hart-wendy-rathbone/

ebookmass.com
Accelerating
Unity Through
Automation
Power Up Your Unity Workflow by
Offloading Intensive Tasks

Simon Jackson
Accelerating Unity
Through Automation
Power Up Your Unity Workflow by
Offloading Intensive Tasks

Simon Jackson
Accelerating Unity Through Automation: Power Up Your Unity Workflow by
Offloading Intensive Tasks
Simon Jackson
Warrington, Cheshire, UK

ISBN-13 (pbk): 978-1-4842-9507-6 ISBN-13 (electronic): 978-1-4842-9508-3


https://doi.org/10.1007/978-1-4842-9508-3

Copyright © 2023 by Simon Jackson


This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the
material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation,
broadcasting, reproduction on microfilms or in any other physical way, and transmission or information
storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now
known or hereafter developed.
Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with
every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an
editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the
trademark.
The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not
identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to
proprietary rights.
While the advice and information in this book are believed to be true and accurate at the date of publication,
neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or
omissions that may be made. The publisher makes no warranty, express or implied, with respect to the
material contained herein.
Managing Director, Apress Media LLC: Welmoed Spahr
Acquisitions Editor: Spandana Chatterjee
Development Editor: Spandana Chatterjee
Editorial Assistant: Mark Powers
Cover designed by eStudioCalamar
Cover image Boliva Inteligente on Unsplash (www.unsplash.com)
Distributed to the book trade worldwide by Springer Science+Business Media New York, 1 New York Plaza,
Suite 4600, New York, NY 10004-1562, USA. Phone 1-800-SPRINGER, fax (201) 348-4505, e-mail orders-ny
@springer-sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole
member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc
is a Delaware corporation.
For information on translations, please e-mail [email protected]; for reprint, paperback,
or audio rights, please e-mail [email protected].
Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and
licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales
web page at http://www.apress.com/bulk-sales.
Any source code or other supplementary material referenced by the author in this book is available to
readers on GitHub (github.com/Apress). For more detailed information, please visit https://www.apress.
com/gp/services/source-code.
Paper in this product is recyclable
Table of Contents
About the Author����������������������������������������������������������������������������������������������������� xi

About the Technical Reviewer������������������������������������������������������������������������������� xiii

Chapter 1: What Is Automation?������������������������������������������������������������������������������� 1


What Does Automation Mean for a Unity Developer?������������������������������������������������������������������� 2
What to Expect from This Title?���������������������������������������������������������������������������������������������������� 4
Looking Ahead������������������������������������������������������������������������������������������������������������������������������ 5

Chapter 2: What Is Gained Through Automation, the Highlights!����������������������������� 7


Example Workflows����������������������������������������������������������������������������������������������������������������������� 9
1. Checkout��������������������������������������������������������������������������������������������������������������������������� 10
2. Running Scripts – Bash/PowerShell/Python���������������������������������������������������������������������� 11
3. NPM Build and Test������������������������������������������������������������������������������������������������������������ 12
4. MSBuild Build and Test������������������������������������������������������������������������������������������������������ 13
5. Chat/Mail Integration (Slack/Email)����������������������������������������������������������������������������������� 14
6. Schedule/Remove Backups����������������������������������������������������������������������������������������������� 15
7. Upload Artifacts, Build, and Publish����������������������������������������������������������������������������������� 16
8. Create Releases on GitHub������������������������������������������������������������������������������������������������ 17
9. Update Project Management Solutions and Workflows����������������������������������������������������� 17
10. Generate Release Documentation����������������������������������������������������������������������������������� 18
11. Publish Documentation��������������������������������������������������������������������������������������������������� 19
12. Varying Flows Based on the Submitter���������������������������������������������������������������������������� 20
13. Call External APIs for Analytics, Reporting, or PowerBI��������������������������������������������������� 21
14. Generate/Search for Gifs to Add to a Post/Issue When Craziness Is Detected
or a “lmgtfy” Tag Is Used by an Admin���������������������������������������������������������������������������� 22
15. Convert Source Files (yaml/xml/json) to Other Formats or Perform Bespoke
Actions����������������������������������������������������������������������������������������������������������������������������� 23
16. Integrate with Docker/Kubernetes���������������������������������������������������������������������������������� 24

iii
Table of Contents

17. Manage Versioning���������������������������������������������������������������������������������������������������������� 24


18. Run Unit Tests and Perform Actions Based on Results���������������������������������������������������� 25
References���������������������������������������������������������������������������������������������������������������������������������� 26
Summary������������������������������������������������������������������������������������������������������������������������������������ 27

Chapter 3: Services Covered by This Title�������������������������������������������������������������� 29


Cost��������������������������������������������������������������������������������������������������������������������������������������������� 30
Use Cases����������������������������������������������������������������������������������������������������������������������������������� 31
The Reality Collective������������������������������������������������������������������������������������������������������������ 31
The Unity UI Extensions Project��������������������������������������������������������������������������������������������� 32
Several Business Clients������������������������������������������������������������������������������������������������������� 32
Open Source�������������������������������������������������������������������������������������������������������������������������� 33
On to the Services����������������������������������������������������������������������������������������������������������������������� 34
Unity Gaming Services – DevOps������������������������������������������������������������������������������������������ 35
Azure Pipelines���������������������������������������������������������������������������������������������������������������������� 38
GitHub Actions����������������������������������������������������������������������������������������������������������������������� 42
Summary������������������������������������������������������������������������������������������������������������������������������������ 46

Chapter 4: The Structure of Automation����������������������������������������������������������������� 47


The Speech of Automation���������������������������������������������������������������������������������������������������������� 48
Actions����������������������������������������������������������������������������������������������������������������������������������� 48
Agent/Runner������������������������������������������������������������������������������������������������������������������������ 49
Approvals������������������������������������������������������������������������������������������������������������������������������� 50
Artifact/Package�������������������������������������������������������������������������������������������������������������������� 51
Azure Pipelines���������������������������������������������������������������������������������������������������������������������� 51
Branch����������������������������������������������������������������������������������������������������������������������������������� 52
Comment������������������������������������������������������������������������������������������������������������������������������� 53
Conditions������������������������������������������������������������������������������������������������������������������������������ 53
Container������������������������������������������������������������������������������������������������������������������������������� 54
Continuous Delivery��������������������������������������������������������������������������������������������������������������� 54
Continuous Integration���������������������������������������������������������������������������������������������������������� 55
Deployment��������������������������������������������������������������������������������������������������������������������������� 55
Deployment Group����������������������������������������������������������������������������������������������������������������� 55
iv
Table of Contents

Environment�������������������������������������������������������������������������������������������������������������������������� 56
Event�������������������������������������������������������������������������������������������������������������������������������������� 56
GitHub Actions����������������������������������������������������������������������������������������������������������������������� 56
Job/Jobs�������������������������������������������������������������������������������������������������������������������������������� 57
Library����������������������������������������������������������������������������������������������������������������������������������� 57
Mac Host������������������������������������������������������������������������������������������������������������������������������� 58
Parameters/Variables������������������������������������������������������������������������������������������������������������ 58
Pipeline/Workflow����������������������������������������������������������������������������������������������������������������� 58
Pull Request�������������������������������������������������������������������������������������������������������������������������� 59
Push/Pull������������������������������������������������������������������������������������������������������������������������������� 60
Run���������������������������������������������������������������������������������������������������������������������������������������� 61
Runner/Host��������������������������������������������������������������������������������������������������������������������������� 61
Stage������������������������������������������������������������������������������������������������������������������������������������� 62
Step/Steps/Task�������������������������������������������������������������������������������������������������������������������� 62
Trigger����������������������������������������������������������������������������������������������������������������������������������� 63
Ubuntu (Linux) Host��������������������������������������������������������������������������������������������������������������� 63
Windows Host������������������������������������������������������������������������������������������������������������������������ 64
Workflow/Pipeline����������������������������������������������������������������������������������������������������������������� 64
Yaml/yml�������������������������������������������������������������������������������������������������������������������������������� 65
The First Look at Automation Configuration�������������������������������������������������������������������������������� 66
1. The Name of the Automation��������������������������������������������������������������������������������������������� 67
2. The Primary Trigger for the Automation����������������������������������������������������������������������������� 67
3. The “Jobs” Section������������������������������������������������������������������������������������������������������������ 68
4. Individual Job Definitions�������������������������������������������������������������������������������������������������� 68
5. The “Steps” Section���������������������������������������������������������������������������������������������������������� 68
6. Individual Step Definitions������������������������������������������������������������������������������������������������� 69
7. Step Parameters���������������������������������������������������������������������������������������������������������������� 70
Formatting����������������������������������������������������������������������������������������������������������������������������� 74
Secrets and Environment Variables��������������������������������������������������������������������������������������� 76
Conditionals��������������������������������������������������������������������������������������������������������������������������� 78
Job Output����������������������������������������������������������������������������������������������������������������������������� 80
Summary������������������������������������������������������������������������������������������������������������������������������������ 83
v
Table of Contents

Chapter 5: Automation Hosting������������������������������������������������������������������������������ 85


Hosted Runners��������������������������������������������������������������������������������������������������������������������������� 86
Considerations����������������������������������������������������������������������������������������������������������������������� 87
Self-Hosted Runners������������������������������������������������������������������������������������������������������������������� 88
Considerations����������������������������������������������������������������������������������������������������������������������� 89
Third-Party Hosting��������������������������������������������������������������������������������������������������������������������� 90
Considerations����������������������������������������������������������������������������������������������������������������������� 91
Deciding Factors and Summary�������������������������������������������������������������������������������������������������� 92

Chapter 6: Validation, Checking Your Code������������������������������������������������������������� 93


Before We Start��������������������������������������������������������������������������������������������������������������������������� 94
Welcome Greetings��������������������������������������������������������������������������������������������������������������������� 95
Setting Labels����������������������������������������������������������������������������������������������������������������������������� 96
Ensuring Assignment������������������������������������������������������������������������������������������������������������������ 98
Formatting PR Titles�������������������������������������������������������������������������������������������������������������������� 99
Code Scanning�������������������������������������������������������������������������������������������������������������������������� 101
Documentation�������������������������������������������������������������������������������������������������������������������������� 101
Static Documentation���������������������������������������������������������������������������������������������������������� 102
Dynamic Documentation Generation����������������������������������������������������������������������������������� 103
Summary���������������������������������������������������������������������������������������������������������������������������������� 106

Chapter 7: Testing, Making Sure It Runs�������������������������������������������������������������� 107


Doing Builds������������������������������������������������������������������������������������������������������������������������������ 108
Per Commit/PR Testing�������������������������������������������������������������������������������������������������������� 109
Nightly Builds���������������������������������������������������������������������������������������������������������������������� 109
Solutions������������������������������������������������������������������������������������������������������������������������������ 110
Unit Testing������������������������������������������������������������������������������������������������������������������������������� 112
An Example�������������������������������������������������������������������������������������������������������������������������� 114
Running Unit Tests��������������������������������������������������������������������������������������������������������������� 116
Summary���������������������������������������������������������������������������������������������������������������������������������� 117

vi
Table of Contents

Chapter 8: Building and Publishing���������������������������������������������������������������������� 119


Build Concurrency��������������������������������������������������������������������������������������������������������������������� 120
Workflow Concurrency�������������������������������������������������������������������������������������������������������� 121
Parallel Builds���������������������������������������������������������������������������������������������������������������������� 123
Unity Build Scripting����������������������������������������������������������������������������������������������������������������� 127
Further Extending the Build Script�������������������������������������������������������������������������������������� 133
Addressables���������������������������������������������������������������������������������������������������������������������������� 135
Building UPM Packages������������������������������������������������������������������������������������������������������������ 137
What Are Unity UPM Packages�������������������������������������������������������������������������������������������� 139
Building and Testing UPM Packages����������������������������������������������������������������������������������� 141
Publishing UPM Packages��������������������������������������������������������������������������������������������������� 144
UPM Summary��������������������������������������������������������������������������������������������������������������������� 146
Two-Pass Building for Strict Platforms������������������������������������������������������������������������������������� 146
Secrets and Other Files������������������������������������������������������������������������������������������������������� 147
Certificate Storage��������������������������������������������������������������������������������������������������������������� 148
Building for Windows����������������������������������������������������������������������������������������������������������� 149
Building for Mac/iOS/iPad��������������������������������������������������������������������������������������������������� 153
Additional Resources����������������������������������������������������������������������������������������������������������� 156
Two-Pass Building Summary����������������������������������������������������������������������������������������������� 156
Distribution������������������������������������������������������������������������������������������������������������������������������� 157
Azure Distribution���������������������������������������������������������������������������������������������������������������� 157
GitHub Actions Distribution�������������������������������������������������������������������������������������������������� 158
Summary���������������������������������������������������������������������������������������������������������������������������������� 159

Chapter 9: Setting Up Unity Gaming Services Automation����������������������������������� 161


Prerequisites����������������������������������������������������������������������������������������������������������������������������� 161
1. Source Control����������������������������������������������������������������������������������������������������������������� 162
2. You Need a Unity Project������������������������������������������������������������������������������������������������� 164
Know the Costs������������������������������������������������������������������������������������������������������������������������� 165
Supported Platforms����������������������������������������������������������������������������������������������������������������� 166
Getting Started – Make a Project���������������������������������������������������������������������������������������������� 167

vii
Table of Contents

Registering for Unity Cloud Build���������������������������������������������������������������������������������������������� 169


Connecting to Your Repository�������������������������������������������������������������������������������������������������� 174
A Note About Caching��������������������������������������������������������������������������������������������������������������� 177
Preparing for Builds������������������������������������������������������������������������������������������������������������������ 178
Running Your Build�������������������������������������������������������������������������������������������������������������������� 181
Advanced Build Options������������������������������������������������������������������������������������������������������������ 184
Build Output������������������������������������������������������������������������������������������������������������������������� 185
OS Dependency������������������������������������������������������������������������������������������������������������������� 186
Script Hooks������������������������������������������������������������������������������������������������������������������������ 187
Environment Variables��������������������������������������������������������������������������������������������������������� 188
Tests������������������������������������������������������������������������������������������������������������������������������������ 189
Scenes��������������������������������������������������������������������������������������������������������������������������������� 190
Addressables����������������������������������������������������������������������������������������������������������������������� 191
Asset Bundles���������������������������������������������������������������������������������������������������������������������� 192
Summary���������������������������������������������������������������������������������������������������������������������������������� 192

Chapter 10: Setting Up Azure DevOps������������������������������������������������������������������ 193


Prerequisites����������������������������������������������������������������������������������������������������������������������������� 193
1. Microsoft Account������������������������������������������������������������������������������������������������������������ 194
2. Source Control����������������������������������������������������������������������������������������������������������������� 194
3. You Need a Unity Project������������������������������������������������������������������������������������������������� 195
Know the Costs������������������������������������������������������������������������������������������������������������������������� 196
Supported Platforms����������������������������������������������������������������������������������������������������������������� 197
Getting Started – Make a Project���������������������������������������������������������������������������������������������� 198
Creating a Pipeline�������������������������������������������������������������������������������������������������������������������� 201
Connection��������������������������������������������������������������������������������������������������������������������������� 204
Selection������������������������������������������������������������������������������������������������������������������������������ 205
Configure����������������������������������������������������������������������������������������������������������������������������� 206
Review��������������������������������������������������������������������������������������������������������������������������������� 207
Executing a Pipeline������������������������������������������������������������������������������������������������������������ 209

viii
Table of Contents

Automating Building Unity Projects������������������������������������������������������������������������������������������ 211


Azure Marketplace�������������������������������������������������������������������������������������������������������������� 212
Unity Tools for DevOps Extension���������������������������������������������������������������������������������������� 217
Putting It Together – Building a Unity Pipeline�������������������������������������������������������������������������� 218
Get Project Version Task������������������������������������������������������������������������������������������������������ 221
Unity Setup Task������������������������������������������������������������������������������������������������������������������ 221
Unity Build Task������������������������������������������������������������������������������������������������������������������� 222
Additional Tasks������������������������������������������������������������������������������������������������������������������� 223
Self-Hosting������������������������������������������������������������������������������������������������������������������������������ 224
Self-Hosting Requirements with Azure Pipelines���������������������������������������������������������������� 225
Configuring an Azure Pipelines Agent���������������������������������������������������������������������������������� 226
Configuring the Automation User���������������������������������������������������������������������������������������� 230
Personal Access Token (PAT) for the Automation User�������������������������������������������������������� 232
Mac Users and Build Hosts�������������������������������������������������������������������������������������������������� 234
Configuring the Host������������������������������������������������������������������������������������������������������������ 236
Agent Completion���������������������������������������������������������������������������������������������������������������� 240
Returning to Your Agent Configuration�������������������������������������������������������������������������������� 242
Summary���������������������������������������������������������������������������������������������������������������������������������� 243

Chapter 11: Setting Up GitHub Actions����������������������������������������������������������������� 245


Prerequisites����������������������������������������������������������������������������������������������������������������������������� 246
1. GitHub Account���������������������������������������������������������������������������������������������������������������� 246
2. Source Control����������������������������������������������������������������������������������������������������������������� 247
3. You Need a Unity Project������������������������������������������������������������������������������������������������� 247
Know the Costs������������������������������������������������������������������������������������������������������������������������� 248
Supported Platforms����������������������������������������������������������������������������������������������������������������� 250
Getting Started – Make a Project���������������������������������������������������������������������������������������������� 251
GitHub Actions Permissions and Configuration������������������������������������������������������������������������� 252
1. Actions Permissions/Policies������������������������������������������������������������������������������������������� 254
2. Artifact and Log Retention����������������������������������������������������������������������������������������������� 254
3. Fork or Pull Request from Outside Collaborators������������������������������������������������������������ 255

ix
Table of Contents

4. Workflow Permissions����������������������������������������������������������������������������������������������������� 255


5. Required Workflows (Organization Only)������������������������������������������������������������������������� 255
Personal Access Token (PAT) for the Automation User�������������������������������������������������������������� 256
GitHub Actions Marketplace������������������������������������������������������������������������������������������������������ 261
Using the GameCI Actions to Automate Unity Tasks������������������������������������������������������������������ 262
Setting Up a GameCI Actions Workflow������������������������������������������������������������������������������� 263
License Activation with GameCI������������������������������������������������������������������������������������������ 268
Creating Secrets on GitHub for the Project�������������������������������������������������������������������������� 269
Running the Workflow��������������������������������������������������������������������������������������������������������������� 271
Troubleshooting������������������������������������������������������������������������������������������������������������������������ 273
Self-Hosting Requirements with GitHub Actions����������������������������������������������������������������������� 274
Configuring a GitHub Self-Hosting Agent����������������������������������������������������������������������������� 275
Mac Users and Build Hosts�������������������������������������������������������������������������������������������������� 279
Configuring the Host������������������������������������������������������������������������������������������������������������ 281
Agent Completion���������������������������������������������������������������������������������������������������������������� 284
Using Custom Scripts to Build Unity������������������������������������������������������������������������������������ 287
Example Multibuild Script��������������������������������������������������������������������������������������������������������� 293
GameCI Self-Hosted on Windows���������������������������������������������������������������������������������������������� 295
Summary���������������������������������������������������������������������������������������������������������������������������������� 297

Chapter 12: Final Notes���������������������������������������������������������������������������������������� 299

Index��������������������������������������������������������������������������������������������������������������������� 301

x
About the Author
Simon Jackson is a proud educator, showing developers
how to make the most of modern technology to enable
them to build the best they can using the tools of today
and tomorrow. He is a father/husband and engineer who
is always breaking down new tech and learning something
every day in order to expand his horizons as well, as having
as much fun as possible along the way. Alongside his work
in XR working with the best and brightest to build the next
generation of tech, he is also a strong supporter of open
source and publishing tools and features to accelerate every
developer’s workflow.

xi
About the Technical Reviewer
Jesús Ángel Pérez-Roca Fernández is a professor from
A Coruña, Spain. He teaches web programming using
HTML, CSS, JavaScript, and React. He also teaches mobile
development using Java and Kotlin and video game
development using Unity and C#. He loves programming
and learning new skills, so he enrolls in several online
courses and watches YouTube tutorials about new
technologies, frameworks, and programming skills. He is
also an active member of local technological communities
where they gather to talk about Python, Java, web
technologies, and many other subjects while drinking a few beers. In his free time, he
likes going to the cinema to watch movies, but what he loves most is binge-watching
series sitting on the sofa.

xiii
CHAPTER 1

What Is Automation?

Welcome to this title which aims to save you both time and money with just a small
investment of your most precious commodity for any Unity developer, neurons (brain
matter :D), and thanks to this title, far less than would be expended by going at it alone
or, worse, asking for help on your social feeds.
Automation, often seen as a dark art or long-lost treasure that is hard to seek and
even harder to find, can save you countless hours of repetitive tasks and look ahead to
help avoid troubles on the road before you plummet off the cliff of despair, such as when
Apple suddenly does not accept builds with feature X, because Unity…

1
© Simon Jackson 2023
S. Jackson, Accelerating Unity Through Automation, https://doi.org/10.1007/978-1-4842-9508-3_1
Chapter 1 What Is Automation?

What Does Automation Mean for a Unity Developer?

Source control has long been used by most Unity developers; it helps to protect the
investments you make in your Unity project, revealing the history of your code, and
provides you an almost foolproof way to protect your solution from the impacts of
upgrading your project. Whether it is a small hack project or your main income, source
control gives us a measure of protection from the rigors of development, especially when
our beloved development machine decides to spend time with the fairies (provided you
check in and push before you shut down last night, you did push last night, didn’t you?).
But with our code and project hosted on source control, many do not see the
advantages of, or are aware of, the power that comes from our code being online, even
in a private repository. Having code available online means it can be analyzed, checked,
validated, and even built for us, all without lifting a finger. If you are also part of a larger
team, it gives opportunities to reduce workloads on teams “checking” code to ensure
it meets a standard before giving a senior dev the nod to look it over, saving countless
hours of shaking heads and fists. I have lost count of the many times I’ve pushed a
Pull Request (PR) back to a junior developer, simply because they did not format or
document their code to the company’s standards, time I could have used to get another
coffee, a true crime.

2
Chapter 1 What Is Automation?

We will go into more detail in the next chapter, but as a highlight, here are some of
the repetitive tasks that automation can deliver, from the small to very, very large:

• Checking that developers have spelt things correctly

• Validating coding standards to a specification

• Running unit tests automatically to ensure there are no


regression issues

• Ensuring code has the appropriate documentation

• For public repos, checking if the contributor is a valid user and is


not a bot

• Checking the project builds for all target platforms

• Creating builds and signing packages using secrets

And soooo much more. In one case, I created a pipeline that would automatically
up-version the project for each PR that was merged, and when this was published, it
would also increase the development version to ensure it was always ahead of what was
published.
In some more advanced scenarios, I’ve seen some pipelines now employing AI to
scan code for “known vulnerabilities”; in fact, GitHub now offers this as a generic built-­
in service, should you wish to enable it. Scanning code on each check-in/push against
a wealth of known vulnerable code, such as SQL injection, trojans, and suspicious code
that might be rejected by vendor partners or, worse, open your loving title to ­attack/
exploitation.

3
Chapter 1 What Is Automation?

What to Expect from This Title?

With a grasp of the subject, this title will walk you through the A–Y of automation (z is
reserved for future use) as it pertains to building Unity projects. I say Unity projects as
this is valid for any Unity project, not just games (I use it even more for my Enterprise
solutions). You will get to know the terminology involved and the services available and,
given your choice of service, an excellent footing to getting your own automation setup
in hours rather than days/weeks.
If implemented correctly, you should almost immediately notice the cost-savings
from utilizing automation, and it will eventually lead you to building/adding your own
automation techniques that are specific to your requirements; no one path exists for
automation as everyone’s needs are unique, but they all have common traits.
So, sit back, pull up a fresh brew, adorn your reading glasses if you have them, and let
us get started on this journey.

4
Chapter 1 What Is Automation?

Looking Ahead
Here is a rundown of what to expect:

• What Is Gained Through Automation, the Highlights!


    A walk-through of some of the most common automation tasks and their
benefits.

• Services Covered by This Title


    An overview of the common automation platforms available for Unity
builders today.

• The Structure of Automation


    A walk-through of the language and terminology of automation.

• Automation Hosting
    If you Should you use online hardware for running your automation, or
use your own hardware instead to save some cash, as well as some tips
and tricks.

• Validation, Checking Your Code


    A discussion on the many options to validate code, comments, and
documentation for your project to ensure it is maintainable and does
not incur security risks.

• Testing, Making Sure It Runs


    Should you test or not and the many benefits of ensuring your project
is always in a runnable state for all your target platforms.

• Building and Publishing


    Build it and ship it, streamlining the publication process of
your dream.

• Setting Up Unity Gaming Services Automation


    An in-depth walk-through into setting up and using Unity's own
automation services for managing your project.

• Setting Up Azure DevOps

5
Chapter 1 What Is Automation?

    An in-depth walk-through into setting up and using Microsoft Azure's


free automation services for managing your project.

• Setting Up GitHub Actions


    An in-depth walk-through into setting up and using GitHub's free
automation services for managing your project.

• Final Notes
    A personal walk-through of the recommended paths for using automation
in production projects and some final tips.

I hope you enjoy the journey.

6
CHAPTER 2

What Is Gained
Through Automation,
the Highlights!

The list of possibilities in automation is almost endless, just about anything you would
want to happen is available; the only real question is if someone has gone to the effort
of publishing a plugin or extension that you can simply call (with parameters) to do the
task. And the community does love to publish.
The main challenge when building your automation pipelines is to know how much
time to invest in finding pre-built solutions or whether you just build it yourself (and
then decide to publish it? maybe).

7
© Simon Jackson 2023
S. Jackson, Accelerating Unity Through Automation, https://doi.org/10.1007/978-1-4842-9508-3_2
Chapter 2 What Is Gained Through Automation, the Highlights!

To get you started, this chapter will meander through some of the possibilities for
the art of the possible to set you on your path, as knowing just what you can do is half
the battle, beyond doing just the simple/obvious. Ultimately though, the choice is yours
and there is no hard and fast rule for what you should or should not automate, but rather
what is right for your organization or even the project. In some instances, I have defined
different paths based on the style of the project and who is involved:

• Is the project visible to the public for them to comment/contribute to


or is it a private project only used by internal staff?

• How much information do I need to share between projects?

• How critical is the visibility for the velocity/burn-down for a specific


project?

• Who needs access to the results/builds, or do certain staff just need


notifying?

In some large-scale deployments, functionality and assets are managed


independently, and it is only when they are built that they are all pulled together to
produce the final version (something used often in large or AAA-style game projects).
But with this separation, there are checks and balances needed to ensure managers are
kept up to date, and cross-checks are needed to ensure no distance is created between
all the separate units.
In smaller projects, just a build will suffice, and in a lot of cases, not even the final
build, but just to check it can build for ALL the target platforms (the sheer amount of
times I have been focused on one platform, only to find later an approach is not valid
because it does not work on another).
What you do and when you do it is almost as critical as what you do in your
automation, but, ultimately, it needs to service YOUR needs and requirements and not
just be there because someone thought it would be a good idea. Time is money and
even more so when you are moving that time to automation, just because a person is
not running it, a person still must build and maintain the automation, including all
the hardware that is running it incurs a cost somewhere, left unchecked, you could be
burning hours and money rather than making savings, just a thought.

8
Chapter 2 What Is Gained Through Automation, the Highlights!

Example Workflows

Here are some of the most common tasks that can be achieved through automation to
give you a sense of the possible beyond the basics.

9
Chapter 2 What Is Gained Through Automation, the Highlights!

1. Checkout

One of the simplest tasks is to check out code from the repository; some automations
do this automatically, while others require a specific step to ensure the correct code
is pulled. In some cases, this is not the first step, as prechecks can occur to avoid
unnecessary bandwidth use, as well as the time it takes to download large repositories.

You must remember, with automation it is unknown if the host that is running the
automation has ever seen your code, so do not assume it has cloned the code
before. Each run of automation MUST be treated as if it is a brand-new machine
that must be configured to run your automation; never make assumptions about
how the machine is set up!

As indicated earlier, some workflows might require several checkouts to get content
stored in various places; if submodules are involved, make sure to set the parameters
for the checkout to include submodules as well (do not assume it automatically will). If
you have access to the host, you can build up the checkout stage incrementally and just
check the working folder the automation is using to see what is downloaded and where
to ensure it meets your automation/build specifications.

In one workflow, I built a Unity build pipeline for building and validating a Unity Package
(UPM); a UPM package DOES NOT have its own Unity project by default, so the
automation had to clone the project, generate a NEW Unity project, and then copy the
cloned code into the “Packages” folder before any tests or builds could happen.

Getting the code is always the critical step for doing anything, but it may not be your
FIRST step if you need to validate that the person that is kicking off the build has the authority
to do so (you can also add prechecks to workflows for an admin to approve the workflow to
continue) and that they have completed all required tasks before the process continues.

10
Chapter 2 What Is Gained Through Automation, the Highlights!

2. Running Scripts – Bash/PowerShell/Python

The most underrated task that any automation can do is to run scripts to do just
about anything on the build environment; this can range from simply checking that
the required software is installed or that the build host is set up correctly to running
command-line tasks to do just about anything. A lot of community-built tasks will
include a fair amount of scripting, so it is key that you always have a peek inside those
packages to ensure your build host can run those scripts, for example, have Bash or
PowerShell installed on your build environment.

If you are using scripts in automation, it is also critical to SPECIFY what language
or runtime a script is written in for running on the host; this helps both tell the
automation what to expect and informs anyone else having to read or update
your workflow what it was written for. NEVER leave it up to the default as this is
different for different types of hosts.

At the end of the day, all automation does eventually resolve down to a command
that needs to be executed on the host, which is almost always using a command library
native to the host. But remember! Depending on the output of your automation, it may
have different host requirements, so the language used SHOULD be balanced to run on
them all to save you uncertain headaches in the future.

11
Chapter 2 What Is Gained Through Automation, the Highlights!

3. NPM Build and Test

NPM (Node Package Manager) is a favored way of building a lot of projects these days
(less so Unity), especially web or service-based projects. It provides an extensive library
of functionality to both build and host solutions.

Remember, NPM is built on top of NodeJS which also has other requirements. Make
sure either your host or your pipeline includes the critical steps to install both NPM
and its dependencies. As stated earlier, you can never assume that the host running
your automation has ANY of these dependencies installed, so always check.

As far as automation goes, testing NPM is VERY easy as you can run most of the
commands manually on your own machine instead of being wholly dependent on testing
through automation; only the paths involved are likely to change; for everything else, you
can test to your heart’s desires, especially when you are checking the package contains
everything you need BEFORE pushing it out to an NPM hosting service like NPMJS.

Building NPM packages from the ground up is always stressful, especially if you
are including hidden folders or ensuring you are EXCLUDING critical files that
should never make the package. The last thing you want to find in your published
package is any secure or sensitive information, as once it is on the “Internet,” it
is VERY hard to take back. When building packages for publication, test, test, test,
both locally and through iteration when building your workflow and checking your
package result is what you NEED it to be. I’ve lost count of the times messing with
“npmIgnore” definitions to ensure nothing snuck into the package I did not want.

12
Chapter 2 What Is Gained Through Automation, the Highlights!

4. MSBuild Build and Test

Like NPM, MSBuild and “dotnet” are some favored ways to produce and build solutions
or packages; with .NET6, this has gotten even more common with the ability to produce
single executables for projects. Even with Unity projects, additional tasks are usually
needed to run MSBuild or Xcode on the output of a Unity Build to eventually get a
solution that a client can run; these are, at times, the most stressful parts of constructing
a working workflow due to the intricate (and often undocumented) command
parameters needed to get the compiler to produce what you need (which is usually just a
few clicks doing it manually in the code editor).

When looking for MSBuild/Xcode parameters, use SEVERAL sources for


comparison and never trust a single article to tell you how to get it working. You
might get lucky, but in my experience, a quick comparison is your friend so you can
understand what each parameter is doing and which are the critical parameters to
get your project published.

13
Chapter 2 What Is Gained Through Automation, the Highlights!

5. Chat/Mail Integration (Slack/Email)

Sometimes, people just want to know something happened, something good, something
bad, or just that the coffee machine is ready for that next brew of its sweet sultry sauce.
There are many custom plugins out there to do all the hard work for you, and you get
to control what the message is and when it is published; sometimes, these are done
as webhooks from your chat software (both Discord and Slack support webhooks for
talking/listening to APIs), but relying on the API is troublesome as there is little to no
control.
By building notifications into your workflows, you can control the message, ensuring
that only interested parties are notified and when. This is often overlooked, but I have
found it invaluable in ensuring the right channels for communication for the most
repetitive questions. Stop asking me when the build has finished, check this slack
channel! (Or even build a slack bot that can query the automation API that someone can
fire a command at to query it.)

14
Chapter 2 What Is Gained Through Automation, the Highlights!

6. Schedule/Remove Backups

Not all projects are just code, or even code and assets, some also include backend
databases or APIs that need to be consumed. Critically, these also need to be tested
before the next build is pushed out to production and “hopefully” not destroying half the
backend in the process. So, these also need to be included in automation while testing,
but no one should ever test on a live system (should they?), and automation helps here,
scripting a backup of the live service to use or restoring the most recent backup and
spinning up the environment to test against, a real life/time-saver.
Also, when the eventual push to production comes, automation can force a backup
BEFORE the critical task begins to further mitigate any risks during the upgrade and
giving you an almost instantaneous restore if indeed the publication fails, as well as
the critical “oh darn” workflow to automatically restore the production site from the
most recent (or targeted) restore point. If left to manual hands, it always costs more in
time and money with the eventual risks of “human error,” so having done this from the
point of publication goes a long way to reducing those risks and frees up the time for the
technical team who manages it.

15
Chapter 2 What Is Gained Through Automation, the Highlights!

7. Upload Artifacts, Build, and Publish

If everything is successful, the dates have been met and everyone who needs to be
informed has been informed, it is great when automation can simply flick a switch and
push out your latest and greatest (or as in the previous example, go back VERY, VERY
QUICKLY). This publication might be just to the source site, such as GitHub, or even
package/solution hosting sites like OpenUPM or NPMJS; wherever your package needs
to be, there is usually an API or service where you can push it to.

In many projects I have managed, especially when you are flitting between a full
release and development “preview” packages, it is always comforting that I do not
need to do anything, it just all happens automagically through automation. Once
a PR has been merged with development, out pops a new preview release that
consumers can pick up if they want to.

16
Chapter 2 What Is Gained Through Automation, the Highlights!

8. Create Releases on GitHub

Like with publishing, source sites like GitHub and others provide APIs to enable you to
create releases directly on their site, allowing consumers to always see the latest release
when browsing or get notifications because they subscribed to hear about them. There
are also tags (a pointer to a specific check-in) that can be monitored and, in the case of
OpenUPM, used to create a release for you on their platform.

9. Update Project Management Solutions and Workflows

Fed up with your project manager walking up to your desk or emailing you for a status
update, then get automation to automatically update their project plan directly for all
their critical facts and figures. It will not stop them from pestering, but it should reduce
the chatter that always gets in the way of coding (and everyone knows that getting
interrupted always costs you time to get back into the flow).
There are many integrations available in the community, most provided by the
vendors of those solutions, and failing that, there is usually an API you can utilize. One
of the most creative solutions I have seen involved using scripting to effectively do UI
testing and force-clicked/updated the actual software, certainly not for the faint of heart,
but that dev was never asked for an update again, such bliss.

17
Chapter 2 What Is Gained Through Automation, the Highlights!

10. Generate Release Documentation

One of the most tedious tasks in any release is always collating the release notes for what
has changed since the last push. Thankfully, the rest of the community agrees with you,
and there are MANY extensions available to use to build, create, and format release
notes to your preference. Granted, this also means you MUST ensure that both yourself
and your team write PROPER commit messages (you DO WRITE GOOD COMMIT
MESSAGES?) and/or use a form for populating PRs.
But this is truly a lifesaver for a lot of projects. If you want to vet the release note, then
you can always include an “approve” step in your workflow to check the content before it
ships; you know, JUST IN CASE! :D

18
Chapter 2 What Is Gained Through Automation, the Highlights!

11. Publish Documentation

Like release notes, you can also use the likes of DOCFX to generate your documentation
for you and publish to your docs site or even GitHub pages, granted this is provided you
have ensured you have added the correct documentation tags to your code (and not
done a “Unity” of late, such a shame their docs used to be soooo good). You can include
automated checks to ensure the Summary and Include tags have been filled in on PR
submission (or on push in some cases), which increases the value of the documentation.

Personally, I have started to mandate that code be documented, even in hack


projects. If you cannot learn from the project and later understand why something
was done the way it is, then you can never truly learn, and future you (or
replacements) will never understand. Yes, it can be a pain but saves you in the long
run; in fact, sometimes while documenting a method, it has forced me to question
whether it is even needed or if something could be better!

In some cases, I have seen documentation building as an additional type of test,


because if the docs cannot compile but the code can, then it can indicate referencing
issues in your final solution that your unit tests might be missing/lacking.

19
Chapter 2 What Is Gained Through Automation, the Highlights!

12. Varying Flows Based on the Submitter

There is no rule that every test needs to be run, and in circumstances where additional
checks are not required, you might run a full battery of tests for junior programmers and
skip some for seniors (although personally, I test everything, every time!). But you might
also want to change the reporting based on who submitted the Pull Request (or even
who commented), so it is very useful that most automation provides you with an almost
unlimited number of variations to quantify what runs when.
It is worth investing some time to see what API endpoints and conditions the likes
of GitHub provide (most source sites have the same) to extend your workflow to add
additional steps for certain conditions or even skip steps for certain groups/individuals.

But do not go overboard and remember the KISS principle; only add variation
where it adds value or can save processing time where you know you do not need
to spend it!

20
Chapter 2 What Is Gained Through Automation, the Highlights!

13. Call External APIs for Analytics, Reporting, or PowerBI

Integration is critical in most workflows, especially when you are operating in a large
environment. Yes, the UI does give you certain details, but it can sometimes be awkward
to get stats from. Most workflow systems have an extensive ability to integrate with
third-party APIs (as indicated earlier) and should not be overlooked for externalizing the
performance details of your workflows.
It also goes a long way with “management” if they have great charts and pretty things
they can point to with all the investment in automation, which PowerBI is outstanding
for and worth a look at.

21
Chapter 2 What Is Gained Through Automation, the Highlights!

1 4. Generate/Search for Gifs to Add to a Post/Issue When


Craziness Is Detected or a “lmgtfy” Tag Is Used by an Admin

Not all automations have to be serious; quite regularly (if I can get away with it) on public
projects, I will add some simple but effective workflows to save me time replying to snarky
or badly written questions that could have been resolved simply by putting the title of a
query into a search engine rather than wasting my time having to read an issue posted.
So having comment triggers that look for predefined text (like lmgtfy – let me get/
Google that for you) and post a random gif in its place helps to liven up any tedious
discourse.

I may or may not have in the past also had some workflows to translate some
queries to Klingon, just for fun… Who knows what could be done with some
integration to ChatGPT too these days, just saying….

22
Chapter 2 What Is Gained Through Automation, the Highlights!

1 5. Convert Source Files (yaml/xml/json) to Other Formats


or Perform Bespoke Actions

There are some things for which automation is VERY well suited, especially when
it comes to tedious tasks. I have regularly moved some build tasks back into the
automation and used configuration files to perform the required tasks; this has
ranged from

• Generating tile/map sets for games

• Doing first-pass translation files for sending to a translation party to


review (with caching of course)

• Defining color swatches/sets for use in terrain painting

• Building character models from randomly generated body parts


for review

Essentially, if you can derive configuration for a complex task, you can have
automation generate that content for you, especially useful if sometimes that generation
is complex, and you don’t want to lose access to your machine while it runs.

23
Chapter 2 What Is Gained Through Automation, the Highlights!

16. Integrate with Docker/Kubernetes

Not all automation runs on a physical host, just as not all solutions are deployed to
physical hosts. Containers are evolving deployments more and more these days, and
automation can help significantly with the management and testing of these containers
before they see the light of day.
These are generally integrated as “services” that most automation pipelines can
recognize, with container registries being built into the backend of most automation
platforms, especially as most automation also happens on virtual hosts for the most
basic tasks. It usually requires dedicated paid use to have physical hardware in the cloud
these days.
This availability even extends to Database systems, as shown by the GitHub Services
Examples, showing integrations with MongoDB, Postgres, and Redis.

17. Manage Versioning

One of the first things I stand up in any workflow, especially when I need to release
packages to the open source world, is versioning. Never having to worry if I have
incremented a version number between patch, minor, and major releases is a huge relief.
Just make sure you capture all the points where versioning is critical. Unity is
especially annoying by having multiple places where the version of the built application
is recorded (BundleVersion, MetroVersion, …Version); they are easy enough to handle
with some quick regex (simple, lol), you just need to be aware.

24
Chapter 2 What Is Gained Through Automation, the Highlights!

18. Run Unit Tests and Perform Actions Based on Results

Testing, if done correctly, can be a lifesaver. Granted, it is neither the easiest nor time-­
friendly task, and most developers will shun it for an easier life; however, without testing
you are leaving the health of your project to chance or experience, but remembering
that not everyone has the same experience and, additionally, also has “their own way of
doing things.”
The larger the project, the more critical it is to have dedicated unit testing in place,
although personally, if something is crucial enough, however small, I generally will add
tests to ensure it always operates at least the way I want it and given time, but also to check
that it does not fall flat on its face when the unexpected happens. I have lost count of the
times I have been stuck in an endless loop of figuring out why Unity is crashing, only to
find it was due to it injecting a NULL because the scene was loading (did you know that
Unity loads scenes TWICE when starting in play mode, once to initialize the scene, then it
unloads, and then it runs? If you have code that is “run” dependently, it is VERY annoying).
My advice is to ALWAYS add tests, and if you are not used to writing tests, then at
least learn the basics, and then have automation check those tests on each check-in
and/or build to save your skin for when the unthinkable happens. There are also those
who write tests to build code (Test-Driven Development; however, I am not one of those
developers), and there is value in having decent test coverage for your app/game.

25
Chapter 2 What Is Gained Through Automation, the Highlights!

References

To sum up the wonder that is this chapter, here are some of the sources used to compile
this list; it is in no way extensive as there are SOOO many possibilities when it comes to
automation, from the mission critical to the dastardly hilarious (I have seen pipelines
that check if you have 2FA enabled on your account and will spam you if you do not!).
Have fun with the further reading:

• The awesome list of awesome GitHub Actions

https://github.com/sdras/awesome-actions

• Google’s list of its own GitHub Actions

https://github.com/actions

• The official Azure Marketplace for DevOps extensions

https://marketplace.visualstudio.com/azuredevops/

• Check out Dino’s awesome Unity build tasks

www.unitydevops.com/

There are many resources out there, some you will use right away, others you can
use for inspiration for building your own private automations; there is no wrong way
really, learn from the best, but just be sure to give credit where credit is due if you start
publishing your own.

26
Chapter 2 What Is Gained Through Automation, the Highlights!

Summary
In this chapter, we have covered the majority of the critical tasks that automation can be
used for to speed up our lives and save us time on the most repetitive of tasks.
What is covered here is not exhaustive as the “art of the possible” is almost boundless
when it comes to automation; if you can think, write, or dream it on your local machine,
then the same is possible through automation. In some cases, I have “gone beyond” and
even wrote utilities through automation (a script to validate images for their use as AR
tracking targets using the Google tools, for example).
Dream big and let us get on with the main show.

27
Random documents with unrelated
content Scribd suggests to you:
obstinate ignorance will save them ultimately from the sentence to
return to Siberia, nor from the strokes of the rod which are meted out
to every recaptured fugitive. The captive has to traverse a second
time the penal route, possibly only to make another attempt at
escape shortly after his arrival. I am told that many exiles have
travelled thus four, five, even six times through the greater part of
Siberia.
Fugitives who yield to the temptation to steal or commit some other
crime on the way, come to an untimely end. In such cases the good-
nature of the peasant-villagers is transformed into revengeful anger.
If he is taken, nothing will save him from an agonizing death. Then a
corpse is found on which no marks of violence are noticed. The body
is buried, and the finding and burial are duly notified to the
magistrates, who inform the governor, and he, in his turn,
communicates with the governor-general, but the unhappy victim of
popular fury has rotted in his grave before the government medical
officer could reach the spot, even if he wished to do so. Upon whom
this vengeance has fallen no one knows. In this way, but not by order
of the government, an exile may disappear, and no one can tell what
has befallen him, no authorities are able to give any information. But
every exile who is sent to Siberia knows what awaits him if he should
steal or commit any crime when a fugitive. And for this reason it is
possible to live here, in the midst of thousands of criminals, as
securely as anywhere else, perhaps more securely than in our great
towns which contain the scum of humanity.
I have attempted to give a faithful picture of the conditions which
hold now, or which held in 1876.[87] It has not been my intention to
soften or embellish. Banishment to Siberia is in all cases a severe
punishment. It is more severe in proportion to the culture of the
person on whom it falls, and in the eyes of an educated man it must
always seem terrible. But banishment to Siberia was never meant to
be other than a punishment, and it was meant to fall more heavily on
the educated than on the uneducated. The justice of such a principle
may be disputed, but it cannot be entirely denied. It is only possible,
however, to form a fair idea of the lot of exiles in Siberia when we
compare it with that of our own criminals.
What becomes of the unhappy beings who people our prisons?
What becomes of their families, their wives, their children? What fate
awaits the prisoners when their time of imprisonment has expired;
what have their families to look forward to?
Answers to these questions can be given by all who are acquainted
with our penal institutions.
If the unhappy lot of our criminals be compared, honestly and without
prejudice, with that of the exiles in Siberia, the result will not be
doubtful. Every true friend of humanity must echo the wish which
came to me in the distant East, and which has never since left me:
“If only we had a Siberia too: it would be better for our criminals, and
better for ourselves”.
AN ORNITHOLOGIST ON THE
DANUBE.
Hungary was, and is, and will continue to be one of the goals of the
German ornithologist’s ambition. Situated more favourably than any
other country in Europe, lying as it does between the North Sea and
the Black Sea, the Baltic and the Mediterranean, the great northern
plain and the Alps—including within its boundaries both the North
and the South, steppes and mountains, forests, rivers, and marshes
—it offers great advantages and attractions to resident and
wandering birds alike, and thus possesses a richer bird-fauna
perhaps than any other country in our quarter of the globe.
Enthusiastic descriptions of this wealth, from the pen of our most
illustrious investigators and masters, have contributed not a little to
increase and strengthen the longing—I would almost call it inborn—
that all the bird-lovers of Germany have to see Hungary. It is strange,
however, that this beautiful, rich country, lying so near to us, has
been so rarely visited by Germans.
I myself had seen only its capital and what one can see of the
country from the railway; I therefore shared most thoroughly in the
longing of which I have just spoken. It was to be fulfilled, but only to
return even more ardently thereafter. “None walks unpunished
beneath the palms”, and no lover of birds can spend May-tide in
Fruskagora without having for ever after a longing to return.
“Would you like,” asked my gracious patron, the Crown Prince
Rudolph, “to accompany me to South Hungary for some eagle-
shooting? I have definite reports of perhaps twenty eyries, and I think
that we should all be able to learn much, if we visited them and
observed diligently.”
Twenty eyries! One must have been banished for long years on the
dreary flats of North Germany, one must have gloated over the bright
pictures raised in one’s mind by the glowing reports of some roaming
ornithologist, to appreciate the joy with which I agreed to go. Twenty
eyries, at no very great distance from Vienna and not far from Pesth:
I should not have been my father’s son had I remained indifferent.
The days seemed hours when we were busy with all sorts of
preparations, and again they seemed to lengthen out into weeks,
such was my impatient desire to be off.
It was but a small travelling party that started from Vienna on the
second day of the Easter holidays (1878), but we were merry and
hopeful, eager for sport and energetic. Besides the august lord of the
chase and his illustrious brother-in-law, there were but three—
Obersthofmeister Count Bombelles, Eugen von Homeyer, and
myself. A day later, at Pesth, we got aboard the swift and
comfortable vessel which carried us towards the mouth of the
“blonde” Danube. In Lenten mist suffused with morning sunlight, the
proud Kaiserburg stood out before us, and the gardens of the
Bloxberg were bright with the first green of the young year, as we
took leave of the capital of Hungary.
With the scenery of the Rhine, of the Upper, or even, it is said, of the
Lower Danube, the stretch of country through which we were now
rapidly borne cannot be compared. A few kilometres below the sister
towns the banks become flat, the hills on the right side of the stream
sink into featureless heights, and only in the dim blue distance does
the eye catch the gently curved lines of moderately high ranges.
From the left bank extends the broad plain. Without end, without
change, it stretches in uniform monotony; hardly one of the large,
rich villages is conspicuous enough to catch the eye. Here and there
a herdsman in shepherd’s dress leans on his strong staff, but his
charge is not a flock of simple sheep; grunting, bristly pigs crowd
around him—how brown with the sun he is!—or lie in rows about him
enjoying comfortable rest. Around the pools filled by the floods the
lapwing flutters; over the broad flats the hen-harrier wings its
unsteady flight; the martins sweep in and out of their nests burrowed
in the steep banks; dainty water-wagtails trip about on the shingle-
roofs of the innumerable boatmills; ducks and cormorants rise in
noisy alarm from the stream; while kites and hooded crows fly in
circles over its surface. Such is a picture of this region.
Soon, however, the landscape changes. The alluvial plain, traversed
by the river which made it, broadens out. Over the flats, not yet
protected by dikes, and submerged by every flood, the river extends
in numerous, for the most part nameless branches. A luxuriant
growth of wood clothes the banks and islands, and as the fringe is
too dense to allow any glimpse of the interior, this meadow-wood
bounds the view for mile after mile. Variable and yet monotonous are
the pictures which appear and disappear, as in a dissolving view,
while the ship follows the windings of the stream. Willows and
poplars—white, silvery, and black—elms and oaks, the first
predominating, the last often sparse in their occurrence, form the
material of these pictures. Above the dense fringe, which consists
almost wholly of willow, there rise older trees of the same kind;
beyond these in the woods, which often extend far inland, rise the
impressive crowns of lofty silver poplars and black poplars, and the
bald heads of old gnarled oaks. A single glance embraces all phases
of tree-life from the sprouting willow-shoot to the dying giant—trees
living, sprouting, growing, and exultant in the fulness of their
strength; trees withered at the top, victims of fire from the heavens or
from the earth and half reduced to tinder; trees prostrate on the
ground, crumbling and rotting. Between these we see the gleams of
flowing or standing water; above all is the great dome of heaven. In
the secret shades we hear the song of the nightingale and the
finches, the lyrics of the thrush, the shrill cry of falcon or eagle, the
laugh of the woodpecker, the raven’s croak, and the heron’s shrill
shriek.
Here and there is a glade not yet overgrown, a gap in the wood and
through which we catch a glimpse of the landscape in the
background,—of the broad plain on the right bank of the stream, and
the fringe of hills in the distance, of an apparently endless
succession of fields, from which at distant intervals rise the church
spires which mark the scattered villages or, it may be, townships. In
summer, when all is of one predominantly green hue, in late autumn,
winter, and early spring, when the trees are leafless, this shore
landscape may seem almost dull; now it is monotonous, but yet not
unattractive, for all the willows and poplars have young leaves, or in
many cases catkins, and, here and there at least, they make the
woods gay and gladsome.
Only at a few places is such a wood as this accessible; for the most
part it is a huge morass. If one attempts, either on land or by
waterways, to penetrate into the interior, one, sooner or later,
reaches a jungle which has no parallel in Germany. Only on those
spots which are raised above the level of the river, and which have a
rich, in part muddy soil, is one reminded of German vegetation. Here
lilies of the valley, with their soft, green leaves and fragrant, white
bells, form a most decorative carpeting, covering the ground for wide
stretches; but even here the nettles and bramble-bushes grow in
wanton luxuriance, and various climbing plants spread their tangled
net over wide areas of the forest, so that almost insuperable
obstacles and barriers prevent further progress. In other places the
wood is literally a bog out of which the giant trees rear their stems.
Mighty stems indeed, but many—victims of old age, tempest,
thunderbolt, and the careless herdsman’s fire—lie rotting in the
water, already forming, in many cases, the soil from which rises a
younger and vigorous growth of underwood. Other trees, which have
not yet succumbed to decay, lie prostrate and bar the way. The wind
has swept the fallen wood, both thick branches and delicate twigs,
into floating islands and obtrusive snags, which present to the small
boat obstacles not less difficult than those which obstruct the
explorer on foot. Similar floating islands, composed of reeds and
sedges, form a deceptive covering over wide stretches of water.
Raised mud-banks, on which willows and poplars have found a
suitable soil for their seeds, have become impenetrable thickets,
disputing the possession of the ground even with the forests of reeds
which are often many square miles in extent. Dwarf willows, at once
youthful and senile forests, form dark patches in the heart of the
reed-beds. What may be concealed in the gloomy wood, with its
bogs and thickets, or by the reeds, remains almost quite hidden from
the searching eye of the naturalist, for he can see through no more
than the fringe of this wilderness, nor traverse it except along the
broader waterways.
Fig. 79.—Herons and their Nests.

Such was the district in which our sport began. The eagles, the royal
rulers of the air, which formed the primary object of our quest, did
not, indeed, come within range, nor even within sight, on the first day
of our journey; but, on the other hand, we visited the famous heronry
on the island of Adony, and had abundant opportunities of observing
the life of the brooding birds. For two generations, herons and
cormorants have nested on the tall trees of the island, among the
much older residents—the rooks; and, though the cormorants have
greatly diminished in numbers since the beginning of the sixties, they
have not yet entirely disappeared. Forty years ago, according to
Landbeck’s estimate, there nested here about one thousand pairs of
night-herons, two hundred and fifty pairs of common herons, fifty
pairs of little egrets, and a hundred pairs of cormorants; but now the
rooks, of which there are from fifteen hundred to two thousand pairs,
form the great bulk of the colony, while the common herons have
dwindled to about a hundred and fifty, the night-herons to thirty or
forty pairs, the egrets have disappeared entirely, and only the
cormorants remain in approximately the same numbers as formerly.
Yet at least an echo of the former life rang in our ears as we set foot
on the island, and here and there the forest still presents the old
picture almost unchanged.
The various birds in such a mixed heronry appear to live in the best
accord, yet there is neither peace nor friendliness among them. One
oppresses and supports, plunders and feeds the other. The herons
invade the rooks’ colonies to save themselves the labour of nest-
building; the rooks collect twigs and build their nests, and the herons
drive them away, that they may take forcible possession of the nests,
or at any rate of the building material; the cormorants dispute with
the herons the possession of the stolen booty, and finally assume
despotic authority over the entire colony. But even they, thieves and
robbers as they are, are plundered and robbed in their turn, for the
crows and kites—the last being seldom absent from such
settlements—feed themselves and their young to no slight extent on
the fish which the herons and cormorants have brought for the
sustenance of their mates and young. The first meeting of the
various kinds of brooding birds is hostile. Violent and protracted
battles are fought, and the ten times vanquished renews hostilities
for the eleventh time before he learns to submit to the inevitable. But
in time the inter-relations are better adjusted, as the individual
members of the colony recognize that there are advantages in social
life, and that there is room enough for peaceable neighbours.
Fighting and quarrelling never cease entirely, but the bitter war of
species against species gives place gradually to conditions which
are at least endurable. The birds become accustomed to each other,
and make use of the capabilities of their adversaries as far as may
be. It may even happen, indeed, that those who have been
plundered follow those who have robbed them when the latter find it
necessary to change their brooding-places.
Fig. 80.—Rooks and their Nests.

The spectacle of a mixed heronry is fascinating in the highest


degree. “There is hardly anything”, writes Baldamus, “more varied,
more attractive, more beautiful, than these Hungarian marshes with
their bird-life, which is remarkable both for the number of individuals
and for their variety of form and colouring. Let any one look at the
most conspicuous of these marsh-dwellers in a collection, and then
let him endeavour to picture them to himself standing, walking,
running, climbing, flying, in short, living, and he will be obliged to
admit that such bird-life is marvellously attractive.” This description is
correct even if it be applied to the impoverished island of Adony.
Much as its once teeming population has dwindled, there are still
thousands and thousands of birds. For long stretches of the forest
every high tree bears nests, many having twenty or thirty, and all
about these is the noisy bustle of sociable bird-life. Upon the nests
sit the female rooks, common herons, night-herons, and cormorants,
looking out with dark, sulphur-yellow, blood-red, and sea-green eyes
upon the intruder who has invaded their sanctuary; sitting and
climbing on the topmost boughs of the giant trees, or fluttering,
flying, floating above them are black, brown, gray, one-coloured and
many-coloured, dull and shimmering bird forms; above these, kites
are circling; on the trunks woodpeckers are hanging, hard at work;
sleek, gleaming white-throats are seeking their daily bread among
the blossom of a pear-tree, finches and willow-wrens among the
fresh foliage of the bird-cherry. The beautiful carpet of woodruff
which covers the ground in many places is spattered and soiled with
the excrement of birds, and disfigured by broken eggs or their shells,
and by decomposing fish which have fallen from the nests.
The first shot from the gun of our gracious patron caused an
indescribable confusion. The startled herons rose screaming, and
the rooks with stupefying croaking; the cormorants, too, forsook their
nests with angry screeches. A cloud of birds formed over the forest,
drifted hither and thither, up and down, became denser and
overshadowed the tree-tops, broke up into groups which sank
hesitatingly down towards their forsaken nests, enveloped these
completely for a little, and then united again with the main mass.
Every single one screamed, croaked, cawed, and screeched in the
most ear-piercing fashion; everyone took to flight, but was drawn
back again by anxiety for nest and eggs. The whole forest was in an
uproar; yet, careless of the terrifying noise, the finch warbled its
spring greeting amidst the trees, a woodpecker called joyously, the
nightingales poured forth their inspiring melody, and poetic souls
revealed themselves even among the thieves and robbers.
Richly laden with booty, we returned, after five hours’ sport, to our
comfortable quarters on board ship, and occupied ourselves as we
steamed further with the scientific arrangement of our newly-
acquired treasures. For hours we travelled through forests such as I
have depicted, now and then passing by large or small hamlets,
villages, and towns, until the gathering darkness forced us to moor
our vessel. In the early dawn of the following morning we reached
Apatin. The firing of cannon, music, and joyous acclamation greet
the much-loved heir to the throne. People of all sorts throng about
the boat; native hunting-assistants, nest-seekers, tree-climbers, and
bird-skinners come on board; more than a dozen of the little boats
called “Ezikela” are loaded. Then our steamer turns up stream again,
to land us in the neighbourhood of a broad arm of the river. Up this
we penetrated for the first time into the damp meadow-forests. All the
little boats which had joined us in Apatin followed our larger one, like
ducklings swimming after a mother duck. To-day the chase is
directed solely against the sea eagle which broods so abundantly in
these forests that no fewer than five eyries could be found within a
radius of a square mile. We separated with the sportsman’s salute,
to approach these eyries from different directions.
I was well acquainted with these bold and rapacious, if rather ignoble
birds of prey, for I had seen them in Norway and Lapland, in Siberia
and in Egypt, but I had never observed them beside their eyries; and
the opportunity of doing so was most welcome. As his name implies,
the favourite habitat of the sea-eagle is by the sea-coasts, or on the
banks of lakes and rivers rich in fish. If winter drives him from his
haunts, he migrates as far southwards as is necessary to enable him
to pick up a living during the cold months. In Hungary, this eagle is
the commonest of all the large birds of prey; he does not forsake the
country even in winter, and only makes long expeditions in his earlier
years before maturity, as though he wished to try the experiment of
living abroad. During spring, therefore, one sees in that district only
adult, or what comes to the same thing, full-grown birds capable of
reproduction, while in autumn and winter there are, in addition, the
young ones which left the nest only a few months before. Then also
many wanderers who have not settled down come to enliven the
forest-shores of the Danube. As long as the river is not covered with
ice, they have no difficulty in finding food; for they hunt in the water
not less, perhaps rather more skilfully than on land. They circle over
the water until they spy a fish, then throw themselves down upon it
like a flash of lightning, dive after it, sometimes disappearing
completely beneath the waves, but working their way quickly to the
surface again by aid of their powerful wings, carry off their victim,
whose scaly armour has been penetrated by their irresistible talons,
and devour it at their leisure. As their depredations are not so
severely condemned in Hungary as with us, and as they are treated
generally with undeserved forbearance, they regularly frequent the
neighbourhood of the fishermen’s huts, and sit among the trees
close by until the fisherman throws them stale fish or any refuse
which they can eat. Like the fishermen, the Hungarian, Servian, and
Slav peasants help to provide them with food, for, instead of burying
animals which have died, they let them lie exposed in the fields, and
leave it to the eagles and the vultures, or to dogs and wolves, to
remove the carrion. If a covering of ice protects his usual prey, and
no carrion is available, the sea-eagle need not yet starve; for, like the
nobler and more courageous golden eagle, he hunts all game which
he has a chance of overpowering. He attacks the fox as well as the
hare, the hedgehog and the rat, the diver and the wild goose, steals
from the mother seal her sucking young, and may even carry his
blind rapacity so far as to strike his powerful talons into the back of a
dolphin or a sturgeon, by whom he is carried down into the sea and
drowned before he can free his claws. Under some circumstances
he will even attack human beings. Thus he need hardly ever suffer
want; and as he is not systematically hunted, he leads quite an
enviable life.
Fig. 81.—Sea-eagle and Nest in a Danube Forest.

Until near the breeding-time, the sea-eagle lives at peace with his
fellows; but, as that season approaches, he becomes combative and
quarrelsome, in most cases through jealousy. For the sake of mate
and eyrie, he wages bitter war with others of his species. An eagle
pair, once united, remain so for life, but only if the male is able to
protect his mate from the wooing of others, and to defend his own
eyrie. A male eagle, which has just reached maturity and is exulting
in the consciousness of his strength, casts his eyes longingly upon
the mate and eyrie of another eagle, and both are lost to their owner
if he allows himself to be vanquished in fight by the intruder. The
rightful lord, therefore, fights to the death against everyone who
attempts to disturb his marital and domestic happiness. The battle
begins high in the air, but is often finished on the ground. With beak
and claw, first one, then the other ventures an assault; at length one
succeeds in getting a grip of his adversary, whose talons, in return,
are promptly fixed in his rival’s body. Like balls of feathers, the two
fall to the ground, or into the water, when both let go their hold, but
only to renew the attack. When they fight on the ground, the rivals
challenge one another like enraged cocks, and blood and feathers
left behind show the scene of the battle and bear witness to its
deadly seriousness. The female circles above the combatants or
watches them from her high perch with seeming indifference, but she
never fails to caress the conqueror, whether he be her lawful spouse
or the new-comer. Woe to the eagle if he does not succeed in
repulsing the intruder! In the eyes of the female, none but the strong
deserves the fair.
After successfully repelled attacks and fights of that kind, from which
no eagle is exempt, and which are said to be repeated in Hungary
every year, the pair, probably long wedded, take possession of the
old eyrie, and begin, in February, to repair it. Both birds set to work
to collect the necessary material, picking it up from the ground, or
from the water, or breaking it off the trees, and carrying it in their
talons, often for a long distance, to the nest, to rebuild and improve
this as well as an eagle can. As this building up of the old nest takes
place every year, it gradually grows to a considerable height, and
one can tell from it the age of the birds, and may also guess the
probable duration of their wedded life; for the oldest nest contains
the oldest pair of eagles. The nest is not always placed among the
highest branches of the tree, but is in all cases high above the
ground, more or less near the trunk, and always on strong boughs
which can bear its heavy and ever-increasing weight. Both upper
and lower tiers consist of sticks and twigs laid loosely above and
across one another; and many pairs of hedge-sparrows, which
approach the mighty birds quite boldly and confidently, find among
these twigs cavities suitable for nesting or hiding.
Towards the end of February, or in the beginning of March, the
female lays two, or at most three eggs in the shallow nest-cavity, and
begins brooding assiduously. The male meantime supplies her with
food, not, however, making longer expeditions in search of it than are
absolutely necessary, but spending whatever time he can spare from
the work of providing for her and himself, sitting, a faithful and
attentive guardian, on a tree in the neighbourhood, which serves him
at once as perch and sleeping-place. After about four weeks of
brooding, the young emerge from the eggs, looking at first like soft
balls of wool, from which dark eyes peer forth, and a dark bill and
very sharp claws protrude. Even in their earliest youth the little
creatures are as pretty as they are self-possessed. Now there is
work enough for both father and mother. The two take turns in going
forth to seek for prey, and in mounting guard over the little ones; but
it is the mother who tends them. The father honestly performs his
part in the rearing of the brood; but the mother alone is capable of
giving them that care and attention which may be described as
nursing. If she were torn from them in the first days of their life, they
would perish as surely as young mammals robbed of their suckling
mother. With her own breast the eagle-mother protects them from
frost and snow; from her own crop she supplies them with warmed,
softened, and partly-digested food. The eagle-father does not render
such nursing services as these, but if the mother perish when the
young are half-grown, he unhesitatingly takes upon himself the task
of rearing and feeding them, and often performs it with the most self-
sacrificing toil. The young eagles grow rapidly. In the third week of
their existence the upper surface of the body is covered with
feathers; towards the end of May they are full-grown and fully
fledged. Then they leave the nest, to prepare, under the guidance of
their parents, for the business of life.
This is a picture, drawn with hasty strokes, of the life of the eagle,
which, for the next few days, was the object of our expeditions. No
fewer than nineteen inhabited eyries were visited by us with varying
success. Now on foot, now in little boats, now jumping and wading,
now creeping and gliding, we endeavoured, unseen and unheard, to
approach the trees bearing the nests; for hours we crouched
expectantly beneath them in huts hastily built with branches, gazing
eagerly up at the eagles, which, startled by us or others, were
wheeling and circling high in the air, and showing no inclination to
return to their nests, but which we knew must return sometime, and
would probably fall victims to us. We were able to observe them very
accurately and fully, and this eagle-hunt gained, therefore, an
indescribable charm for us all.
Except for the eagles and other birds of prey which we secured, the
forests, which looked so promising, proved, or at any rate seemed,
to be poor in feathered inhabitants. Of course it was early in the year,
and the stream of migration was still in full flood; nor did we succeed
in investigating more than the outskirts of the forest. But even the
number of birds which had returned and taken up their quarters on
the outskirts of the forest did not come up to our expectations. And
yet this apparent poverty disappointed me less than the lack of good
songsters. The song-thrush did indeed pour forth its rich music
through the woods fragrant with the breath of spring; here and there
a nightingale sang; the finch warbled its spring greeting everywhere;
and even a white-throat tried its notes, but none of these satisfied
our critical ear. All who sang or warbled seemed merely bunglers,
not masters. And at last we began to feel that real song did not
belong to those dark woods at all, that the cries of eagles and
falcons, the hooting of horned owls and screech-owls, the croaking
of water-hens and terns, the shrill cry of herons and the laughter of
woodpeckers, the cuckoos’ call and the cooing of stock-doves were
the music best befitting them, and that, besides these, the only bird
that had a right to sing was the sedge-warbler, who lived among the
reeds and bulrushes, and who had borrowed most of his intricate
song from the frogs.
On the fourth day we hunted in the Keskender forest, a few miles
from the banks of the Danube. As we left the forests on the river
banks, we had to traverse a great plain bounded in the far distance
by a chain of hills. Our route lay through well-cultivated fields
belonging to the large estate of Bellye—a model of good
management—and we made rapid progress on swift horses. Here
and there marshy meadows, with pools and ditches, a little thicket,
large farm-buildings surrounded by gnarled oaks, a hamlet, a village,
but for the most part treeless fields; this was the character of the
district through which we hastened. Larks innumerable rose singing
from the fields; dainty water-wagtails tripped about the roads; shrikes
and corn-buntings sat on every wayside hedge; brooding jackdaws
and starlings bustled and clamoured about their nests in the crowns
of the oaks; above the ponds ospreys were wheeling on the outlook
for fish, and graceful terns skimmed along in zigzag flight; the
lapwing busied itself in the marshes. Apart from these, we observed
very few birds. Even the Keskender wood, a well-kept forest, which
we reached after two hours’ riding, was poor in species,
notwithstanding its varied character. There, however, were the nests
of spotted-eagles and ospreys, short-toed eagles and common
buzzards, falcons, owls, and, above all, black storks in surprising
numbers, and our expedition was therefore successful beyond all
expectation. And yet the foresters, who, in anticipation of the Crown
Prince’s visit, had, only a few days before, searched the woods and
noted the position of the various eyries on a hastily constructed map,
did not know of nearly all the birds of prey and black storks nesting in
the forest. “It is like Paradise here,” remarked the Crown Prince
Rudolf, and these words accurately described the relations between
men and animals in Hungary. Like the Oriental, the Hungarian is
happily not possessed by the mania for killing which has caused the
extreme shyness of the animals, and the painfully evident poverty of
animal life in Western Europe; he does not grudge a home even to
the bird of prey which settles on his land, and he does not make
constant and cruel raids on the animal world, which lives and moves
about him. Not even the low self-interest which at present prompts
covetous feather-dealers to make yearly expeditions to the marshes
of the lower Danube, and which sacrifices hundreds of thousands of
happy and interesting bird-lives for the sake of their feathers, has
had power to move the Magyar from his good old customs. It may be
that indifference to the animal life around him has something to do
with his hospitality; but the hospitality is there, and it has not yet
given place to a thirst for persecution. Animals, and especially birds,
remain quite confidently in the neighbourhood of men; they go about
their own affairs quite unconcerned as to what men may be doing.
The eagle has his eyrie by the roadside, the raven nests among the
trees in the field, the black or wood stork is hardly more shy than the
sacred house-stork; the deer does not rise from his lair when a
carriage passes within rifle-range. Verily, it is like Paradise.
But we found a state of paradise elsewhere than in the Keskender
forest. After we had roamed through the forest in many directions,
and had visited more than twenty eyries of buzzards and ospreys
and black storks, and had refreshed and strengthened ourselves
with an excellent breakfast provided for us, and still more with the
delicious wine of the district, we set out on our return journey to the
ship, urged to haste by threatening thunder-clouds, but still hunting
and collecting as time and opportunity allowed. Our route was
different from that which we had followed in coming to the forest; it
was a good high-road connecting a number of villages. We passed
through several of those, and again the road led us between houses.
There was nothing remarkable about the buildings, but the people
were stranger than my fancy could have pictured. The population of
Dalyok consists almost solely of Schokazen or Catholic Servians,
who migrated from the Balkan Peninsula, or were brought thither by
the Turks, during the period of the Turkish supremacy. They are
handsome, slender people these Schokazen, the men tall and
strong, the women at least equal to the men, extremely well built and
apparently rather pretty. We could form a definite opinion with regard
to their figures, but, as far as their faces were concerned, we had to
depend to some extent on our own imagination. For the Schokaz
women wear a style of dress which will hardly be found elsewhere
within the boundaries of Europe at the present day: a dress which
our princely patron, happy as usual in his descriptions, called
mythological. When I say that head and face were almost entirely
enveloped in quaintly yet not unpicturesquely wound and knotted
cloths, and that the skirt was replaced by two gaily-coloured apron-
like pieces of cloth, not connected with each other, I may leave the
rest to the most lively imagination without fearing that it will be likely
to exceed the actual state of things. For my own part I was reminded
of a camp of Arab nomad herdsmen which I had once seen in the
primitive forests of Central Africa.
At dusk, under pouring rain, we reached our comfortable vessel.
Rain fell the following morning also, the whole day was gloomy, and
our expedition was proportionately disappointing. All this impelled us
to continue our journey, though we look back gratefully on those
pleasant days on the Bellye estate, and though it would have been
well worth while to have observed and collected there a few days
longer. With warm and well-earned words of praise the Crown Prince
bade farewell to the officials on the archducal estate; one glance
more at the woods which had offered us so much, and our swift little
vessel steams down the Danube again. After a few hours we reach
Draueck, the mouth of the river Drau, which thenceforward seems to
determine the direction of the Danube bed. One of the grandest river
pictures I have ever seen presented itself to our gaze. A vast sheet
of water spread out before us; towards the south it is bounded by
smiling hills, on all the other sides by forests, such as we had
already seen. Neither the course of the main stream nor the bed of
its tributary could be made out; the whole enormous sheet of water
was like an inclosed lake whose banks were only visible at the chain
of hills above mentioned; for through the green vistas of the forest
one saw more water, thickets, and reed-beds, these last covering the
great marsh of Hullo, which stretches out in apparently endless
extent. Giant tree-trunks, carried down by both streams, and only
partly submerged, assumed the most fantastic shapes; it seemed as
if fabled creatures of the primitive world reared their scaly bodies
above the dark flood. For the “blonde” Danube looked dark, almost
black, as we sped through the Draueck. Grayish-black and dark-blue
thunder-clouds hung in the heavens, apparently also amidst the
hundred-toned green of the forests, and over the unvarying faded
yellow of the reed-beds; flashes of lightning illumined the whole
picture vividly; the rain splashed down; the thunder rolled; the wind
howled through the tops of the tall old trees, lashed up the surface of
the water, and crowned the dark crests of the waves with gray-white
foam; but away in the south-east the sun had broken through the
dark clouds, edged them with purple and gold, illumined them so that
the black shadows grew yet blacker, and shone brightly down on the
smiling hills, which lead up to a mountain range far away on the
horizon. Below and beyond us lay hamlets and villages, but, where
we were, at most a cone-shaped, reed-covered fisher-hut broke the
primeval character of the magnificent scene, which, in its wildness
and in the weird effect of the momentary flashes of light, was
sublime beyond description.
The scarcity of birds was striking, as indeed was the desolateness of
the whole sheet of water. Not a gull floated over the mirror of the
Danube, not a tern winged its zigzag flight up and down; at most a
few drakes rose from the river. Now and then a common heron, a
flight of night-herons, an erne, and a few kites, hooded crows and
ravens, perhaps also a flock of lapwings, and the list of birds which
one usually sees is exhausted.
From the following day onwards we hunted and explored a wonderful
district. The blue mountains, upon which lay bright, golden sunlight
during the thunder-storm of the previous day, are the heights of
Fruskagora, a wooded hill range of the most delightful kind. Count
Rudolf Chotek had prepared everything for the fitting reception of our
Prince, and thus we enjoyed several days which can never be
forgotten. From the village of Čerewič, on the upper side of which
our vessel lay, we drove daily through the gorges, climbed the
heights on foot or on horseback, to return homewards each evening
delighted and invigorated. The golden May-tide refreshed heart and
soul, and our host’s untiring attention, complaisance, courtesy, and
kindness went far to make the days passed at Fruskagora the
pleasantest and most valuable part of our whole journey.
It was a charming district, about which we roamed every day. Around
the village was a range of fields; beyond these a girdle of vineyards
which reach to the very edge of the forest; in the valleys and gorges
between them the innumerable fruit trees were laden with fragrant
blossom, which brightened the whole landscape; on the banks,
beside the road which usually led through the valleys, there was a
dense growth of bushes, and the refreshing charm of the wealth of
blossom was enhanced by the murmuring brooks and trickling
runlets of water. From the first heights we reached the view was
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookmass.com

You might also like