Introduction to
GitHub Actions
2019/05/15
Bo-Yi Wu
https://github.com/appleboy
About me
• Software Engineer in Mediatek
• Member of Drone CI/CD Platform
• Member of Gitea Platform
• Member of Gin Golang Framework
• Teacher of Udemy Platform: Golang + Drone
https://blog.wu-boy.com
Develop
Git Push Deploy
Staging
Testing
Git Tag Deploy
Production
Develop
Git Push Deploy
Staging
Testing
Git Tag Deploy
14
Production
GitHub Flow + Git Flow
in opensource
Container Based
CI/CD Platform
Current runtime resource
•1 virtual CPU
• Up to 3.75GB of memory
• 100GB of disk space
28 Events
Write Simple Workflow
|-- hello-world (repository)
| |__ .github
| |__ main.workflow
|
main.workflow
workflow "Remote ssh commands" {
on = "push"
resolves = [
"Remote ssh commands",
]
}
main.workflow
action "Remote ssh commands" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"PASSWORD",
]
args = [
"--user", "actions",
"--script", "whoami",
]
}
Scheduling a workflow
┌───────────── minute (0 - 59)
│ ┌───────────── hour (0 - 23)
│ │ ┌───────────── day of the month (1 - 31)
│ │ │ ┌───────────── month (1 - 12 or JAN-DEC)
│ │ │ │ ┌───────────── day of the week (0 - 6 or SUN-SAT)
│││││
│││││
│││││
workflow "New workflow" {
*****
on = "schedule(*/15 * * * *)"
resolves = ["Hello World"]
}
What’s problem in UI?
http://www.thebrokeagent.com/wtf-listing-description-of-the-week/
$ git reset —soft HEAD^
$ git commit -a -m ‘foo’
$ git push origin master -f
Secrets in Github Actions
Setting -> Secrets in left sidebar
main.workflow
action "Remote ssh commands" {
uses = "appleboy/ssh-action@master"
secrets = [
"HOST",
"PASSWORD",
]
args = [
"--user", "actions",
"--script", "whoami",
]
}
What’s problem in Secrets?
Don’t support
organization secrets
duplicate of secrets in many repository of organization
Don’t support
thirty party
secret service
You need to write
CLI flag in command
drone-ssh -u foo -p foopass -s whoami
drone-ssh -u bar -p barpass -s whoami
main.workflow
secrets = [ secrets = [
"PASSWORD", "PASSWORD",
] ]
args = [ args = [
"--user", "actions", "--user", "actions",
"--script", "whoami", "--script", "whoami",
] ]
main.workflow
secrets = [ secrets = [
"PASSWORD01", "PASSWORD02",
] ]
args = [ args = [
"-p", "$PASSWORD01", "-p", "$PASSWORD02",
"--script", "whoami", "--script", "whoami",
] ]
action "Publish" {
needs = "Tag"
uses = "actions/npm@master"
args = "publish --access public"
secrets = ["NPM_AUTH_TOKEN"]
}
How to add multiple
auth token
of npm registry?
kind: pipeline
name: default
steps:
- name: build
image: appleboy/drone-ssh
environment:
USERNAME:
from_secret: username
PASSWORD:
from_secret: password
Creating GitHub Actions
|-- ssh-action (repository)
| |__ .github
| |__ main.workflow
| |__ Dockerfile
| |__ entrypoint.sh
| |__ README.md
| |__ LICENSE
Support any language you want
Dockerfile
FROM appleboy/drone-ssh:1.5.0-linux-amd64
# Github labels
LABEL "com.github.actions.name"="SSH Commands"
LABEL "com.github.actions.description"="some description"
LABEL "com.github.actions.icon"="terminal"
LABEL “com.github.actions.color"="gray-dark"
LABEL "repository"="https://github.com/appleboy/ssh-action"
LABEL "homepage"="https://github.com/appleboy"
LABEL "maintainer"="Bo-Yi Wu <appleboy.tw@gmail.com>"
LABEL "version"="0.0.1"
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/sh
set -eu
export GITHUB="true"
sh -c "/bin/drone-ssh $*"
action "Tag Docker Image" {
needs = ["build"]
uses = "actions/docker/cli@master"
args = "tag hello:$GITHUB_SHA"
}
action "Tag Docker Image" {
needs = ["build"]
uses = "actions/docker/cli@master"
args = ["tag", "hello:$GITHUB_SHA"]
}
Environment variables
action "Hello World" {
uses = "./my-action"
env = {
FIRST_NAME = "Mona"
MIDDLE_NAME = "Lisa"
LAST_NAME = "Octocat"
}
}
runtime environment
GitHub Variable
• GITHUB_WORKFLOW
• GITHUB_ACTION
• GITHUB_EVNETNAME
• GITHUB_SHA
• GITHUB_REF
I don’t know how to
get the author
email, name or
commit message
Publishing your action
in the GitHub Marketplace
FROM appleboy/drone-ssh:1.5.0-linux-amd64
# Github labels
LABEL "com.github.actions.name"="SSH Commands"
LABEL "com.github.actions.description"="some description"
LABEL "com.github.actions.icon"="terminal"
LABEL “com.github.actions.color"="gray-dark"
LABEL "repository"="https://github.com/appleboy/ssh-action"
LABEL "homepage"="https://github.com/appleboy"
LABEL "maintainer"="Bo-Yi Wu <appleboy.tw@gmail.com>"
LABEL "version"="0.0.1"
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Create New Tag and
Publish Release
Some action I created
• appleboy/ssh-action
• appleboy/scp-action
• appleboy/facebook-action
• appleboy/telegram-action
• appleboy/jenkins-action
• appleboy/gitlab-ci-ation
• appleboy/discord-action
Thank You