node_publish_action is not publishing the node
Contrary to this comment on the API documentation, node_save() is required after node_publish_action() is called.

So the submit handler should look like this:

function mymodule_publish_submit($form, &amp;$form_state) {
  $nid = $form['nid']['#value'];
  $node = node_load($nid, $vid = NULL, $reset = FALSE);
  node_publish_action($node, $context = array());
  node_save($node);
}


As pointed out by jimajamma, the previous code contains a hook_action() which allows integration with Actions. The following code does the same thing, but doesn't use the hook_action()

function mymodule_publish_submit($form, &amp;$form_state) {
  $nid = $form['nid']['#value'];
  $node = node_load($nid, $vid = NULL, $reset = FALSE);
  $node-&gt;status = 1; // 0 = unpublished, 1 = published. There are no other states
  node_save($node);
}


Pretty simple.