inside front cover....2
Shipping Go....3
Copyright....4
dedication....6
contents....7
front matter....12
preface....12
acknowledgments....14
about this book....16
Who should read this book?....16
How this book is organized: A roadmap....17
About the code....18
liveBook discussion forum....19
about the author....19
about the cover illustration....20
Part 1. Startup....22
1 Delivering value....23
1.1 Simple concepts....24
1.2 Small pieces....29
1.2.1 Continuous....32
1.2.2 Process....33
1.2.3 Quality....34
1.2.4 Delivery....35
1.3 Building your product....37
1.3.1 Initial setup....38
1.3.2 Basic validation....38
1.3.3 Zero-cost deployment....39
1.3.4 Code confidence....39
1.3.5 Integrations....40
1.3.6 Portability....40
1.3.7 Adaptability....41
1.3.8 User acceptance....41
1.3.9 Scaled product....42
1.3.10 End to end....42
1.4 Feedback loop....43
Summary....43
2 Introducing continuous integration....44
2.1 Where to start?....46
2.2 A greenfield project....48
2.3 The assembly line....51
2.4 Warehouses....57
2.5 Material....63
Summary....67
3 Introducing continuous testing....68
3.1 What to test....69
3.2 Writing unit tests....73
3.3 Refactor, refactor, refactor....77
3.4 Testing pyramid....87
3.5 System testing....90
3.6 Adding it to the pipeline....98
3.7 Code coverage....101
Summary....107
4 Introducing continuous deployment....109
4.1 Delivery....110
4.2 Developers as operators....114
4.3 Setting up a deployment account....117
4.4 As you like it....122
4.5 Function as a Service (FaaS)....126
4.6 Platform as a Service....131
Summary....135
Part 2. Scaling....137
5 Code quality enforcement....138
5.1 Reviewing code....139
5.1.1 Keep it small....142
5.1.2 Keep an open mind....143
5.1.3 Keep it moving....144
5.1.4 Keep it interesting....145
5.1.5 Keep it the same....146
5.2 Constraints on development....147
5.3 Standardizing our code through format and lint checks....149
5.4 Static code analysis....154
5.5 Code documentation....160
5.6 Git hooks....163
5.7 Flow....165
Summary....167
6 Testing frameworks, mocking, and dependencies....169
6.1 Dependency inversion principle....170
6.2 Defining an interface....171
6.3 Dependency injection....176
6.4 Testing stubs....181
6.5 Mocking....186
6.5.1 Setting up our test suite....188
6.5.2 Using our mocks in test....190
6.6 Fake....196
6.7 Just the base of the pyramid....203
Summary....205
7 Containerized deployment....206
7.1 What is a container?....208
7.2 What is a Buildpack?....211
7.3 Let’s build a container....213
7.4 Adding a container build to your pipeline....214
7.5 Deploying to a container runtime....217
7.6 Writing your own image....220
7.7 Local environment organization....224
7.8 Containers, containers everywhere....227
Summary....228
Part 3. Going public....229
8 Configuration management and stable releases....230
8.1 Configuration....232
8.2 Advanced configuration....234
8.2.1 Environmental variables....236
8.2.2 File....237
8.2.3 Flag....239
8.3 Hiding features....241
8.3.1 Updating the port....243
8.3.2 External client....244
8.4 Semantic versioning....246
8.5 Change log....251
8.6 Accountability and handling failure....254
Summary....258
9 Integration testing....259
9.1 Phasing out the old....260
9.2 Behavior-driven design....262
9.3 Writing BDD tests in Go....264
9.4 Adding a database....271
9.5 Releasing....278
Summary....283
10 Advanced deployment....284
10.1 Not quite IaaS....286
10.2 Your first cluster....288
10.3 Building blocks....289
10.4 Scaling and health status....292
10.5 Automatically deploying....295
10.6 Deploying Redis using Helm....297
10.7 Updating deployment configuration....298
Summary....301
11 The loop....303
11.1 Startup....304
11.2 Acceleration....306
11.3 Cruising....307
11.4 Elements of development....310
11.4.1 Process....311
11.4.2 Testing....314
11.4.3 Delivering....317
11.5 The OODA loop....320
11.6 Conclusion....322
Summary....323
Appendix A. Using Kotlin....324
A.1 Frameworks....324
A.2 Coding....325
A.3 Maven....329
A.4 Testing....329
A.5 Linting and the initial pipeline....332
A.6 Containerizing....334
Appendix B. Using Python....337
B.1 Poetry....337
B.2 Coding....338
B.3 Testing....341
B.4 Nox....342
B.5 Defining the container....344
B.6 Creating the pipeline....345
Appendix C. Using JavaScript....348
C.1 Node Package Manager....348
C.2 Coding....349
C.3 Testing....353
C.4 Linting....354
C.5 Defining the container....356
C.6 Building the pipeline....357
Appendix D. Using Terraform....360
D.1 Building the image....360
D.2 Deploying the image....362
D.3 Creating the pipeline....364
index....366
inside back cover....379
Shipping Go is a hands-on guide to shipping Go-based software. Author Joel Holmes shows you the easy way to set up development pipelines, fully illustrated with practical examples in the powerful Go language. You’ll put continuous delivery and continuous integration into action, and discover instantly useful guidance on automating your team’s build and reacting with agility to customer demands. Your new pipelines will ferry your projects through production and deployment, and also improve your testing, code quality, and production applications.
An effective software delivery pipeline automates all stages, from initial design, through development, deployment, and ultimately the usage experience that feeds back into new features and releases. Go embraces the best practices of Continuous Delivery, and adds a few language-specific tools and twists of its own.
Shipping Go shows you how to build Go-specific software development pipelines. You’ll have a basic CI/CD process up and running by the time you finish Chapter 3, along with an iterative process for designing, releasing, and revising your applications. Then, you’ll systematically upgrade your pipeline to support containerization, integration testing, semantic versioning, and automated deployment. A set of handy appendices help you translate these valuable practices to Kotlin, Python, and JavaScript applications.
For Go developers.