Skip to content

Commit fc10a02

Browse files
author
ryantiffany
committed
initial commit
0 parents  commit fc10a02

File tree

3 files changed

+319
-0
lines changed

3 files changed

+319
-0
lines changed

LICENSE

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
MIT License
2+
3+
Copyright (c) 2023 skywalkeretw
4+
5+
Permission is hereby granted, free of charge, to any person obtaining a copy
6+
of this software and associated documentation files (the "Software"), to deal
7+
in the Software without restriction, including without limitation the rights
8+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+
copies of the Software, and to permit persons to whom the Software is
10+
furnished to do so, subject to the following conditions:
11+
12+
The above copyright notice and this permission notice shall be included in all
13+
copies or substantial portions of the Software.
14+
15+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+
SOFTWARE.

README.md

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
# Code Engine Deploy GitHub Action
2+
3+
This GitHub Action allows you to Create or update Code Engine Apps, Jobs, and Functions in IBM Cloud.
4+
5+
It offers flexibility for different deployment types and provides various configuration options.
6+
7+
## Author
8+
9+
- Author: Ryan Tiffany
10+
11+
## Description
12+
13+
This action allows you to create or update IBM Cloud Code Engine workloads. It supports deploying applications, jobs, and functions and can be configured with the following inputs:
14+
15+
### Inputs
16+
17+
| Name | Required | Default Value |Description |
18+
|-----------------|----------|---------------|----------------------------------------------------------------|
19+
| `ibmcloud_api_key` || - | IBM Cloud API Key. Please store your IBM Cloud API key securely in your GitHub repository Secrets.|
20+
| `resource_group` || - | An IBM Cloud Resource Group, a logical container for organizing and managing related cloud resources.|
21+
| `code_engine_region` || - | The geographical area where your Code Engine project is located.|
22+
| `code_engine_project` || - | A Code Engine Project, grouping your Apps, Functions, and Jobs.|
23+
| `workload_type` || - | The type of workload to create or update (App, Function, Job). |
24+
| `workload_name` || - | The name of the App, Function, or Job.|
25+
| `function_runtime` || - | The runtime used for the Function. Currently supported `nodejs-18` and `python-3.11` see [IBM Code Engine Function Runtimes](https://cloud.ibm.com/docs/codeengine?topic=codeengine-fun-runtime) for more information.|
26+
| `build_source` || . | Path to the directory containing the source code.|
27+
| `workload_cpu` || - | CPU configuration for your workload. If not specified the Code Engine default is used. |
28+
| `workload_memory` || - | Memory configuration for your workload. If not specified the Code Engine default is used. |
29+
| `workload_port` || 8080 | Port configuration for your app workloads |
30+
31+
32+
## Usage
33+
34+
To use this action add it to your GitHub Actions workflow YAML file. Here are examples of how to create or update an App, Job, and Function:
35+
36+
37+
38+
```yaml
39+
name: Create or update workload in IBM Cloud Code Engine
40+
41+
on:
42+
push:
43+
branches:
44+
- main
45+
46+
env:
47+
CODE_ENGINE_REGION: "us-south"
48+
CODE_ENGINE_PROJECT: "Code Engine Project Name"
49+
WORKLOAD_NAME: "my-cool-app"
50+
51+
jobs:
52+
53+
code-engine-app:
54+
runs-on: ubuntu-latest
55+
steps:
56+
- name: Check out code
57+
uses: actions/checkout@v3
58+
59+
- name: Deploy Application to Code Engine
60+
uses: cloud-design-dev/ibmcloud-code-engine-github-action@v1
61+
with:
62+
ibmcloud_api_key: ${{ secrets.IBMCLOUD_API_KEY }}
63+
resource_group: 'Default'
64+
code_engine_region: ${{ env.CODE_ENGINE_REGION }}
65+
code_engine_project: ${{ env.CODE_ENGINE_PROJECT }}
66+
workload_type: 'app'
67+
workload_name: ${{ env.WORKLOAD_NAME }}
68+
workload_port: 8080
69+
build_source: './app-code'
70+
cpu: 1
71+
memory: 4G
72+
73+
code-engine-job:
74+
runs-on: ubuntu-latest
75+
steps:
76+
- name: Check out code
77+
uses: actions/checkout@v3
78+
79+
- name: Deploy Job to Code Engine
80+
uses: skywalkeretw/ibm-code-engine-github-action@v1
81+
with:
82+
ibmcloud_api_key: ${{ secrets.IBMCLOUD_API_KEY }}
83+
resource_group: 'Default'
84+
code_engine_region: ${{ env.CODE_ENGINE_REGION }}
85+
code_engine_project: ${{ env.CODE_ENGINE_PROJECT }}
86+
workload_type: 'job'
87+
workload_name: ${{ env.WORKLOAD_NAME }}
88+
build_source: './job-code'
89+
cpu: 1
90+
memory: 4G
91+
92+
code-engine-fn-js:
93+
runs-on: ubuntu-latest
94+
steps:
95+
- name: Check out code
96+
uses: actions/checkout@v3
97+
98+
- name: Deploy JavaScript Function to Code Engine
99+
uses: skywalkeretw/ibm-code-engine-github-action@v1
100+
with:
101+
ibmcloud_api_key: ${{ secrets.IBMCLOUD_API_KEY }}
102+
resource_group: 'Default'
103+
code_engine_region: ${{ env.CODE_ENGINE_REGION }}
104+
code_engine_project: ${{ env.CODE_ENGINE_PROJECT }}
105+
workload_type: 'fn'
106+
function_runtime: 'nodejs-18'
107+
workload_name: ${{ env.WORKLOAD_NAME }}
108+
build_source: './fn-js-code'
109+
cpu: 1
110+
memory: 4G
111+
112+
code-engine-fn-py:
113+
runs-on: ubuntu-latest
114+
steps:
115+
- name: Check out code
116+
uses: actions/checkout@v3
117+
118+
- name: Deploy JavaScript Function to Code Engine
119+
uses: skywalkeretw/ibm-code-engine-github-action@v1
120+
with:
121+
ibmcloud_api_key: ${{ secrets.IBMCLOUD_API_KEY }}
122+
resource_group: 'Default'
123+
code_engine_region: ${{ env.CODE_ENGINE_REGION }}
124+
code_engine_project: ${{ env.CODE_ENGINE_PROJECT }}
125+
workload_type: 'fn'
126+
function_runtime: 'python-3.11'
127+
workload_name: ${{ env.WORKLOAD_NAME }}
128+
build_source: './fn-python-code'
129+
cpu: 1
130+
memory: 4G
131+
132+
```
133+
134+
This action is not officially endorsed by IBM Cloud but can be used as a community-contributed GitHub Action.

action.yml

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
name: Code Engine Create or Update
2+
description: Github action to create or update Apps, Jobs and Functions in IBM Cloud Code Engine
3+
author: Ryan Tiffany
4+
5+
branding:
6+
icon: cloud
7+
color: blue
8+
9+
inputs:
10+
ibmcloud_api_key:
11+
description: IBM Cloud API Key with IAM permissions to create and manage Code Engine resources.
12+
required: true
13+
14+
resource_group:
15+
description: The IBM Cloud Resource Group associated with the Code Engine project.
16+
required: false
17+
default: Default
18+
19+
code_engine_region:
20+
description: The Region where the Code Engine project is located.
21+
required: true
22+
23+
code_engine_project:
24+
description: The name of the Code Engine Project where the workload is deployed.
25+
required: true
26+
27+
# App, Function or Job Specific inputs
28+
workload_type:
29+
description: The code engine workload type that should be created or updated [App, Function, Job]
30+
required: true
31+
32+
workload_name:
33+
description: Name of the App, Function or Job
34+
required: true
35+
36+
function_runtime:
37+
description: Runtime used for the function workload_type
38+
required: false
39+
40+
build_source:
41+
description: Build source path for workload.
42+
required: false
43+
default: .
44+
45+
workload_cpu:
46+
description: CPU configuration set for the workload. If not set default Code Engine values are used.
47+
required: false
48+
49+
workload_memory:
50+
description: Memory configuration set for the workload. If not set default Code Engine values are used.
51+
required: false
52+
53+
workload_port:
54+
description: Port configuration set for the app workload_type. If not set default Code Engine values are used.
55+
required: false
56+
default: "8080"
57+
58+
# Github action code
59+
runs:
60+
using: composite
61+
62+
steps:
63+
# Default steps required
64+
- name: Install IBM Cloud CLI
65+
shell: bash
66+
run: curl -fsSL https://clis.cloud.ibm.com/install/linux | sh
67+
68+
- name: Login to IBM Cloud And target Resouce Groupe and Region
69+
shell: bash
70+
run: ibmcloud login --apikey ${{ inputs.ibmcloud_api_key }} -r ${{ inputs.code_engine_region }} -g ${{ inputs.resource_group }}
71+
72+
- name: Install Code Engine Plugin
73+
shell: bash
74+
run: ibmcloud plugin install code-engine
75+
76+
# Select the project using Name or ID
77+
# If the project doesn`t exist , it will be created project with the provided `code_engine_project` name
78+
- name: Select Code Engine Project
79+
shell: bash
80+
run: |
81+
if ibmcloud ce project select --name ${{ inputs.code_engine_project }} || ibmcloud ce project select --id ${{ inputs.code_engine_project }} ; then
82+
echo "Project Selected"
83+
else
84+
ibmcloud ce project create --name ${{ inputs.code_engine_project }}
85+
fi
86+
87+
# set resources for target
88+
- name: Set resources
89+
id: set-resources
90+
shell: bash
91+
run: |
92+
# set the CPU value
93+
if [[ "${{ inputs.workload_cpu }}" != "" ]] ; then
94+
echo "cpu=--cpu ${{ inputs.workload_cpu }}" >> "$GITHUB_OUTPUT"
95+
else
96+
echo "cpu=" >> "$GITHUB_OUTPUT"
97+
fi
98+
99+
# set the memory value
100+
if [[ "${{ inputs.workload_memory }}" != "" ]] ; then
101+
echo "memory=--memory ${{ inputs.workload_memory }}" >> "$GITHUB_OUTPUT"
102+
else
103+
echo "memory=" >> "$GITHUB_OUTPUT"
104+
fi
105+
106+
# Functions Steps
107+
- name: Create or Update Functions
108+
shell: bash
109+
id: fn-create
110+
if: ( inputs.entity == 'function' || inputs.entity == 'func' || inputs.entity == 'fn' )
111+
run: |
112+
113+
if ibmcloud ce fn get --name ${{ inputs.workload_name }} ; then
114+
ibmcloud ce fn update --name ${{ inputs.workload_name }} --runtime ${{ inputs.function_runtime }} --build-source ${{ inputs.build_source }} ${{ steps.set-resources.outputs.cpu }} ${{ steps.set-resources.outputs.memory }}
115+
else
116+
ibmcloud ce fn create --name ${{ inputs.workload_name }} --runtime ${{ inputs.function_runtime }} --build-source ${{ inputs.build_source }} ${{ steps.set-resources.outputs.cpu }} ${{ steps.set-resources.outputs.memory }}
117+
fi
118+
119+
# Application Steps
120+
- name: Create or Update Application
121+
shell: bash
122+
id: create-app
123+
if: ( inputs.entity == 'application' || inputs.entity == 'app' )
124+
run: |
125+
126+
if ibmcloud ce application get --name ${{ inputs.workload_name }} ; then
127+
ibmcloud ce application update --name ${{ inputs.workload_name }} --build-source ${{ inputs.build_source }} ${{ steps.set-resources.outputs.cpu }} ${{ steps.set-resources.outputs.memory }}
128+
else
129+
ibmcloud ce application create --name ${{ inputs.workload_name }} --build-source ${{ inputs.build_source }} ${{ steps.set-resources.outputs.cpu }} ${{ steps.set-resources.outputs.memory }}
130+
fi
131+
132+
# Job Steps
133+
- name: Create or Update Job
134+
shell: bash
135+
id: create-job
136+
if: inputs.entity == 'job'
137+
run: |
138+
139+
if ibmcloud ce job get --name ${{ inputs.workload_name }} ; then
140+
ibmcloud ce job update --name ${{ inputs.workload_name }} --build-source ${{ inputs.build_source }} --wait ${{ steps.set-resources.outputs.cpu }} ${{ steps.set-resources.outputs.memory }}
141+
else
142+
ibmcloud ce job create --name ${{ inputs.workload_name }} --build-source ${{ inputs.build_source }} --wait ${{ steps.set-resources.outputs.cpu }} ${{ steps.set-resources.outputs.memory }}
143+
fi
144+
145+
- name: Get entity
146+
shell: bash
147+
if: steps.fn-create.outcome == 'success' || steps.app-create.outcome == 'success' || steps.job-create.outcome == 'success'
148+
run: |
149+
case ${{ inputs.entity }} in
150+
function|func|fn)
151+
ibmcloud ce fn get --name ${{ inputs.workload_name }}
152+
;;
153+
application|app)
154+
ibmcloud ce app get --name ${{ inputs.workload_name }}
155+
;;
156+
job)
157+
ibmcloud ce job get --name ${{ inputs.workload_name }}
158+
;;
159+
*)
160+
echo "Wrong Code Engine Entity used!"
161+
echo "Use[ function | func | fn | application | app | job ]"
162+
exit 1
163+
;;
164+
esac

0 commit comments

Comments
 (0)