Netlify build hook gets called twice
cniklas opened this issue · 5 comments
I really love this plugin due to its simplicity. But there is one problem I can't solve.
I set generated a build hook in Netlify. I entered that build hook in the plugin's settings. I created a page in WordPress and set "Publish to: production" to be true.
Now whenever I update this page in WordPress (edit something and click "Update"), Netlify builds my page twice (see screenshot). In the deployment section I can see that the deploy was triggered by the build hook twice within a few seconds. This happens everytime.
Why is that so? How can I fix it?
Any updates on this?
I assume you are using Gutenberg as it sends two requests to save a document, thus firing that webhook request twice. That action likely needs to be updated with new logic. PRs welcome.
Yes, I (have to) use Gutenberg. Thanks for pointing out where the problem is.
Here is my workaround:
The build hook doesn't trigger Netlify directly but instead a PHP app. Every time that app is called it writes a new entry to a log file and fires the real Netlify build hook – but only if the log file had not been changed within the last 5 seconds.
That's quite an ugly solution but helped me solving the problem with creating too many build requests.
$File = new File(TMP . 'logs' . DS . 'build.log');
if (!$File->exists() || $File->lastChange() < strtotime('-5 seconds')) {
CakeLog::write('netlify', 'go');
$HttpSocket = new HttpSocket();
$HttpSocket->post('https://api.netlify.com/build_hooks/MY_BUILD_HOOK', '{}');
}
@cniklas Where did you add this to?
It's a separate PHP installation located on the same domain as the WordPress site., and made with CakePHP 2 (which is outdated, but you can use any framework you like or even do it with plain PHP).
There I have a super simple controller with a single action:
App::uses('AppController', 'Controller');
App::uses('HttpSocket', 'Network/Http');
App::uses('File', 'Utility');
class JobsController extends AppController {
public function iijdiyqhtmucsnayzkbkttkc()
{
$this->request->allowMethod('post');
$File = new File(TMP . 'logs' . DS . 'build.log');
if (!$File->exists() || $File->lastChange() < strtotime('-5 seconds')) {
$HttpSocket = new HttpSocket();
$HttpSocket->post('https://api.netlify.com/build_hooks/blablabla', '{}');
}
$this->autoRender = false;
}
}
Then I point the WP Buildhook to: https://mydomain/directory-of-cake2app/jobs/iijdiyqhtmucsnayzkbkttkc
and that's it.