Go로 슬랙 채널을 열어서 Alfred Workflow를 만들어 봤어요.

27701 단어 GoSlackAlfredtech
Go를 배우고 싶었고, 평소 사용하던 Alfred의 Workflow를 만들어 봤다.
이번에 만든 것들에 대한 소개와 공개되기 전에 했던 일들을 정리하고 싶습니다.

이른바 Alfred Workflow


Alfred는 다기능의 빠른 시작 응용 프로그램입니다.
무료 버전에서도 이용할 수 있지만 유료 버전 구매를 통해 워크플로우 기능을 이용할 수 있다.
Workflow 기능은 명령을 입력하여 다양한 작업을 수행하는 기능입니다.워크플로우 기능을 사용할 수 있다면 자체 제작하거나 공개된 워크플로우를 사용해 다양한 조작을 할 수 있다.
자주 사용하는 물건을 총결하였다.
https://github.com/zenorocha/alfred-workflows

제작된 Alfred Workflow 소개


이번에 제작된 Workflow는 slack의 채널을 지정하고 slack 앱으로 채널을 켜는 간단한 것이다.
https://github.com/monda00/alfred-slack-workflow

기능

  • 슬랙 앱을 통해 채널 열기
  • 캐시 업데이트 채널 일람

  • 채널을 열 때 채널 목록을 가져올 때마다 시간이 걸려서 캐시에 저장됩니다.

    Go로 처리 부분 만들기.


    다음은 실제 제작된 부분을 소개한다.
    먼저 Go로 처리 부분을 구현합니다.
    이름이 awgo인 프로그램 라이브러리를 사용하여 Alfred Workflow를 만들 수 있습니다.
    https://pkg.go.dev/github.com/deanishe/awgo
    Go 설치 섹션은 다음과 같습니다.
  • 채널을 여는 명령과 캐시를 업데이트하는 명령을 분리

  • slack-go를 사용하여 채널 일람과 팀 ID를 얻어 캐시를 업데이트합니다
  • .

  • awgo에서 열린 채널을 생성하는 항목
  • Slack 애플리케이션을 통해 Alfred 측면에서 채널을 엽니다.

    실행할 명령 구분

    main.go에서는 채널을 여는 명령과 캐시를 업데이트하는 명령을 명령줄 옵션으로 구분하여 실행할 수 있습니다.
    main.go
    package main
    
    import (
    	"flag"
    
    	aw "github.com/deanishe/awgo"
    )
    
    var (
    	wf         *aw.Workflow
    	cache_dir  = "./cache"
    	cache_file = "cache.json"
    )
    
    type Channel struct {
    	Name   string `json:"name"`
    	ID     string `json:"id"`
    	TeamID string `json:"teamid"`
    }
    
    func init() {
    	wf = aw.New()
    }
    
    func run() {
    	update := flag.Bool("update", false, "Update Channels")
    	open := flag.Bool("open", false, "Open Channel")
    	flag.Parse()
    
    	if *update {
    		updateChannels()
    		return
    	}
    
    	if *open {
    		openChannel()
    		return
    	}
    
    }
    
    func main() {
    	wf.Run(run)
    }
    

    채널 목록 및 팀 ID 가져오기

    update.go에서 slack-go 채널 일람과 팀 ID를 얻었고 awgo의 캐시 기능으로 저장되어 있습니다.
    슬랙의 영패는 Alfred에 환경 변수가 있기 때문에 거기에 저장됩니다.
    update.go
    package main
    
    import (
    	aw "github.com/deanishe/awgo"
    	"github.com/slack-go/slack"
    )
    
    func updateChannels() {
    	wf.NewItem("Update Channels").Valid(true)
    
    	c := aw.NewCache(cache_dir)
    	cfg := aw.NewConfig()
    	token := cfg.Get("SLACK_TOKEN")
    	api := slack.New(token)
    	params := slack.GetConversationsParameters{}
    	channels, _, err_channels := api.GetConversations(&params)
    	team, err_team := api.GetTeamInfo()
    
    	if err_channels != nil || err_team != nil {
    		wf.Warn("Error", "Error occurred in Slack API ")
    	}
    
    	all_channels := make([]Channel, 0)
    	for _, channel := range channels {
    		all_channels = append(all_channels, Channel{
    			Name:   channel.Name,
    			ID:     channel.ID,
    			TeamID: team.ID,
    		})
    	}
    
    	c.StoreJSON(cache_file, all_channels)
    	wf.SendFeedback()
    }
    

    열려는 채널 항목 생성


    캐시 정보에서 열린 채널 항목을 생성합니다.
    알프레드 측에서 채널을 열려면 채널 ID와 팀 ID가 필요하기 때문에 Var 방법으로 이들에게 변수로 넘겼다.
    모든 채널 항목을 생성하면 명령에 지정된 문자열을 사용하여 필터링됩니다.
    open.go
    package main
    
    import (
    	aw "github.com/deanishe/awgo"
    )
    
    func openChannel() {
    	c := aw.NewCache(cache_dir)
    
    	var c_channels []Channel
    	if c.Exists(cache_file) {
    		if err := c.LoadJSON(cache_file, &c_channels); err != nil {
    			wf.FatalError(err)
    		}
    
    		for _, channel := range c_channels {
    			wf.NewItem(channel.Name).
    				Var("teamID", channel.TeamID).
    				Var("channelID", channel.ID).
    				Valid(true)
    		}
    	}
    
    	args := wf.Args()
    	if len(args) > 1 {
    		wf.Filter(args[1])
    	}
    
    	wf.SendFeedback()
    }
    

    Alfred Workflow 만들기


    다음은 Alfred에서 Workflow를 만듭니다.
    Workflow의 전체는 다음과 같다.

    캐시 업데이트


    추가slack-alfred-workflow 옵션은 Go의 실행 파일-update을 실행합니다.

    통로를 열다

    -open 추가 옵션 실행{query} 실행할 때 명령을 통해 열린 채널 이름입니다.

    실제 슬랙 프로그램으로 채널을 엽니다.open 명령을 사용하면 채널 지정에서 슬랙 프로그램을 열 수 있습니다.

    Makefile로 구성


    생성된 실행 파일과 Alfred Workflow의 info.plist 파일을 zip으로 모아 Workflow 파일을 만듭니다.
    SHELL := /bin/bash
    
    PLIST=info.plist
    ICON=icon.png
    EXEC_BIN=slack-alfred-workflow
    DIST_FILE=slack.alfredworkflow
    GO_SRCS=$(shell find -f . \( -name \*.go \))
    
    all: $(DIST_FILE)
    
    $(EXEC_BIN): $(GO_SRCS)
    	go build -o $(EXEC_BIN)
    
    $(DIST_FILE): $(EXEC_BIN) $(CREDITS) $(PLIST)
    	zip -r $(DIST_FILE) $(PLIST) $(ICON) $(EXEC_BIN)
    

    Giithub Action을 사용한 CI/CD


    어렵게 구했기 때문에 기릿허브 액션을 사용했습니다.
    push는 Workflow 파일을 Giithub의Releases에 업로드합니다.
    release.yml
    name: Release
    on:
      push:
        tags:
          - "v*"
    jobs:
      release:
        runs-on: macos-latest
        steps:
          - name: Checkout source codes
            uses: actions/checkout@v2
    
          - name: Step Go environment
            uses: actions/setup-go@v2
            with:
              go-version: 1.16
    
          - name: Restore cache if available
            uses: actions/cache@v2
            with:
              path: ~/go/pkg/mod
              key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
              restore-keys: |
                ${{ runner.os }}-go-
          - name: Download modules
            if: steps.cache.outputs.cache-hit != 'true'
            run: go mod download
    
          - name: Build
            run: make
    
          - name: Create new release
            id: create_release
            uses: actions/create-release@v1
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            with:
              tag_name: ${{ github.ref }}
              release_name: Release ${{ github.ref }}
              draft: false
              prerelease: false
    
          - name: Upload release asset
            id: upload_release_asset
            uses: actions/upload-release-asset@v1
            env:
              GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            with:
              upload_url: ${{ steps.create_release.outputs.upload_url }}
              asset_path: ./slack.alfredworkflow
              asset_name: slack.alfredworkflow
              asset_content_type: application/zip
    

    참고 자료

  • Alfred Workflows - Extend Alfred and Boost Your Productivity
  • deanishe/awgo: Go library for Alfred 3 + 4 workflows
  • aw · pkg.go.dev
  • slack-go/slack: Slack API in Go - community-maintained fork created by the original author, @nlopes
  • deanishe/awgo로 간단히 Alfred Workflow 노트 만들기
  • GiitHub Action의 빠른 시작 - GiitHub Doocs
  • mvdan/github-actions-golang: GitHub Actions as CI for Go
  • Go로 슬랙 채널을 열어서 Alfred Workflow를 만들어 봤어요.
  • 좋은 웹페이지 즐겨찾기