- Введение
- Как создать
- 1. Скопируйте шаблон
- 2. Сгенерируйте ключ DEV Community API
- 3. Установите API-ключ для GitHub Actions
- 4. Постройте рабочий процесс GitHub Actions
- 5. Связать GitHub с dev.to
- 6. Создайте новую статью
- 7. Установите ID статьи
- 8. Создайте шаблон для новой статьи
- 9. Свяжите ID статьи с шаблоном
- 10. Разверните статью
- Заключение
- Оригинал
- Ссылки
Введение
Я веду блог на японском языке в Zenn, сообществе инженеров, помогающих друг другу. Zenn дает нам возможность управлять своими блогами в репозитории GitHub и писать статьи в моем любимом редакторе. Кроме того, если я сливаю статьи в основную ветку, они автоматически публикуются в моем блоге с помощью CI/CD.
Я хотел бы, чтобы блог dev.to был таким же, и я понимаю, что я управляю своим блогом dev.to в репозитории GitHub и автоматически публикую/обновляю его со ссылкой на эту статью.
https://dev.to/maxime1992/manage-your-dev-to-blog-posts-from-a-git-repo-and-use-continuous-deployment-to-auto-publish-update-them-143j
Я внедряю GitHub Actions CI/CD с помощью DEV API. Основываясь на этой статье, я представляю свой собственный способ управления блогом dev.to.
Как создать
1. Скопируйте шаблон
Перейдите в хранилище авторов статей. https://github.com/Yuhta28/dev-to-blog-template и скопируйте шаблон.
2. Сгенерируйте ключ DEV Community API
Перейдите на сайт https://dev.to/settings/account и сгенерируйте ключ DEV Community API.
3. Установите API-ключ для GitHub Actions
Перейдите в репозиторий GitHub, скопированный из шаблона, и установите API-ключ на секреты Actions.
4. Постройте рабочий процесс GitHub Actions
В справочной статье используйте prettier для форматирования разметки и фрагментов кода. В дополнение к этому я реализую проверку текста с помощью textlint и reviewdog.
name: Build and Deploy
on:
push:
branches: [main]
pull_request:
jobs:
build:
name: Build
if: github.event_name == 'pull_request'
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Install reviewdog
uses: reviewdog/action-setup@v1
with:
reviewdog_version: latest
- name: Install Dependencies
uses: bahmutov/npm-install@v1
#Make sure that cache is retrieved even if steps fail
- name: cache-node-modules
uses: pat-s/always-upload-cache@v3
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
node-
- name: Install textlint
run: 'npm install --save-dev textlint textlint-rule-common-misspellings textlint-rule-spellchecker'
- name: Run textlint
run: npx textlint -f checkstyle "blog-posts/**/*.md" >> .textlint.log
- name: Run reviewdog
if: failure()
env:
REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cat .textlint.log
cat .textlint.log | reviewdog -f=checkstyle -name="textlint" -reporter="github-pr-review"
- name: Run Prettier
run: yarn run prettier:check
- name: Run Embedme
run: yarn run embedme:check
deploy:
name: Deploy
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@master
- name: Install Dependencies
uses: bahmutov/npm-install@v1
- name: Deploy to dev.to
run: DEV_TO_GIT_TOKEN=${{ secrets.DEV_TO_GIT_TOKEN }} yarn run dev-to-git
5. Связать GitHub с dev.to
Определите свойство repository.url
в package.json
и установите его в URL репозитория GitHub.
"name": "dev.to",
"repository": {
"type": "git",
"url": "https://github.com/Yuhta28/dev-to-blog.git"
}
6. Создайте новую статью
Создайте шаблон для новой статьи, чтобы использовать DEV API. go run create-post.go
.
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
)
func main() {
DEVAPIKEY := os.Getenv("DEVAPIKEY") //Set your dev.to API key in your environment variables
client := &http.Client{}
var data = strings.NewReader(`{"article":{"title":"Template","body_markdown":"Body","published":false,"tags":["tag1", "tag2"]}}`)
req, err := http.NewRequest("POST", "https://dev.to/api/articles", data)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("api-key", DEVAPIKEY)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
bodyText, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%sn", bodyText)
}
К сожалению, шаблон не может быть подключен к репозиторию GitHub, поэтому мне нужно получить ID статьи и установить его в dev-to-git.json
, чтобы подключить его к репозиторию GitHub.
7. Установите ID статьи
Получите ID статьи, чтобы также использовать DEV API. go run get-blog-id.go
.
package main
import (
"encoding/json"
"fmt"
"log"
"net/http"
"os"
"github.com/itchyny/gojq"
)
func curl() interface{} {
DEVAPIKEY := os.Getenv("DEVAPIKEY") //Set your dev.to API key in your environment variables
client := &http.Client{}
req, err := http.NewRequest("GET", "https://dev.to/api/articles/me/unpublished", nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("api-key", DEVAPIKEY)
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
var data interface{}
err = json.NewDecoder(resp.Body).Decode(&data)
if err != nil {
log.Fatal(err)
}
return data
}
func main() {
// Parse JSON
query, err := gojq.Parse(".[].id")
if err != nil {
log.Fatalln(err)
}
input := curl()
iter := query.Run(input) // or query.RunWithContext
for {
v, ok := iter.Next()
if !ok {
break
}
if err, ok := v.(error); ok {
log.Fatalln(err)
}
fmt.Printf("%1.0fn", v)
}
}
8. Создайте шаблон для новой статьи
Создайте шаблон для новой статьи. go run make-template.go
.
package main
import (
"fmt"
"os"
)
func main() {
var blog string
print("Enter the name of the new article: ")
fmt.Scan(&blog)
// Create blog directory and article file
if err := os.MkdirAll("blog-posts/"+blog, 0777); err != nil {
fmt.Println(err)
}
file_article, err := os.Create("blog-posts/" + blog + "/" + blog + ".md")
if err != nil {
fmt.Println(err)
}
defer file_article.Close()
// Add blog metadata in article file
file_article.WriteString("---ntitle: Title npublished: falsendescription: descriptionntags: tag1, tag2n---n")
// Create code directory
if err := os.MkdirAll("blog-posts/"+blog+"/code", 0777); err != nil {
fmt.Println(err)
}
file_code, err := os.Create("blog-posts/" + blog + "/code/.gitkeep")
if err != nil {
fmt.Println(err)
}
defer file_code.Close()
// Create assets directory
if err := os.MkdirAll("blog-posts/"+blog+"/assets", 0777); err != nil {
fmt.Println(err)
}
file_assets, err := os.Create("blog-posts/" + blog + "/assets/.gitkeep")
if err != nil {
fmt.Println(err)
}
defer file_assets.Close()
}
9. Свяжите ID статьи с шаблоном
Свяжите ID статьи с шаблоном в dev-to-git.json
.
[
{
"id": 773216,
"relativePathToArticle": "./blog-posts/cw-oss-cloudwatch/i-use-cw-which-is-oss-to-tail-aws-cloudwatch-logs-2e9g.md"
},
{
"id": 1056501,
"relativePathToArticle": "./blog-posts/repography-make-readme-rich/repography-makes-github-repository-beautiful-3dn3.md"
}
]
10. Разверните статью
Управление блогом dev.to в репозитории GitHub завершено. После этого переместите ветку и pull request в основную ветку и запустите GitHub Actions CI/CD.
Заключение
Я управлял своим блогом dev.to в репозитории GitHub. Это облегчает мне контроль версий, и я могу писать статьи, используя мой любимый редактор (Visual Studio code). Более того, инструмент linter помогает мне сократить количество ошибок при написании статей. Итак, давайте попробуем этот метод при написании статей в dev.to.
Оригинал
https://zenn.dev/yuta28/articles/dev-github-vscode
Ссылки
https://dev.to/maxime1992/manage-your-dev-to-blog-posts-from-a-git-repo-and-use-continuous-deployment-to-auto-publish-update-them-143j https://dev.to/beeman/automate-your-dev-posts-using-github-actions-4hp3