$ composer deploy
Ultimately, there’s still provisioning that’s required on the web to set up certain aspects of a project. But once the general infrastructure is in place, it’s easy to start running everything locally from testing to deployment.
I can’t help but think of this whenever I am working in the Google Cloud Platform: Extremely powerful utilities with a UI that was clearly designed by the same types of people who would use it.
So the final structure of the directory looks something like this:
To run your function locally, run the following command:
Specifically, if you’re working with Google’s Cloud Platform and are using PHP (I favor PHP 8.2 but to each their own, I guess), here are some things that I use in each project to make sure I can focus on solving the problem at hand without navigating too much overhead in setting up a project.
And, as demonstrated, it’s not limited to functions but also to working with Google Cloud Storage, PubSub, Secrets Manager, and other features.
First, make sure you’re authenticated with the same Google account that has access to GCP:
tm-cloud-functions/
├── process-user-info/
│ ├── src/
│ ├── vendor/
│ ├── index.php
│ ├── composer.json
│ ├── composer.lock
│ ├── .env
│ └── ...
├── verify-certificate-expiration/
│ ├── src/
│ ├── vendor/
│ ├── index.php
│ ├── composer.json
│ ├── composer.lock
│ ├── .env
│ └── ...
└── export-site-data/
├── src/
├── vendor/
├── index.php
├── composer.json
├── composer.lock
├── .env
└── ...
Testing
$ gcloud config set project [PROJECT-ID]
All that aside, the documentation is pretty good – using Gemini to work with it is better – and they offer a CLI which makes dealing with the various systems much easier.
Note: Much like .gitignore
, if you’re looking to deploy code to Google Cloud Functions and want to prevent deploying certain files, you can use a
file.
.gcloudignore
So if I have a cloud project called acme-cloud-functions
and then there are three functions contained in the project, then the structure make look something like this:
$ gcloud auth login
For the last few months, I’ve been doing a lot of work with Google Cloud Functions (along with a set of their other tools such as Cloud Storage, PubSub, and Cloud Jobs, etc.).
Finally, props to Christoff and Ivelina for also providing some guidance along setting up some of this.
$ composer functions
Next, in composer.json
, add the following line to your the deploy
section as referenced above:
Remember how UIs used to look in the late 90s and early 00s? The joke was something like “How this application would look when designed by a programmer.”
Then, when you’ve tested your function and are ready to deploy it to GCP, you can run the following command:
Further, those subdirectories are self-contained such that they maintain their own composer.json
configuration, vendor
directories, .env
files for local environmental variables, and other function-specific dependencies, files, and code.
With all of that commentary aside, there are a few things I’ve found to be useful in each project in which I’m involved when they utilize features of GCP.
Deployment
Though we’re free to organize code however we like, I’ve developed enough GCP-based solutions that I have a specific way that I like to organize my project directories so there’s parity between what my team and I will see whenever we login to GCP.
"scripts": {
"functions": "FUNCTION_TARGET=[main-function] php vendor/google/cloud-functions-framework/router.php",
"deploy": [
"..."
]
},
The ability to build systems on top of Google’s Cloud Platform (or GCP) is great. Though the service has a small learning curve in terms of getting familiar with how to use it, the UI looks exactly like what you’d expect from a team of developers responsible for creating such a product.
UX Planet has a comic that captures this:
An Aside on UIs
Conclusion
tm-cloud-functions/
├── process-user-info/
├── verify-certificate-expiration/
└── export-site-data/
It’s simple: The top level directory is named the same as the Google Cloud Project. Each subdirectory represents a single Google Cloud Function.
"deploy": [
"gcloud functions deploy [function-name] --project=[project-id] --region=us-central1 --runtime=php82 --trigger-http --source=. --entry-point=[main-function]"
]
Make sure the following values are set: