Allow make deploy using token (#79)
* Allow make deploy using token Introduce support for `MM_ADMIN_TOKEN` as an alternative to defining `MM_ADMIN_USERNAME` and `MM_ADMIN_PASSWORD. * reverse README.md authentication schemes * wrap errors * Update build/deploy/main.go Co-Authored-By: Ben Schumacher <ben.schumacher@mattermost.com> * fix linting Co-authored-by: Ben Schumacher <ben.schumacher@mattermost.com>
This commit is contained in:
parent
adf353748e
commit
282a8cf227
2 changed files with 33 additions and 13 deletions
|
@ -34,7 +34,7 @@ This will produce a single plugin file (with support for multiple architectures)
|
||||||
dist/com.example.my-plugin.tar.gz
|
dist/com.example.my-plugin.tar.gz
|
||||||
```
|
```
|
||||||
|
|
||||||
There is a build target to automate deploying and enabling the plugin to your server, but it requires configuration and [http](https://httpie.org/) to be installed:
|
There is a build target to automate deploying and enabling the plugin to your server, but it requires login credentials:
|
||||||
```
|
```
|
||||||
export MM_SERVICESETTINGS_SITEURL=http://localhost:8065
|
export MM_SERVICESETTINGS_SITEURL=http://localhost:8065
|
||||||
export MM_ADMIN_USERNAME=admin
|
export MM_ADMIN_USERNAME=admin
|
||||||
|
@ -42,6 +42,13 @@ export MM_ADMIN_PASSWORD=password
|
||||||
make deploy
|
make deploy
|
||||||
```
|
```
|
||||||
|
|
||||||
|
or configuration of a [personal access token](https://docs.mattermost.com/developer/personal-access-tokens.html):
|
||||||
|
```
|
||||||
|
export MM_SERVICESETTINGS_SITEURL=http://localhost:8065
|
||||||
|
export MM_ADMIN_TOKEN=j44acwd8obn78cdcx7koid4jkr
|
||||||
|
make deploy
|
||||||
|
```
|
||||||
|
|
||||||
Alternatively, if you are running your `mattermost-server` out of a sibling directory by the same name, use the `deploy` target alone to unpack the files into the right directory. You will need to restart your server and manually enable your plugin.
|
Alternatively, if you are running your `mattermost-server` out of a sibling directory by the same name, use the `deploy` target alone to unpack the files into the right directory. You will need to restart your server and manually enable your plugin.
|
||||||
|
|
||||||
In production, deploy and upload your plugin via the [System Console](https://about.mattermost.com/default-plugin-uploads).
|
In production, deploy and upload your plugin via the [System Console](https://about.mattermost.com/default-plugin-uploads).
|
||||||
|
|
|
@ -34,18 +34,38 @@ func deploy() error {
|
||||||
bundlePath := os.Args[2]
|
bundlePath := os.Args[2]
|
||||||
|
|
||||||
siteURL := os.Getenv("MM_SERVICESETTINGS_SITEURL")
|
siteURL := os.Getenv("MM_SERVICESETTINGS_SITEURL")
|
||||||
|
adminToken := os.Getenv("MM_ADMIN_TOKEN")
|
||||||
adminUsername := os.Getenv("MM_ADMIN_USERNAME")
|
adminUsername := os.Getenv("MM_ADMIN_USERNAME")
|
||||||
adminPassword := os.Getenv("MM_ADMIN_PASSWORD")
|
adminPassword := os.Getenv("MM_ADMIN_PASSWORD")
|
||||||
copyTargetDirectory, _ := filepath.Abs("../mattermost-server")
|
copyTargetDirectory, _ := filepath.Abs("../mattermost-server")
|
||||||
if siteURL != "" && adminUsername != "" && adminPassword != "" {
|
|
||||||
return uploadPlugin(pluginID, bundlePath, siteURL, adminUsername, adminPassword)
|
if siteURL != "" {
|
||||||
|
client := model.NewAPIv4Client(siteURL)
|
||||||
|
|
||||||
|
if adminToken != "" {
|
||||||
|
log.Printf("Authenticating using token against %s.", siteURL)
|
||||||
|
client.SetToken(adminToken)
|
||||||
|
|
||||||
|
return uploadPlugin(client, pluginID, bundlePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
if adminUsername != "" && adminPassword != "" {
|
||||||
|
client := model.NewAPIv4Client(siteURL)
|
||||||
|
log.Printf("Authenticating as %s against %s.", adminUsername, siteURL)
|
||||||
|
_, resp := client.Login(adminUsername, adminPassword)
|
||||||
|
if resp.Error != nil {
|
||||||
|
return errors.Wrapf(resp.Error, "failed to login as %s: %s", adminUsername, resp.Error.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return uploadPlugin(client, pluginID, bundlePath)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := os.Stat(copyTargetDirectory)
|
_, err := os.Stat(copyTargetDirectory)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return errors.New("no supported deployment method available, please install plugin manually")
|
return errors.New("no supported deployment method available, please install plugin manually")
|
||||||
} else if err != nil {
|
} else if err != nil {
|
||||||
return errors.Errorf("Failed to stat %s", copyTargetDirectory)
|
return errors.Wrapf(err, "failed to stat %s", copyTargetDirectory)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Printf("Installing plugin to mattermost-server found in %s.", copyTargetDirectory)
|
log.Printf("Installing plugin to mattermost-server found in %s.", copyTargetDirectory)
|
||||||
|
@ -55,14 +75,7 @@ func deploy() error {
|
||||||
|
|
||||||
// uploadPlugin attempts to upload and enable a plugin via the Client4 API.
|
// uploadPlugin attempts to upload and enable a plugin via the Client4 API.
|
||||||
// It will fail if plugin uploads are disabled.
|
// It will fail if plugin uploads are disabled.
|
||||||
func uploadPlugin(pluginID, bundlePath, siteURL, adminUsername, adminPassword string) error {
|
func uploadPlugin(client *model.Client4, pluginID, bundlePath string) error {
|
||||||
client := model.NewAPIv4Client(siteURL)
|
|
||||||
log.Printf("Authenticating as %s against %s.", adminUsername, siteURL)
|
|
||||||
_, resp := client.Login(adminUsername, adminPassword)
|
|
||||||
if resp.Error != nil {
|
|
||||||
return fmt.Errorf("Failed to login as %s: %s", adminUsername, resp.Error.Error())
|
|
||||||
}
|
|
||||||
|
|
||||||
pluginBundle, err := os.Open(bundlePath)
|
pluginBundle, err := os.Open(bundlePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to open %s", bundlePath)
|
return errors.Wrapf(err, "failed to open %s", bundlePath)
|
||||||
|
@ -70,7 +83,7 @@ func uploadPlugin(pluginID, bundlePath, siteURL, adminUsername, adminPassword st
|
||||||
defer pluginBundle.Close()
|
defer pluginBundle.Close()
|
||||||
|
|
||||||
log.Print("Uploading plugin via API.")
|
log.Print("Uploading plugin via API.")
|
||||||
_, resp = client.UploadPluginForced(pluginBundle)
|
_, resp := client.UploadPluginForced(pluginBundle)
|
||||||
if resp.Error != nil {
|
if resp.Error != nil {
|
||||||
return fmt.Errorf("Failed to upload plugin bundle: %s", resp.Error.Error())
|
return fmt.Errorf("Failed to upload plugin bundle: %s", resp.Error.Error())
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue